diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java index 4155ae2..bc32a4d 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/Ab98UserController.java @@ -5,6 +5,9 @@ import com.agileboot.common.core.base.BaseController; import com.agileboot.common.core.dto.ResponseDTO; import com.agileboot.common.core.page.PageDTO; import com.agileboot.common.enums.common.BusinessTypeEnum; +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.ab98.user.command.BindQyUserCommand; import com.agileboot.domain.ab98.user.dto.Ab98UserDetailDTO; import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.ab98.user.Ab98UserApplicationService; @@ -17,6 +20,7 @@ import io.swagger.v3.oas.annotations.Operation; import java.util.List; import javax.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -73,4 +77,15 @@ public class Ab98UserController extends BaseController { userApplicationService.deleteUser(new BulkOperationCommand<>(ids)); return ResponseDTO.ok(); } + + @Operation(summary = "绑定汇邦云") + @AccessLog(title = "ab98用户管理", businessType = BusinessTypeEnum.MODIFY) + @PostMapping("/bindQyUser") + public ResponseDTO bindQyUser(@RequestBody BindQyUserCommand command) { + if (command == null || command.getQyUserId() == null || StringUtils.isBlank(command.getName()) || StringUtils.isBlank(command.getIdNum())) { + return ResponseDTO.fail(new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "参数错误")); + } + userApplicationService.bindQyUser(command); + return ResponseDTO.ok(); + } } \ No newline at end of file diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java index 3c99a70..9d22af8 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java @@ -13,6 +13,10 @@ import com.agileboot.domain.common.dto.CurrentLoginUserDTO; import com.agileboot.domain.common.dto.TokenDTO; import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService; import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity; +import com.agileboot.domain.qywx.user.QyUserApplicationService; +import com.agileboot.domain.qywx.user.dto.QyUserDTO; +import com.agileboot.domain.qywx.userQySys.SysUserQyUserApplicationService; +import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserEntity; import com.agileboot.domain.system.menu.MenuApplicationService; import com.agileboot.domain.system.menu.dto.RouterDTO; import com.agileboot.domain.system.user.UserApplicationService; @@ -63,6 +67,10 @@ public class LoginController { private final AccessTokenApplicationService accessTokenApplicationService; + private final SysUserQyUserApplicationService sysUserQyUserApplicationService; + + private final QyUserApplicationService qyUserApplicationService; + /** * 访问首页,提示语 */ @@ -114,7 +122,13 @@ public class LoginController { SystemLoginUser loginUser = AuthenticationUtils.getSystemLoginUser(); CurrentLoginUserDTO currentUserDTO = userApplicationService.getLoginUserInfo(loginUser); - return ResponseDTO.ok(new TokenDTO(token, currentUserDTO)); + SysUserQyUserEntity sysUserQyUser = sysUserQyUserApplicationService.getBySysUserId(loginUser.getUserId()); + QyUserDTO qyUserDTO = null; + if (sysUserQyUser != null) { + qyUserDTO = qyUserApplicationService.getQyUserDetail(Long.valueOf(sysUserQyUser.getQyUserId())); + } + + return ResponseDTO.ok(new TokenDTO(token, currentUserDTO, qyUserDTO)); } /** diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java index ccbfd31..31b1615 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/PaymentController.java @@ -198,7 +198,7 @@ public class PaymentController { OpenidResponse openidResponse = QywxApiUtil.convertToOpenid(qyAccessToken.getAccessToken(), userid); - QyUserEntity qyUserEntity = qyUserApplicationService.getUserByUserId(userid, corpid); + QyUserEntity qyUserEntity = qyUserApplicationService.getUserByUserIdAndCorpid(userid, corpid); return ResponseDTO.ok(new QyLoginDTO(userid, openidResponse.getOpenid(), isCabinetAdmin, qyUserEntity.getName())); } catch (RestClientException e) { @@ -246,7 +246,7 @@ public class PaymentController { } QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, corpid); UserIdResponse userIdResponse = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), openid); - QyUserEntity qyUser = qyUserApplicationService.getUserByUserId(userIdResponse.getUserid(), corpid); + QyUserEntity qyUser = qyUserApplicationService.getUserByUserIdAndCorpid(userIdResponse.getUserid(), corpid); if (qyUser == null) { continue; } @@ -283,7 +283,7 @@ public class PaymentController { */ @GetMapping("/getBalanceByQyUserid") public ResponseDTO getBalanceByQyUserid(@RequestParam String corpid, @RequestParam String userid) { - QyUserEntity qyUser = qyUserApplicationService.getUserByUserId(userid, corpid); + QyUserEntity qyUser = qyUserApplicationService.getUserByUserIdAndCorpid(userid, corpid); // 创建响应对象(假设GetBalanceResponse包含balance字段) GetBalanceResponse response = new GetBalanceResponse( diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/WxLoginController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/WxLoginController.java index 5a6d458..b84e124 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/WxLoginController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/WxLoginController.java @@ -98,16 +98,17 @@ public class WxLoginController { data.setRegistered(loginResponse.getOutputData().isRegistered()); data.setTel(loginResponse.getOutputData().getTel()); + Long ab98UserId = null; try { - qyUserApplicationService.saveQyUserInfoByAb98(userid, loginResponse.getOutputData(), null); + ab98UserId = ab98UserApplicationService.saveAb98User(openid, loginResponse.getOutputData()); } catch (Exception e) { - log.error("保存汇邦云用户信息到企业用户失败: ", e); + log.error("保存汇邦云用户信息失败: ", e); } try { - ab98UserApplicationService.saveAb98User(openid, loginResponse.getOutputData()); + qyUserApplicationService.saveQyUserInfoByAb98(ab98UserId, userid, loginResponse.getOutputData(), null); } catch (Exception e) { - log.error("保存汇邦云用户信息失败: ", e); + log.error("保存汇邦云用户信息到企业用户失败: ", e); } return ResponseDTO.ok(data); @@ -136,16 +137,17 @@ public class WxLoginController { data.setRegistered(true); data.setTel(loginUserinfo.getPhone()); + Long ab98UserId = null; try { - qyUserApplicationService.saveQyUserInfoByAb98(userid, null, loginUserinfo); + ab98UserId = ab98UserApplicationService.saveAb98UserByToken(openid, loginUserinfo); } catch (Exception e) { - log.error("保存汇邦云用户信息到企业用户失败: ", e); + log.error("保存汇邦云用户信息失败: ", e); } try { - ab98UserApplicationService.saveAb98UserByToken(openid, loginUserinfo); + qyUserApplicationService.saveQyUserInfoByAb98(ab98UserId, userid, null, loginUserinfo); } catch (Exception e) { - log.error("保存汇邦云用户信息失败: ", e); + log.error("保存汇邦云用户信息到企业用户失败: ", e); } return ResponseDTO.ok(data); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98ApiUtil.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98ApiUtil.java index 1cf19a7..d580f87 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98ApiUtil.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98ApiUtil.java @@ -179,6 +179,40 @@ public class Ab98ApiUtil { return null; } + /** + * 拉取用户信息 + * @param appname + * @param appsecret + * @param idnum + * @return + */ + public static Ab98UserDto pullUserInfoByIdnum(String appname, + String appsecret, + String idnum) { + String sign = DigestUtils.md5Hex(String.format("app=%s&idnum=%s&name=&tel=%s", appname, idnum, appsecret)); + String url = String.format("https://www.ab98.cn/api/pull?idnum=%s&app=%s&sign=%s" + ,idnum + ,appname + ,sign); + + String res = HttpUtil.get(url); + try { + JSONObject o = JSONUtil.parseObj(res); + String state = o.getStr("state"); + if (StringUtils.equalsIgnoreCase(state, "ok")) { + return o.get("user", Ab98UserDto.class); + } + } catch (Exception e) { + log.error("获取登录用户信息失败", e); + } + return null; + } + + public static void main(String[] args) { + Ab98UserDto userDto = pullUserInfoByIdnum("wxshop", "34164e41f0c6694be6bbbba0dc50c14a", "450981199505186050"); + log.info("拉取用户信息: {}", JSONUtil.toJsonStr(userDto)); + } + // 基础响应对象 @Data public static class BaseResponse { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98UserDto.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98UserDto.java new file mode 100644 index 0000000..0785102 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/api/Ab98UserDto.java @@ -0,0 +1,133 @@ +package com.agileboot.domain.ab98.api; + +import lombok.Data; + +@Data +public class Ab98UserDto { + /** + * 统一系统的记录ID + */ + private String ssoUid; + /** + * 真实姓名 + */ + private String realName; + /** + * 性别:男 女 + */ + private String sex; + /** + * 手机号码 + */ + private String phone; + /** + * 在统一登录平台绑定的药小云公众号openid + */ + private String openid; + /** + * 微信昵称 + */ + private String nickname; + /** + * 微信头像 + */ + private String headimage; + /** + * 身份证地址 + */ + private String idCardAddress; + /** + * 身份证号 + */ + private String idCardNo; + /** + * 签发机关 + */ + private String authority; + /** + * 有效期 + */ + private String validdate; + /** + * 身份证正面图像链接 + */ + private String idCardFront; + /** + * 身份证背面图像链接 + */ + private String idCardBack; + /** + * 人脸图像链接 + */ + private String facePicture; + /** + * 营业执照图片链接 + */ + private String businessLicense; + /** + * 统一社会信用代码(三合一之前为注册号) + */ + private String regNum; + /** + * 公司名称 + */ + private String companyName; + /** + * 注册资本 + */ + private String capital; + /** + * 法定代表人 + */ + private String person; + /** + * 注册地址 + */ + private String address; + /** + * 民族 + */ + private String nation; + /** + * 经营范围 + */ + private String business; + /** + * 主体类型 + */ + private String type; + /** + * 营业期限 + */ + private String period; + /** + * 组成形式 + */ + private String composingForm; + /** + * 成立日期 + */ + private String setDate; + /** + * 门店图片链接 + */ + private String shopPicture; + /** + * 门店环境图片链接 + */ + private String environmentPicture; + /** + * 当前系统的门店老板的账号ID,此字段不为空时,表示门店老板添加员工 + */ + private String parentUserId; + /** + * 人脸特征的base64字符串 + */ + private String faceFeatureBase64; + + /** + * 人员角色:0-超级管理员 1-普通管理员 2-普通用户 + */ + private Integer role; + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java index 9f7f3c2..d8df828 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/Ab98UserApplicationService.java @@ -1,8 +1,12 @@ package com.agileboot.domain.ab98.user; import com.agileboot.common.core.page.PageDTO; +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.domain.ab98.api.Ab98ApiUtil; +import com.agileboot.domain.ab98.api.Ab98UserDto; import com.agileboot.domain.ab98.api.SsoLoginUserinfo; +import com.agileboot.domain.ab98.user.command.BindQyUserCommand; import com.agileboot.domain.ab98.user.dto.Ab98UserDetailDTO; import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.ab98.user.command.AddAb98UserCommand; @@ -13,12 +17,21 @@ import com.agileboot.domain.ab98.user.dto.Ab98UserDTO; import com.agileboot.domain.ab98.user.model.Ab98UserModel; import com.agileboot.domain.ab98.user.model.Ab98UserModelFactory; import com.agileboot.domain.ab98.user.query.SearchAb98UserQuery; +import com.agileboot.domain.qywx.user.db.QyUserEntity; +import com.agileboot.domain.qywx.user.db.QyUserService; +import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserEntity; +import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserService; +import com.agileboot.domain.system.user.db.SysUserEntity; +import com.agileboot.domain.system.user.db.SysUserService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @Service @@ -27,6 +40,9 @@ import org.springframework.stereotype.Service; public class Ab98UserApplicationService { private final Ab98UserService userService; private final Ab98UserModelFactory userModelFactory; + private final QyUserService qyUserService; + private final SysUserQyUserService sysUserQyUserService; + private final SysUserService sysUserService; public PageDTO getUserList(SearchAb98UserQuery query) { Page page = userService.getUserListWithTagFilter(query); @@ -74,8 +90,12 @@ public class Ab98UserApplicationService { } - public void saveAb98User(String openid, Ab98ApiUtil.LoginData loginData) { - Ab98UserEntity ab98UserEntity = userService.selectByOpenidAndUserid(openid, loginData.getUserid()); + public Long saveAb98User(String openid, Ab98ApiUtil.LoginData loginData) { +// Ab98UserEntity ab98UserEntity = userService.selectByOpenidAndUserid(openid, loginData.getUserid()); + if (loginData == null || StringUtils.isBlank(loginData.getIdnum())) { + return null; + } + Ab98UserEntity ab98UserEntity = userService.getByIdnum(loginData.getIdnum()); if (ab98UserEntity != null && StringUtils.equals(loginData.getName(), ab98UserEntity.getName()) ) { @@ -90,6 +110,7 @@ public class Ab98UserApplicationService { command.setAddress(loginData.getAddress()); command.setRegistered(loginData.isRegistered()); updateUser(command); + return ab98UserEntity.getAb98UserId(); } else { AddAb98UserCommand command = new AddAb98UserCommand(); command.setOpenid(openid); @@ -103,13 +124,22 @@ public class Ab98UserApplicationService { command.setFaceImg(loginData.getFace_img()); command.setAddress(loginData.getAddress()); command.setRegistered(loginData.isRegistered()); - addUser(command); + command.initBaseEntity(); + + Ab98UserModel model = userModelFactory.create(); + model.loadAddCommand(command); + model.insert(); + return model.getAb98UserId(); } } - public void saveAb98UserByToken(String openid, SsoLoginUserinfo loginUserinfo) { - Ab98UserEntity ab98UserEntity = userService.selectByOpenidAndUserid(openid, String.valueOf(loginUserinfo.getId())); + public Long saveAb98UserByToken(String openid, SsoLoginUserinfo loginUserinfo) { + if (loginUserinfo == null || StringUtils.isBlank(loginUserinfo.getIdCardNo())) { + return null; + } +// Ab98UserEntity ab98UserEntity = userService.selectByOpenidAndUserid(openid, String.valueOf(loginUserinfo.getId())); + Ab98UserEntity ab98UserEntity = userService.getByIdnum(loginUserinfo.getIdCardNo()); if (ab98UserEntity != null && StringUtils.equals(loginUserinfo.getName(), ab98UserEntity.getName()) ) { @@ -124,6 +154,7 @@ public class Ab98UserApplicationService { command.setAddress(loginUserinfo.getAddress()); command.setRegistered(true); updateUser(command); + return ab98UserEntity.getAb98UserId(); } else { AddAb98UserCommand command = new AddAb98UserCommand(); command.setOpenid(openid); @@ -137,7 +168,77 @@ public class Ab98UserApplicationService { command.setFaceImg(loginUserinfo.getFace()); command.setAddress(loginUserinfo.getAddress()); command.setRegistered(true); - addUser(command); + command.initBaseEntity(); + + Ab98UserModel model = userModelFactory.create(); + model.loadAddCommand(command); + model.insert(); + return model.getAb98UserId(); + } + } + + public void bindQyUser(BindQyUserCommand bindQyUserCommand) { + QyUserEntity qyUser = qyUserService.getById(bindQyUserCommand.getQyUserId()); + if (qyUser == null) { + throw new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "企业微信用户不存在"); + } + + Ab98UserEntity ab98UserEntity = userService.getByIdnum(bindQyUserCommand.getIdNum()); + if (ab98UserEntity != null && StringUtils.equals(ab98UserEntity.getName(), bindQyUserCommand.getName())) { + saveQyUserInfoByAb98(qyUser, ab98UserEntity); + return; + } + + Ab98UserDto ab98UserDto = Ab98ApiUtil.pullUserInfoByIdnum("wxshop", "34164e41f0c6694be6bbbba0dc50c14a", bindQyUserCommand.getIdNum()); + if (ab98UserDto == null) { + throw new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "Ab98用户不存在"); + } + + if (!StringUtils.equals(ab98UserDto.getRealName(), bindQyUserCommand.getName())) { + throw new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "姓名不匹配"); + } + AddAb98UserCommand addAb98UserCommand = getAddAb98UserCommand(ab98UserDto); + Ab98UserModel model = userModelFactory.create(); + model.loadAddCommand(addAb98UserCommand); + model.insert(); + saveQyUserInfoByAb98(qyUser, model.selectById()); + } + + @NotNull + private static AddAb98UserCommand getAddAb98UserCommand(Ab98UserDto ab98UserDto) { + AddAb98UserCommand addAb98UserCommand = new AddAb98UserCommand(); + addAb98UserCommand.setOpenid(ab98UserDto.getOpenid()); + addAb98UserCommand.setUserid(ab98UserDto.getSsoUid()); + addAb98UserCommand.setName(ab98UserDto.getRealName()); + addAb98UserCommand.setTel(ab98UserDto.getPhone()); + addAb98UserCommand.setSex(ab98UserDto.getSex()); + addAb98UserCommand.setIdnum(ab98UserDto.getIdCardNo()); + addAb98UserCommand.setIdcardFront(ab98UserDto.getIdCardFront()); + addAb98UserCommand.setIdcardBack(ab98UserDto.getIdCardBack()); + addAb98UserCommand.setFaceImg(ab98UserDto.getFacePicture()); + addAb98UserCommand.setAddress(ab98UserDto.getAddress()); + addAb98UserCommand.setRegistered(true); + addAb98UserCommand.initBaseEntity(); + return addAb98UserCommand; + } + + public void saveQyUserInfoByAb98(QyUserEntity qyUser, Ab98UserEntity ab98UserEntity) { + SysUserQyUserEntity sysUserQyUser = sysUserQyUserService.getByQyUserId(qyUser.getId()); + SysUserEntity sysUser = null; + if (sysUserQyUser != null) { + sysUser = sysUserService.getById(sysUserQyUser.getSysUserId()); + } + + qyUser.setAb98UserId(ab98UserEntity.getAb98UserId()); + qyUser.setAvatar(ab98UserEntity.getFaceImg()); + qyUser.setGender(ab98UserEntity.getSex()); + qyUser.setMobile(ab98UserEntity.getTel()); + qyUser.updateById(); + if (sysUser!= null) { + sysUser.setAvatar(ab98UserEntity.getFaceImg()); + sysUser.setSex(ab98UserEntity.getSex().contains("女") ? 0 : 1); + sysUser.setPhoneNumber(ab98UserEntity.getTel()); + sysUser.updateById(); } } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/BindQyUserCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/BindQyUserCommand.java new file mode 100644 index 0000000..b2c5b61 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/command/BindQyUserCommand.java @@ -0,0 +1,13 @@ +package com.agileboot.domain.ab98.user.command; + +import lombok.Data; + +@Data +public class BindQyUserCommand { + private Long qyUserId; + + private String name; + + private String idNum; + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java index 8eeea70..27664ed 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserService.java @@ -26,5 +26,7 @@ public interface Ab98UserService extends IService { Ab98UserEntity getByUserid(String userid); + Ab98UserEntity getByIdnum(String idnum); + Ab98UserEntity selectByOpenidAndUserid(String openid, String userid); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java index 1492c8b..7d1f719 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserServiceImpl.java @@ -2,6 +2,7 @@ package com.agileboot.domain.ab98.user.db; import com.agileboot.common.core.page.AbstractPageQuery; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -40,6 +41,14 @@ public class Ab98UserServiceImpl extends ServiceImpl wrapper = new QueryWrapper(); + wrapper.eq("idnum", idnum) + .last("LIMIT 1"); + return this.getOne(wrapper); + } + @Override public Ab98UserEntity selectByOpenidAndUserid(String openid, String userid) { return baseMapper.selectByOpenidAndUserid(openid, userid); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/common/dto/TokenDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/common/dto/TokenDTO.java index 7c204c8..bce85e5 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/common/dto/TokenDTO.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/common/dto/TokenDTO.java @@ -1,5 +1,6 @@ package com.agileboot.domain.common.dto; +import com.agileboot.domain.qywx.user.dto.QyUserDTO; import lombok.AllArgsConstructor; import lombok.Data; @@ -14,4 +15,5 @@ public class TokenDTO { private CurrentLoginUserDTO currentUser; + private QyUserDTO qyUser; } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/QyUserApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/QyUserApplicationService.java index ede561a..84e131d 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/QyUserApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/QyUserApplicationService.java @@ -4,6 +4,8 @@ import com.agileboot.common.constant.WeixinConstants; import com.agileboot.common.core.page.PageDTO; import com.agileboot.domain.ab98.api.Ab98ApiUtil; import com.agileboot.domain.ab98.api.SsoLoginUserinfo; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; +import com.agileboot.domain.ab98.user.db.Ab98UserService; import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.qywx.user.command.AddQyUserCommand; import com.agileboot.domain.qywx.user.command.UpdateQyUserCommand; @@ -39,6 +41,7 @@ public class QyUserApplicationService { private final SysUserQyUserService sysUserQyUserService; private final SysUserService sysUserService; private final SysRoleService sysRoleService; + private final Ab98UserService ab98UserService; public PageDTO getUserList(SearchQyUserQuery query) { Page page = userService.getUserList(query); @@ -60,6 +63,8 @@ public class QyUserApplicationService { dto.setRoleName(sysRole.getRoleName()); } } + Ab98UserEntity ab98User = ab98UserService.getById(user.getAb98UserId()); + dto.setOpenid(ab98User.getOpenid()); return dto; } @@ -99,43 +104,50 @@ public class QyUserApplicationService { } } - public QyUserEntity getUserByUserId(String userid, String corpid) { - return userService.getUserByUserId(userid, corpid); + public List getUserByUserId(String userid) { + return userService.getUserByUserId(userid); } - public void saveQyUserInfoByAb98(String userid, Ab98ApiUtil.LoginData data, SsoLoginUserinfo loginUserinfo) { - QyUserEntity qyUser = getUserByUserId(userid, WeixinConstants.corpid); - if (qyUser == null) { + public QyUserEntity getUserByUserIdAndCorpid(String userid, String corpid) { + return userService.getUserByUserIdAndCorpid(userid, corpid); + } + + public void saveQyUserInfoByAb98(Long ab98UserId, String userid, Ab98ApiUtil.LoginData data, SsoLoginUserinfo loginUserinfo) { + List qyUserList = getUserByUserId(userid); + if (qyUserList == null || qyUserList.isEmpty()) { log.error("saveQyUserInfoByAb98: user not found for userid: {}", userid); return; } - SysUserQyUserEntity sysUserQyUser = sysUserQyUserService.getByQyUserId(qyUser.getId()); - SysUserEntity sysUser = null; - if (sysUserQyUser != null) { - sysUser = sysUserService.getById(sysUserQyUser.getSysUserId()); - } - - if (data != null) { - qyUser.setAvatar(data.getFace_img()); - qyUser.setGender(data.getSex()); - qyUser.setMobile(data.getTel()); - qyUser.updateById(); - if (sysUser!= null) { - sysUser.setAvatar(data.getFace_img()); - sysUser.setSex(data.getSex().contains("女") ? 0 : 1); - sysUser.setPhoneNumber(data.getTel()); - sysUser.updateById(); + for (QyUserEntity qyUser : qyUserList) { + SysUserQyUserEntity sysUserQyUser = sysUserQyUserService.getByQyUserId(qyUser.getId()); + SysUserEntity sysUser = null; + if (sysUserQyUser != null) { + sysUser = sysUserService.getById(sysUserQyUser.getSysUserId()); } - } else if (loginUserinfo != null) { - qyUser.setAvatar(loginUserinfo.getFace()); - qyUser.setGender(loginUserinfo.getSex()); - qyUser.setMobile(loginUserinfo.getPhone()); - qyUser.updateById(); - if (sysUser!= null) { - sysUser.setAvatar(loginUserinfo.getFace()); - sysUser.setSex(loginUserinfo.getSex().contains("女")? 0 : 1); - sysUser.setPhoneNumber(loginUserinfo.getPhone()); - sysUser.updateById(); + + qyUser.setAb98UserId(ab98UserId); + if (data != null) { + qyUser.setAvatar(data.getFace_img()); + qyUser.setGender(data.getSex()); + qyUser.setMobile(data.getTel()); + qyUser.updateById(); + if (sysUser!= null) { + sysUser.setAvatar(data.getFace_img()); + sysUser.setSex(data.getSex().contains("女") ? 0 : 1); + sysUser.setPhoneNumber(data.getTel()); + sysUser.updateById(); + } + } else if (loginUserinfo != null) { + qyUser.setAvatar(loginUserinfo.getFace()); + qyUser.setGender(loginUserinfo.getSex()); + qyUser.setMobile(loginUserinfo.getPhone()); + qyUser.updateById(); + if (sysUser!= null) { + sysUser.setAvatar(loginUserinfo.getFace()); + sysUser.setSex(loginUserinfo.getSex().contains("女")? 0 : 1); + sysUser.setPhoneNumber(loginUserinfo.getPhone()); + sysUser.updateById(); + } } } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserEntity.java index 447b0e3..281d85a 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserEntity.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserEntity.java @@ -45,6 +45,10 @@ public class QyUserEntity extends BaseEntity { @TableField("userid") private String userid; + @ApiModelProperty("汇邦云用户id") + @TableField("ab98_user_id") + private Long ab98UserId; + @ApiModelProperty("成员名称") @TableField("`name`") private String name; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserMapper.java index f37ea4c..24f27d1 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserMapper.java @@ -31,7 +31,14 @@ public interface QyUserMapper extends BaseMapper { "AND corpid = #{corpid}" + "AND enable = '1'" + "AND deleted = 0") - QyUserEntity selectByUserid(@Param("userid") String userid, @Param("corpid") String corpid); + QyUserEntity selectByUseridAndCorpid(@Param("userid") String userid, @Param("corpid") String corpid); + + @Select("SELECT * " + + "FROM qy_user " + + "WHERE userid = #{userid} " + + "AND enable = '1'" + + "AND deleted = 0") + List selectByUserid(@Param("userid") String userid); @Select("SELECT DISTINCT qu.userid " + "FROM qy_user qu " + diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserService.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserService.java index 7ba029c..e347f99 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserService.java @@ -1,6 +1,7 @@ package com.agileboot.domain.qywx.user.db; import com.agileboot.common.core.page.AbstractPageQuery; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -22,7 +23,9 @@ public interface QyUserService extends IService { List selectAll(); - QyUserEntity getUserByUserId(String userid, String corpid); + List getUserByUserId(String userid); + + QyUserEntity getUserByUserIdAndCorpid(String userid, String corpid); List selectAdminUserIds(); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserServiceImpl.java index 9311e9a..475efad 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/db/QyUserServiceImpl.java @@ -1,8 +1,15 @@ package com.agileboot.domain.qywx.user.db; +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.ab98.user.db.Ab98UserEntity; import com.agileboot.domain.qywx.user.dto.QyUserStatsDTO; +import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserEntity; +import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserMapper; +import com.agileboot.domain.system.user.db.SysUserEntity; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -38,8 +45,13 @@ public class QyUserServiceImpl extends ServiceImpl i } @Override - public QyUserEntity getUserByUserId(String userid, String corpid) { - return baseMapper.selectByUserid(userid, corpid); + public List getUserByUserId(String userid) { + return baseMapper.selectByUserid(userid); + } + + @Override + public QyUserEntity getUserByUserIdAndCorpid(String userid, String corpid) { + return baseMapper.selectByUseridAndCorpid(userid, corpid); } @Override diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/dto/QyUserDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/dto/QyUserDTO.java index c40de7b..8117c0a 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/dto/QyUserDTO.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/user/dto/QyUserDTO.java @@ -43,6 +43,12 @@ public class QyUserDTO { @ExcelColumn(name = "企业用户ID") private String userid; + @ExcelColumn(name = "汇邦云用户ID") + private Long ab98UserId; + + @ExcelColumn(name = "微信openid") + private String openid; + @ExcelColumn(name = "用户姓名") private String name; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java index fb18a1d..e6c70ee 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java @@ -189,7 +189,7 @@ public class ReturnApprovalApplicationService { try { QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", WeixinConstants.corpid); String userid = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), orderModel.getOpenid()).getUserid(); - QyUserEntity qyUser = userService.getUserByUserId(userid, WeixinConstants.corpid); + QyUserEntity qyUser = userService.getUserByUserIdAndCorpid(userid, WeixinConstants.corpid); if (null != qyUser) { qyUser.setBalance(qyUser.getBalance().add(command.getReturnAmount())); qyUser.setUseBalance(qyUser.getUseBalance().subtract(command.getReturnAmount())); @@ -204,7 +204,7 @@ public class ReturnApprovalApplicationService { if (StringUtils.isNotBlank(command.getAuditName())) { model.setAuditName(command.getAuditName()); } else if (StringUtils.isNotBlank(command.getUserid())) { - QyUserEntity qyUserEntity = qyUserService.getUserByUserId(command.getUserid(), WeixinConstants.corpid); + QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), WeixinConstants.corpid); if (null != qyUserEntity) { model.setAuditName(qyUserEntity.getName()); } @@ -318,7 +318,7 @@ public class ReturnApprovalApplicationService { // 审批人信息 if (StringUtils.isNotBlank(command.getUserid())) { - QyUserEntity qyUserEntity = qyUserService.getUserByUserId(command.getUserid(), WeixinConstants.corpid); + QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), WeixinConstants.corpid); if (null != qyUserEntity) { model.setAuditName(qyUserEntity.getName()); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java index 37706f6..49b56bd 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java @@ -179,7 +179,7 @@ public class OrderApplicationService { return new CreateOrderResult(orderModel.getOrderId(), orderModel.getTotalAmount(), paymentResponse, BigDecimal.valueOf(0)); } else if (Objects.equals(command.getPaymentType(), "balance")) { - QyUserEntity qyUser = userService.getUserByUserId(command.getUserid(), command.getCorpid()); + QyUserEntity qyUser = userService.getUserByUserIdAndCorpid(command.getUserid(), command.getCorpid()); // 余额不足 if (qyUser.getBalance().compareTo(orderModel.getTotalAmount()) < 0) { throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "余额不足"); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/query/SearchShopOrderQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/query/SearchShopOrderQuery.java index cbc2c4b..c2b7a91 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/query/SearchShopOrderQuery.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/query/SearchShopOrderQuery.java @@ -32,8 +32,12 @@ public class SearchShopOrderQuery extends AbstractPageQuery { queryWrapper .eq(orderId != null, "o.order_id", orderId) .eq(cellId != null, "og.cell_id", cellId) - .eq(StrUtil.isNotBlank(openid), "o.openid", StringUtils.trim(openid)) - .eq(StrUtil.isNotBlank(userid), "o.userid", StringUtils.trim(userid)) + .eq(StrUtil.isNotBlank(openid) && StrUtil.isBlank(userid), "o.openid", StringUtils.trim(openid)) + .eq(StrUtil.isNotBlank(userid) && StrUtil.isBlank(openid), "o.userid", StringUtils.trim(userid)) + .or(StrUtil.isNotBlank(userid) && StrUtil.isNotBlank(openid), + qw -> qw.eq("o.openid", StringUtils.trim(openid)) + .or() + .eq("o.userid", StringUtils.trim(userid))) .eq(cabinetId != null, "cc.cabinet_id", cabinetId) .eq(status != null, "o.status", status) .eq(payStatus != null, "o.pay_status", payStatus) diff --git a/sql/20250520_goods.sql b/sql/20250520_goods.sql index e2440fa..abd856e 100644 --- a/sql/20250520_goods.sql +++ b/sql/20250520_goods.sql @@ -12,4 +12,12 @@ AFTER `balance`; ALTER TABLE `qy_user` ADD COLUMN `balance_limit` DECIMAL(15,2) NOT NULL DEFAULT '0.00' COMMENT '余额额度' -AFTER `use_balance`; \ No newline at end of file +AFTER `use_balance`; + +ALTER TABLE `qy_user` +ADD COLUMN `ab98_user_id` bigint NULL COMMENT '汇邦云用户id' +AFTER `userid`; + +ALTER TABLE `ab98_user` +ADD COLUMN `qy_user_id` bigint NULL COMMENT '企业用户id' +AFTER `userid`; \ No newline at end of file