From c64caa25a8f6ffa026527828c1da3cd97c5c99c6 Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期四, 17 七月 2025 16:22:34 +0800
Subject: [PATCH] 企业微信H5登录手动授权并获取手机号码适配修改,用户同步根据现场情况调整

---
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java |   94 ++++++++++++++++++++++++++++---
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java                  |    8 ++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java                             |    4 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java                            |   13 ++++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java          |    6 +
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java                           |    2 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml                          |    3 +
 7 files changed, 117 insertions(+), 13 deletions(-)

diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
index 0d7a4c4..ea29976 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java
@@ -317,9 +317,11 @@
 			builder.append("&response_type=code");
 			// 搴旂敤鎺堟潈浣滅敤鍩熴��
 			// snsapi_base锛氶潤榛樻巿鏉冿紝鍙幏鍙栨垚鍛樼殑鐨勫熀纭�淇℃伅锛圲serId涓嶥eviceId锛夛紱
-			builder.append("&scope=snsapi_base");
+			//builder.append("&scope=snsapi_base");
+			builder.append("&scope=snsapi_privateinfo"); // 鎵嬪姩鎺堟潈浣滅敤鍩�
 			// 閲嶅畾鍚戝悗浼氬甫涓妔tate鍙傛暟锛岄暱搴︿笉鍙秴杩�128涓瓧鑺�
 			builder.append("&state=").append(state);
+			builder.append("&agentid=").append(config.getAgentId()); // 琛ュ厖AgentID
 			// 缁堢浣跨敤姝ゅ弬鏁板垽鏂槸鍚﹂渶瑕佸甫涓婅韩浠戒俊鎭�
 			builder.append("#wechat_redirect");
 			url = builder.toString();
@@ -376,6 +378,10 @@
         SysUser loginUser;
         if (ThirdAppConfig.WECHAT_ENTERPRISE.equalsIgnoreCase(source)) {
             log.info("銆愪紒涓氬井淇°�慜Auth2鐧诲綍杩涘叆callback锛歝ode=" + code + ", state=" + state);
+			if (code == null) {
+				log.info("鐢ㄦ埛鍙栨秷浜嗕紒涓氬井淇℃巿鏉�");
+				return "鐢ㄦ埛鍙栨秷浜嗘巿鏉�";
+			}
             loginUser = thirdAppWechatEnterpriseService.oauth2Login(code);
             if (loginUser == null) {
                 return "鐧诲綍澶辫触";
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java
index f3b583f..4fc65ad 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java
@@ -77,4 +77,6 @@
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private java.util.Date updateTime;
+	@Excel(name = "鎵嬫満鍙�", width = 15)
+	private String phone;
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
index 7966336..fc85322 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
@@ -76,6 +76,9 @@
 	 * @return
 	 */
 	public SysUser getUserByPhone(@Param("phone") String phone);
+
+	/** 鏍规嵁宸ュ彿鏌ヨ鐢ㄦ埛淇℃伅 */
+	SysUser getUserByWorkNo(@Param("workNo") String workNo);
 	
 	
 	/**
@@ -183,4 +186,5 @@
 	 * 鏍规嵁瑙掕壊缂栫爜鍜岃澶囩紪鍙锋煡璇㈢敤鎴�
 	 */
     List<SysUser> getEquipmentAdmin(@Param("roleCode") String roleCode, @Param("equipmentId") String equipmentId);
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
index 3e751a9..9d60c51 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
@@ -217,4 +217,7 @@
 		WHERE
 			t3.role_code = #{roleCode} AND equipment_ids LIKE concat(concat('%',#{equipmentId}),'%')
 	</select>
+	<select id="getUserByWorkNo" resultType="org.jeecg.modules.system.entity.SysUser">
+		select * from sys_user where work_no = #{workNo} and del_flag = 0
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java
index 4f6cc27..3b91689 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java
@@ -33,6 +33,11 @@
     private String avatar;
 
     /**
+     * 绗笁鏂圭櫥褰� 鎵嬫満鍙�
+     */
+    private String phone;
+
+    /**
      * 璐﹀彿 鍚庣紑绗笁鏂圭櫥褰� 闃叉璐﹀彿閲嶅
      */
     private String suffix;
@@ -60,6 +65,14 @@
         this.avatar = avatar;
     }
 
+    public ThirdLoginModel(String source,String uuid,String username,String avatar,String phone){
+        this.source = source;
+        this.uuid = uuid;
+        this.username = username;
+        this.avatar = avatar;
+        this.phone = phone;
+    }
+
     /**
      * 鑾峰彇鐧诲綍璐﹀彿鍚�
      * @return
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java
index 9629d1a..09a5d95 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java
@@ -72,7 +72,7 @@
         query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid);
         SysThirdAccount account = sysThirdAccountMapper.selectOne(query);
         //閫氳繃鐢ㄦ埛鍚嶆煡璇㈡暟鎹簱鏄惁宸插瓨鍦�
-        SysUser userByName = sysUserMapper.getUserByName(thirdUserUuid);
+        SysUser userByName = sysUserMapper.getUserByName(thirdUserUuid.substring(2));
         if(null!=userByName){
             //濡傛灉璐﹀彿瀛樺湪鐨勮瘽锛屽垯鑷姩鍔犱笂涓�涓椂闂存埑
             String format = DateUtils.yyyymmddhhmmss.get().format(new Date());
@@ -83,7 +83,8 @@
         user.setActivitiSync(CommonConstant.ACT_SYNC_0);
         user.setDelFlag(CommonConstant.DEL_FLAG_0);
         user.setStatus(1);
-        user.setUsername(thirdUserUuid);
+        //鐢ㄦ埛鍚嶅彇宸ュ彿鍘婚櫎鍓嶄袱浣嶅瓧姣嶅悗闈㈢殑鍊�
+        user.setUsername(thirdUserUuid.substring(2));
         user.setPhone(phone);
         //璁剧疆鍒濆瀵嗙爜
         String salt = oConvertUtils.randomGen(8);
@@ -148,6 +149,7 @@
         user.setRealname(tlm.getUsername());
         user.setThirdUserUuid(tlm.getUuid());
         user.setThirdUserId(tlm.getUuid());
+        user.setPhone(tlm.getPhone());
         super.save(user);
         return user;
     }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
index f98789b..f25dc67 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java
@@ -390,7 +390,7 @@
             return syncInfo;
         }
         // 鑾峰彇浼佷笟寰俊鎵�鏈夌殑鐢ㄦ埛
-        List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1433010418", null, null, accessToken);
+        List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken);
         if (qwUsersList == null) {
             syncInfo.addFailInfo("浼佷笟寰俊鐢ㄦ埛鍒楄〃鏌ヨ澶辫触锛�");
             return syncInfo;
@@ -405,7 +405,7 @@
              * 2. 鏈湴琛ㄩ噷娌℃湁锛屽氨鍏堢敤鎵嬫満鍙峰垽鏂紝涓嶉�氳繃鍐嶇敤username鍒ゆ柇銆�
              */
             SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE);
