doum
2026-06-17 ea689dd91eaa72425dc01759042c3b4eb2186512
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -45,6 +45,7 @@
import com.doumee.dao.web.response.WxAuthorizeVO;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.SmsEmailService;
import com.doumee.service.business.YwCustomerH5AuthService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.doumee.service.system.SystemLoginService;
@@ -126,12 +127,22 @@
    private SmsEmailService smsEmailService;
    @Autowired
    private SystemLoginService systemLoginService;
    private SystemLoginService systemLoginService;
    @Autowired
    private YwCustomerH5AuthService ywCustomerH5AuthService;
    
    @Value("${debug_model}")
    private Boolean isDebug;
    @Value("${h5.wechat.mock-enabled:false}")
    private boolean h5WechatMockEnabled;
    @Value("${h5.wechat.mock-openid:}")
    private String h5WechatMockOpenid;
    @Value("${h5.wechat.mock-code:DEV_MOCK}")
    private String h5WechatMockCode;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -342,6 +353,7 @@
        if (StringUtils.isNotBlank(member.getIdcardNo()) && !IdcardUtil.isValidCard(member.getIdcardNo())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"身份证号格式有误");
        }
        // 内部员工/司机:仅在 type=0,2 范围内去重,不与商户人员(type=3)互斥
        if(StringUtils.isNotBlank(member.getIdcardNo())){
            if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                    .in(Member::getType,new Integer[]{Constants.ZERO,Constants.TWO})
@@ -1773,8 +1785,16 @@
     */
    @Override
    public WxAuthorizeVO ywWxAuthorize(String code){
        return ywWxAuthorize(code, LoginUserInfo.H5_USER_OPS);
    }
    @Override
    public WxAuthorizeVO ywWxAuthorize(String code, Integer userType){
        if(StringUtils.isBlank(code)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if (h5WechatMockEnabled && StringUtils.equals(code, h5WechatMockCode)) {
            return buildYwWxAuthorizeVO(StringUtils.trimToEmpty(h5WechatMockOpenid), userType);
        }
        String appId = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode();
        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_SECRET).getCode();
@@ -1784,16 +1804,26 @@
        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        log.error("=========================tokenJson=====================" + tokenJson);
        String openId = "";
        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
        if(Objects.nonNull(tokenJson)&&!Objects.isNull(tokenJson.get("access_token"))){
            openId = tokenJson.getString("openid");
        }else{
            if(StringUtils.isBlank(openId)){
                return wxAuthorizeVO;
                return new WxAuthorizeVO();
            }
        }
        return buildYwWxAuthorizeVO(openId, userType);
    }
    private WxAuthorizeVO buildYwWxAuthorizeVO(String openId, Integer userType) {
        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
        wxAuthorizeVO.setOpenid(openId);
        //根据openId 查询用户信息
        if(Constants.equalsInteger(userType, LoginUserInfo.H5_USER_CUSTOMER)){
            String token = ywCustomerH5AuthService.loginByOpenId(openId);
            if(StringUtils.isNotBlank(token)){
                wxAuthorizeVO.setToken(token);
            }
            return wxAuthorizeVO;
        }
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getOpenid,openId)
                .eq(SystemUser::getDeleted,Boolean.FALSE)
@@ -2173,6 +2203,7 @@
        member.setIsdeleted(Constants.ZERO);
        member.setStatus(Constants.ZERO);
        this.checkYwMember(member);
        applyYwMemberIdcard(member);
        memberMapper.insert(member);
        return member;
    }
@@ -2189,17 +2220,69 @@
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Member existing = memberMapper.selectById(member.getId());
        if (existing == null || Constants.equalsInteger(existing.getIsdeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "人员信息不存在,请刷新后重试");
        }
        LoginUserInfo loginUserInfo = member.getLoginUserInfo();
        member.setEditor(loginUserInfo.getId());
        member.setCustomerId(null);
        member.setEditDate(new Date());
        member.setType(Constants.memberType.customer);
        member.setStatus(Constants.ZERO);
        member.setIsdeleted(Constants.ZERO);
        member.setStatus(Constants.ZERO);
        this.checkYwMember(member);
        if (StringUtils.isNotBlank(member.getIdcardNoNew())) {
            applyYwMemberIdcardChange(member, existing);
        } else {
            member.setIdcardNo(existing.getIdcardNo());
            member.setIdcardDecode(existing.getIdcardDecode());
        }
        member.setIdcardNoNew(null);
        memberMapper.updateById(member);
        return member;
    }
    /** 新建:明文证件号写入 idcard_no(加密) + idcard_decode(脱敏) */
    private void applyYwMemberIdcard(Member member) {
        if (StringUtils.isBlank(member.getIdcardNo())) {
            return;
        }
        String plain = member.getIdcardNo().trim();
        if (Constants.equalsInteger(member.getIdcardType(), Constants.ZERO)) {
            member.setSex(Constants.getSexByCardNo(plain));
            member.setBirthday(DateUtil.fromStringToDate("yyyyMMdd", IdcardUtil.getBirthByIdCard(plain)));
        }
        member.setIdcardDecode(Constants.getTuominStr(plain));
        member.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, plain));
    }
    /** 编辑:通过 idcardNoNew 变更证件号 */
    private void applyYwMemberIdcardChange(Member member, Member existing) {
        String plain = member.getIdcardNoNew().trim();
        String encrypted = DESUtil.encrypt(Constants.EDS_PWD, plain);
        if (StringUtils.equals(existing.getIdcardNo(), encrypted)) {
            return;
        }
        if (Constants.equalsInteger(member.getIdcardType(), Constants.ZERO)) {
            member.setSex(Constants.getSexByCardNo(plain));
            member.setBirthday(DateUtil.fromStringToDate("yyyyMMdd", IdcardUtil.getBirthByIdCard(plain)));
        }
        member.setIdcardDecode(Constants.getTuominStr(plain));
        member.setIdcardNo(encrypted);
    }
    /** 列表展示:补全 idcard_decode */
    private void fillMemberIdcardDecode(Member member) {
        if (StringUtils.isNotBlank(member.getIdcardDecode()) || StringUtils.isBlank(member.getIdcardNo())) {
            return;
        }
        try {
            String plain = DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo());
            if (StringUtils.isNotBlank(plain)) {
                member.setIdcardDecode(Constants.getTuominStr(plain));
            }
        } catch (Exception e) {
            member.setIdcardDecode(Constants.getTuominStr(member.getIdcardNo()));
        }
    }
