From ea689dd91eaa72425dc01759042c3b4eb2186512 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 17 六月 2026 10:14:44 +0800
Subject: [PATCH] 新增智能电表、空调管理

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java |  142 +++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 117 insertions(+), 25 deletions(-)

diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index d733728..563d197 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -135,7 +135,14 @@
     @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})
@@ -346,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})
@@ -1785,6 +1793,9 @@
         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();
         String getTokenUrl = WXConstant.GET_USER_INFO_URL.replace("CODE", code)
@@ -1793,14 +1804,18 @@
         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);
         if(Constants.equalsInteger(userType, LoginUserInfo.H5_USER_CUSTOMER)){
             String token = ywCustomerH5AuthService.loginByOpenId(openId);
@@ -1809,7 +1824,6 @@
             }
             return wxAuthorizeVO;
         }
-        //鏍规嵁openId 鏌ヨ杩愮淮鐢ㄦ埛淇℃伅
         SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                 .eq(SystemUser::getOpenid,openId)
                 .eq(SystemUser::getDeleted,Boolean.FALSE)
@@ -2189,6 +2203,7 @@
         member.setIsdeleted(Constants.ZERO);
         member.setStatus(Constants.ZERO);
         this.checkYwMember(member);
+        applyYwMemberIdcard(member);
         memberMapper.insert(member);
         return member;
     }
@@ -2205,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()));
+        }
     }
 
 
@@ -2232,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;
     }
 
 
@@ -2271,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;
     }
 
 }

--
Gitblit v1.9.3