-            List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getUsername())
+            List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getWorkNo())
                                                                 ).collect(Collectors.toList());
 
             if (CollectionUtil.isNotEmpty(collect)) {
@@ -643,7 +643,7 @@
         sysUser.setDelFlag(0);
         sysUser.setStatus(1);
         // 閫氳繃 username 鏉ュ叧鑱�
-        sysUser.setUsername(user.getUserid());
+        sysUser.setUsername(user.getUserid().substring(2));
         // 瀵嗙爜榛樿涓� 鈥�123456鈥濓紝闅忔満鍔犵洂
         String password = "123456", salt = oConvertUtils.randomGen(8);
         String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);
@@ -689,7 +689,9 @@
             sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2);
         }
         // 搴ф満鍙�
-        sysUser.setTelephone(qwUser.getTelephone());
+        if (StringUtils.isNotBlank(qwUser.getTelephone())) {
+            sysUser.setTelephone(qwUser.getTelephone());
+        }
 
         // --- 浼佷笟寰俊娌℃湁閫昏緫鍒犻櫎鐨勫姛鑳�
         // sysUser.setDelFlag()
@@ -1036,7 +1038,17 @@
         if (accessToken == null) {
             return null;
         }
-        String appUserId = this.getUserIdByThirdCode(code, accessToken);
+
+        // 閫氳繃code鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_ticket锛�
+        JSONObject userInfoResult = this.getUserInfoByCode(code, accessToken);
+        if (userInfoResult == null || userInfoResult.getInteger("errcode") != 0) {
+            log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛淇℃伅澶辫触锛宑ode: {}", code);
+            return null;
+        }
+
+        String appUserId = userInfoResult.getString("UserId");
+        String userTicket = userInfoResult.getString("user_ticket"); // 鎵嬪姩鎺堟潈杩斿洖鐨勭敤鎴风エ鎹�
+
         if (appUserId != null) {
             // 鍒ゆ柇绗笁鏂圭敤鎴疯〃鏈夋病鏈夎繖涓汉
             LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();
@@ -1044,18 +1056,63 @@
             queryWrapper.or().eq(SysThirdAccount::getThirdUserId, appUserId);
             queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);
             SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper);
