UserService.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package modules.user;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.jfinal.kit.StrKit;
  4. import com.jfinal.plugin.activerecord.Db;
  5. import common.jfinal.AppConfig;
  6. import common.model.User;
  7. import common.utils.bsn.BsnSDK;
  8. import common.utils.http.MyRet;
  9. import common.utils.hyg.HygSDK;
  10. import java.util.List;
  11. public class UserService {
  12. public String hello() {
  13. return "Hello User";
  14. }
  15. public MyRet saveUser(User user) {
  16. if (isUserExists(user.getStr("mobile_number"))) {
  17. return MyRet.fail("手机号已被注册。");
  18. }
  19. // 最终保存逻辑
  20. if (!user.save()) {
  21. return MyRet.fail("注册失败,请联系客服。");
  22. }
  23. // 生成Bsn地址
  24. try {
  25. JSONObject response = BsnSDK.createChainAccount("DLTBH_" + user.getId() + "_" + user.getCreateTime());
  26. if (response.getInteger("code") == -1) {
  27. throw new RuntimeException("地址创建失败:" + response);
  28. }
  29. JSONObject data = response.getJSONObject("data");
  30. String address = data.getString("opbChainClientAddress");
  31. if (StrKit.isBlank(address)) {
  32. throw new RuntimeException("地址创建成功,但获取失败:" + data);
  33. }
  34. user.setBsnAccountAddress(address);
  35. if (user.update()) {
  36. return MyRet.ok("注册成功。");
  37. } else {
  38. throw new RuntimeException("地址生成获取成功,但更新给用户失败");
  39. }
  40. } catch (Exception e) {
  41. String msg = "注册成功,但是BSN地址生成失败:" + e.getMessage() + ", 请联系客服处理。";
  42. return MyRet.fail(msg);
  43. }
  44. }
  45. public MyRet login(String mobileNumber, String pwdMd5Md5) {
  46. String findSQL = "select id, nickname, mobile_number, role, referrer_id, integral, create_time, update_time, is_deleted from t_user where "
  47. + "mobile_number = ? and pwd_md5_md5=?";
  48. User u = User.dao.findFirst(findSQL, mobileNumber, pwdMd5Md5);
  49. if (u == null) {
  50. return MyRet.fail("登录失败,密码错误。");
  51. } else {
  52. return MyRet.ok("登录成功。").setData(u);
  53. }
  54. }
  55. public MyRet verifyCodeLogin(String mobileNumber) {
  56. User u = findUserByMobileNumber(mobileNumber);
  57. if (u == null) {
  58. return MyRet.fail("验证码登录失败,违规操作将封禁ip。");
  59. } else {
  60. return MyRet.ok("登录成功。").setData(u);
  61. }
  62. }
  63. public void updateUserLoginTime(String mobileNumber) {
  64. String sql = "update t_user set login_time = ? where mobile_number = ?";
  65. Db.update(sql, System.currentTimeMillis(), mobileNumber);
  66. }
  67. public void updateToken(String mobileNumber, String token) {
  68. String sql = "update t_user set token = ? where mobile_number = ?";
  69. Db.update(sql, token, mobileNumber);
  70. }
  71. public String findMobileNumberByToken(String token) {
  72. String sql = "select mobile_number from t_user where token = ?";
  73. return Db.queryStr(sql, token);
  74. }
  75. public String findWorkidByToken(String token) {
  76. String sql = "select workid from t_user where token = ?";
  77. return Db.queryStr(sql, token);
  78. }
  79. public User findUserById(String id) {
  80. String sql = "select * from t_user where id = ?";
  81. return User.dao.findFirst(sql, id);
  82. }
  83. public User findUserByMobileNumber(String MobileNumber) {
  84. //, hyg_sign_rst
  85. String columns = "id, nickname, mobile_number, role, referrer_id, balance, integral, login_time, hyg_worker_id, hyg_worker_details, hyg_bank_card, create_time, update_time, is_deleted";
  86. String sql = "select " + columns + " from t_user where mobile_number = ?";
  87. return User.dao.findFirst(sql, MobileNumber);
  88. }
  89. public User findUserByBankCard(String bankCard) {
  90. //, hyg_sign_rst
  91. String columns = "id, balance";
  92. String sql = "select " + columns + " from t_user where hyg_bank_card = ?";
  93. return User.dao.findFirst(sql, bankCard);
  94. }
  95. public boolean isUserExists(String mobileNumber) {
  96. return Db.queryLong("SELECT COUNT(1) FROM t_user WHERE mobile_number = ?", mobileNumber) > 0;
  97. }
  98. public void flushHygWorkerDetails(User user) {
  99. // 从慧用工处取得银行卡号,否则会导致充值信息无法匹配
  100. if (StrKit.notBlank(user.getHygWorkerId()) && StrKit.isBlank(user.getHygBankCard())) {
  101. try {
  102. JSONObject hygWorkerDetails = HygSDK.findWorkerDetails(user.getHygWorkerId());
  103. user.setHygWorkerDetails(hygWorkerDetails.toJSONString());
  104. user.update();
  105. // 首先保证接口调用成功
  106. if (hygWorkerDetails.getString("statusCode").equals("000000")) {
  107. JSONObject data = hygWorkerDetails.getJSONObject("data");
  108. user.setHygBankCard(data.getString("bankCardNo"));
  109. user.update();
  110. }
  111. } catch (Exception e) {
  112. AppConfig.LOGGER.error("慧用工接口调取错误:" + e.getMessage());
  113. }
  114. }
  115. }
  116. public Integer count(String keywords) {
  117. String searchKeyWord = "%" + keywords + "%";
  118. String sql = "SELECT COUNT(1) FROM t_user";
  119. String whereClause = " where id like ? or nickname like ? or mobile_number like ?";
  120. if (StrKit.isBlank(keywords)) {
  121. return Db.queryInt(sql);
  122. } else {
  123. return Db.queryInt(sql + whereClause, searchKeyWord, searchKeyWord, searchKeyWord);
  124. }
  125. }
  126. public List<User> users(int pageNumber, int pageSize, String keywords) {
  127. // limit 的第一个参数是偏移量,第二个参数是查询数量
  128. // 正确的 limit 是 LIMIT offset, count
  129. // offset = (pageNumber - 1) * pageSize
  130. // count = pageSize
  131. int offset = (pageNumber - 1) * pageSize;
  132. String searchKeyWord = "%" + keywords + "%";
  133. String columns = "id, nickname, mobile_number, role, referrer_id, integral, login_time, create_time, update_time, is_deleted";
  134. // SQL 语句构建修正
  135. // 基础 SQL 部分:SELECT ... FROM ... ORDER BY ... LIMIT
  136. String baseSql = "select " + columns + " from t_user order by login_time desc limit ?, ?";
  137. // 包含搜索条件的 WHERE 子句
  138. String whereClause = " where id like ? or nickname like ? or mobile_number like ?"; // 注意 id 的模糊查询
  139. // 如果没有关键词,只使用基础 SQL
  140. if (StrKit.isBlank(keywords)) {
  141. return User.dao.find(baseSql, offset, pageSize);
  142. } else {
  143. // 如果有关键词,将 WHERE 子句插入到 ORDER BY 前面
  144. // 完整的 SQL 结构应该是:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT
  145. String fullSql = "select " + columns + " from t_user " + whereClause + " order by login_time desc limit ?, ?";
  146. // 参数顺序:先是 WHERE 子句的参数,然后是 LIMIT 的参数
  147. return User.dao.find(fullSql, searchKeyWord, searchKeyWord, searchKeyWord, offset, pageSize);
  148. }
  149. }
  150. }