package modules.user; import com.alibaba.fastjson.JSONObject; import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.Db; import common.jfinal.AppConfig; import common.model.User; import common.utils.bsn.BsnSDK; import common.utils.http.MyRet; import common.utils.hyg.HygSDK; import java.util.List; public class UserService { public String hello() { return "Hello User"; } public MyRet saveUser(User user) { if (isUserExists(user.getStr("mobile_number"))) { return MyRet.fail("手机号已被注册。"); } // 最终保存逻辑 if (!user.save()) { return MyRet.fail("注册失败,请联系客服。"); } // 生成Bsn地址 try { JSONObject response = BsnSDK.createChainAccount("DLTBH_" + user.getId() + "_" + user.getCreateTime()); if (response.getInteger("code") == -1) { throw new RuntimeException("地址创建失败:" + response); } JSONObject data = response.getJSONObject("data"); String address = data.getString("opbChainClientAddress"); if (StrKit.isBlank(address)) { throw new RuntimeException("地址创建成功,但获取失败:" + data); } user.setBsnAccountAddress(address); if (user.update()) { return MyRet.ok("注册成功。"); } else { throw new RuntimeException("地址生成获取成功,但更新给用户失败"); } } catch (Exception e) { String msg = "注册成功,但是BSN地址生成失败:" + e.getMessage() + ", 请联系客服处理。"; return MyRet.fail(msg); } } public MyRet login(String mobileNumber, String pwdMd5Md5) { String findSQL = "select id, nickname, mobile_number, role, referrer_id, integral, create_time, update_time, is_deleted from t_user where " + "mobile_number = ? and pwd_md5_md5=?"; User u = User.dao.findFirst(findSQL, mobileNumber, pwdMd5Md5); if (u == null) { return MyRet.fail("登录失败,密码错误。"); } else { return MyRet.ok("登录成功。").setData(u); } } public MyRet verifyCodeLogin(String mobileNumber) { User u = findUserByMobileNumber(mobileNumber); if (u == null) { return MyRet.fail("验证码登录失败,违规操作将封禁ip。"); } else { return MyRet.ok("登录成功。").setData(u); } } public void updateUserLoginTime(String mobileNumber) { String sql = "update t_user set login_time = ? where mobile_number = ?"; Db.update(sql, System.currentTimeMillis(), mobileNumber); } public void updateToken(String mobileNumber, String token) { String sql = "update t_user set token = ? where mobile_number = ?"; Db.update(sql, token, mobileNumber); } public String findMobileNumberByToken(String token) { String sql = "select mobile_number from t_user where token = ?"; return Db.queryStr(sql, token); } public String findWorkidByToken(String token) { String sql = "select workid from t_user where token = ?"; return Db.queryStr(sql, token); } public User findUserById(String id) { String sql = "select * from t_user where id = ?"; return User.dao.findFirst(sql, id); } public User findUserByMobileNumber(String MobileNumber) { //, hyg_sign_rst 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"; String sql = "select " + columns + " from t_user where mobile_number = ?"; return User.dao.findFirst(sql, MobileNumber); } public User findUserByBankCard(String bankCard) { //, hyg_sign_rst String columns = "id, balance"; String sql = "select " + columns + " from t_user where hyg_bank_card = ?"; return User.dao.findFirst(sql, bankCard); } public boolean isUserExists(String mobileNumber) { return Db.queryLong("SELECT COUNT(1) FROM t_user WHERE mobile_number = ?", mobileNumber) > 0; } public void flushHygWorkerDetails(User user) { // 从慧用工处取得银行卡号,否则会导致充值信息无法匹配 if (StrKit.notBlank(user.getHygWorkerId()) && StrKit.isBlank(user.getHygBankCard())) { try { JSONObject hygWorkerDetails = HygSDK.findWorkerDetails(user.getHygWorkerId()); user.setHygWorkerDetails(hygWorkerDetails.toJSONString()); user.update(); // 首先保证接口调用成功 if (hygWorkerDetails.getString("statusCode").equals("000000")) { JSONObject data = hygWorkerDetails.getJSONObject("data"); user.setHygBankCard(data.getString("bankCardNo")); user.update(); } } catch (Exception e) { AppConfig.LOGGER.error("慧用工接口调取错误:" + e.getMessage()); } } } public Integer count(String keywords) { String searchKeyWord = "%" + keywords + "%"; String sql = "SELECT COUNT(1) FROM t_user"; String whereClause = " where id like ? or nickname like ? or mobile_number like ?"; if (StrKit.isBlank(keywords)) { return Db.queryInt(sql); } else { return Db.queryInt(sql + whereClause, searchKeyWord, searchKeyWord, searchKeyWord); } } public List users(int pageNumber, int pageSize, String keywords) { // limit 的第一个参数是偏移量,第二个参数是查询数量 // 正确的 limit 是 LIMIT offset, count // offset = (pageNumber - 1) * pageSize // count = pageSize int offset = (pageNumber - 1) * pageSize; String searchKeyWord = "%" + keywords + "%"; String columns = "id, nickname, mobile_number, role, referrer_id, integral, login_time, create_time, update_time, is_deleted"; // SQL 语句构建修正 // 基础 SQL 部分:SELECT ... FROM ... ORDER BY ... LIMIT String baseSql = "select " + columns + " from t_user order by login_time desc limit ?, ?"; // 包含搜索条件的 WHERE 子句 String whereClause = " where id like ? or nickname like ? or mobile_number like ?"; // 注意 id 的模糊查询 // 如果没有关键词,只使用基础 SQL if (StrKit.isBlank(keywords)) { return User.dao.find(baseSql, offset, pageSize); } else { // 如果有关键词,将 WHERE 子句插入到 ORDER BY 前面 // 完整的 SQL 结构应该是:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT String fullSql = "select " + columns + " from t_user " + whereClause + " order by login_time desc limit ?, ?"; // 参数顺序:先是 WHERE 子句的参数,然后是 LIMIT 的参数 return User.dao.find(fullSql, searchKeyWord, searchKeyWord, searchKeyWord, offset, pageSize); } } }