+
+            // 閫氳繃user_ticket鑾峰彇鐢ㄦ埛璇︾粏淇℃伅锛堝寘鍚墜鏈哄彿绛夋晱鎰熶俊鎭級
+            JSONObject userDetail = this.getUserDetailByTicket(userTicket, accessToken);
+            String mobile = userDetail.getString("mobile");
+
             if (thirdAccount != null) {
+                // 鏇存柊鎵嬫満鍙凤紙濡傛灉鏈夛級
+                if (mobile != null && !mobile.isEmpty()) {
+                    thirdAccount.setPhone(mobile);
+                    sysThirdAccountService.updateById(thirdAccount);
+                }
                 return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken);
             } else {
-                // 鐩存帴鍒涘缓鏂拌处鍙�
+                // 鐩存帴鍒涘缓鏂拌处鍙凤紝鍖呭惈鎵嬫満鍙蜂俊鎭�
                 User appUser = JwUserAPI.getUserByUserid(appUserId, accessToken);
-                ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar());
+                ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUserid(), appUser.getName(), appUser.getAvatar(), mobile);
                 thirdAccount = sysThirdAccountService.saveThirdUser(tlm);
                 return this.getSysUserByThird(thirdAccount, appUser, null, null);
             }
         }
         return null;
     }
+
+    /**
+     * 閫氳繃code鑾峰彇鐢ㄦ埛淇℃伅锛堝寘鍚玼ser_ticket锛�
+     */
+    private JSONObject getUserInfoByCode(String code, String accessToken) {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo" +
+                "?access_token=" + accessToken +
+                "&code=" + code;
+        try {
+            String result = String.valueOf(RestUtil.get(url));
+            return JSONObject.parseObject(result);
+        } catch (Exception e) {
+            log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛淇℃伅寮傚父", e);
+            return null;
+        }
+    }
+
+    /**
+     * 閫氳繃user_ticket鑾峰彇鐢ㄦ埛璇︾粏淇℃伅锛堝寘鍚墜鏈哄彿绛夋晱鎰熶俊鎭級
+     */
+    private JSONObject getUserDetailByTicket(String userTicket, String accessToken) {
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail";
+        JSONObject params = new JSONObject();
+        params.put("user_ticket", userTicket);
+
+        try {
+            String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, JSONObject.parseObject(params.toJSONString())));
+//            String result = String.valueOf(RestUtil.post(url + "?access_token=" + accessToken, params.toJSONString()));
+            return JSONObject.parseObject(result);
+        } catch (Exception e) {
+            log.error("鑾峰彇浼佷笟寰俊鐢ㄦ埛璇︾粏淇℃伅寮傚父", e);
+            return new JSONObject(); // 杩斿洖绌哄璞¢伩鍏峃PE
+        }
+    }
+
 
     /**
      * 鏍规嵁绗笁鏂硅处鍙疯幏鍙栨湰鍦拌处鍙凤紝濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓
@@ -1069,14 +1126,24 @@
     private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken) {
         String sysUserId = thirdAccount.getSysUserId();
         if (oConvertUtils.isNotEmpty(sysUserId)) {
-            return userMapper.selectById(sysUserId);
+            SysUser sysUser = userMapper.selectById(sysUserId);
+            if (sysUser != null && StringUtils.isBlank(sysUser.getPhone())) {
+                //濡傛灉鏈夌敤鎴凤紝骞朵笖娌℃湁鐢佃瘽淇℃伅锛屾洿鏂拌繘鐢佃瘽鍙风爜
+                SysUser user = new SysUser()
+                        .setId(sysUser.getId())
+                        .setPhone(thirdAccount.getPhone());
+                userMapper.updateById(user);
+            }
+            return sysUser;
         } else {
             // 濡傛灉娌℃湁 sysUserId 锛岃鏄庢病鏈夌粦瀹氳处鍙凤紝鑾峰彇鍒版墜鏈哄彿涔嬪悗杩涜缁戝畾
             if (appUser == null) {
                 appUser = JwUserAPI.getUserByUserid(appUserId, accessToken);
             }
-            // 鍒ゆ柇绯荤粺閲屾槸鍚︽湁杩欎釜鎵嬫満鍙风殑鐢ㄦ埛
-            SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile());
+            appUser.setMobile(thirdAccount.getPhone());
+            // 鍒ゆ柇绯荤粺閲屾槸鍚︽湁杩欎釜鐢ㄦ埛锛屾牴鎹伐鍙峰尮閰�
+            SysUser sysUser = userMapper.getUserByWorkNo(thirdAccount.getThirdUserId());
+            //SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile());
             if (sysUser != null) {
                 thirdAccount.setAvatar(appUser.getAvatar());
                 thirdAccount.setRealname(appUser.getName());
@@ -1084,6 +1151,13 @@
                 thirdAccount.setThirdUserUuid(appUser.getUserid());
                 thirdAccount.setSysUserId(sysUser.getId());
                 sysThirdAccountService.updateById(thirdAccount);
+                if (StringUtils.isBlank(sysUser.getPhone())) {
+                    //濡傛灉娌℃湁鎵嬫満鍙风爜锛屾洿鏂�
+                    SysUser user = new SysUser()
+                            .setId(sysUser.getId())
+                            .setPhone(appUser.getMobile());
+                    userMapper.updateById(user);
+                }
                 return sysUser;
             } else {
                 // 娌℃湁灏辫蛋鍒涘缓閫昏緫

--
Gitblit v1.9.3