@@ -2216,27 +2299,41 @@
    }
    public void checkYwMember(Member member){
        if (StringUtils.isBlank(member.getPhone())||!PhoneUtil.isPhone(member.getPhone())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"电话号码格式有误");
    public void checkYwMember(Member member) {
        if (StringUtils.isBlank(member.getPhone()) || !PhoneUtil.isPhone(member.getPhone())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "电话号码格式有误");
        }
        if (StringUtils.isNotBlank(member.getIdcardNo()) && Constants.equalsInteger(member.getIdcardType(),Constants.ZERO)  && !IdcardUtil.isValidCard(member.getIdcardNo())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"身份证号格式有误");
        if (memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                .ne(Objects.nonNull(member.getId()), Member::getId, member.getId())
                .eq(Member::getPhone, member.getPhone())
                .eq(Member::getType, Constants.memberType.customer)
                .eq(Member::getIsdeleted, Constants.ZERO)) > Constants.ZERO) {
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "手机号【" + member.getPhone() + "】已被使用,不能重复");
        }
        if(StringUtils.isNotBlank(member.getIdcardNo() ) && Constants.equalsInteger(member.getIdcardType(),Constants.ZERO) ){
            if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                            .ne(Objects.nonNull(member.getId()),Member::getId,member.getId())
                    .eq(Member::getIdcardNo, DESUtil.encrypt(Constants.EDS_PWD, member.getIdcardNo()))
                    .eq(Member::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "身份证号【"+member.getIdcardNo()+"】已被使用,不能重复");
        String plainIdcard = resolveYwPlainIdcard(member);
        if (StringUtils.isNotBlank(plainIdcard)) {
            if (Constants.equalsInteger(member.getIdcardType(), Constants.ZERO) && !IdcardUtil.isValidCard(plainIdcard)) {
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "身份证号格式有误");
            }
            String encrypted = DESUtil.encrypt(Constants.EDS_PWD, plainIdcard);
            if (memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                    .ne(Objects.nonNull(member.getId()), Member::getId, member.getId())
                    .eq(Member::getType, Constants.memberType.customer)
                    .eq(Member::getIsdeleted, Constants.ZERO)
                    .eq(Member::getIdcardNo, encrypted)) > Constants.ZERO) {
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "证件号【" + plainIdcard + "】已被使用,不能重复");
            }
        }
//        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
//                .ne(Objects.nonNull(member.getId()),Member::getId,member.getId())
//                .eq(Member::getPhone,  member.getPhone())
//                .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
//            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "手机号【"+member.getPhone()+"】已被使用,不能重复");
//        }
    }
    private String resolveYwPlainIdcard(Member member) {
        if (StringUtils.isNotBlank(member.getIdcardNoNew())) {
            return member.getIdcardNoNew().trim();
        }
        if (member.getId() == null && StringUtils.isNotBlank(member.getIdcardNo())) {
            return member.getIdcardNo().trim();
        }
        return null;
    }
@@ -2255,10 +2352,21 @@
                .eq(Objects.nonNull(model)&&Objects.nonNull(model.getCustomerId()),Member::getCustomerId,model.getCustomerId())
                .and(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getName()),i->i.like(Member::getName,model.getName()).or().like(
                        Member::getPhone,model.getName()
                ))
                ).or().like(Member::getIdcardDecode, model.getName()))
                .and(Objects.nonNull(model) && StringUtils.isNotBlank(model.getIdcardNo()), w -> {
                    String idcard = model.getIdcardNo().trim();
                    w.eq(Member::getIdcardNo, DESUtil.encrypt(Constants.EDS_PWD, idcard))
                            .or().like(Member::getIdcardDecode, idcard);
                })
                .orderByDesc(Member::getCreateDate)
        );
        return PageData.from(iPage);
        PageData<Member> pageData = PageData.from(iPage);
        if (pageData.getRecords() != null) {
            for (Member item : pageData.getRecords()) {
                fillMemberIdcardDecode(item);
            }
        }
        return pageData;
    }
}