From b0ec9895cde2519bc085ac40acbeea89ae8b6f9d Mon Sep 17 00:00:00 2001 From: cuilei <ray_tsu1@163.com> Date: 星期四, 17 七月 2025 16:44:04 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java | 271 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 243 insertions(+), 28 deletions(-) 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 4eab929..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 @@ -1,5 +1,6 @@ package org.jeecg.modules.system.service.impl; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -14,6 +15,7 @@ import com.jeecg.qywx.api.user.vo.User; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.flowable.common.engine.impl.util.CollectionUtil; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.util.JwtUtil; @@ -23,6 +25,9 @@ import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.JeecgBaseConfig; import org.jeecg.config.thirdapp.ThirdAppConfig; +import org.jeecg.modules.qywx.message.MessageAPI; +import org.jeecg.modules.qywx.message.vo.TemplateCard; +import org.jeecg.modules.qywx.message.vo.TemplateCardEntity; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; import org.jeecg.modules.system.mapper.SysUserMapper; @@ -31,6 +36,7 @@ import org.jeecg.modules.system.service.*; import org.jeecg.modules.system.vo.thirdapp.JwDepartmentTreeVo; import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; @@ -39,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -398,10 +405,10 @@ * 2. 鏈湴琛ㄩ噷娌℃湁锛屽氨鍏堢敤鎵嬫満鍙峰垽鏂紝涓嶉�氳繃鍐嶇敤username鍒ゆ柇銆� */ SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE); - List<SysUser> collect = sysUsersList.stream().filter(user -> (qwUser.getMobile().equals(user.getPhone()) || qwUser.getUserid().equals(user.getUsername())) + List<SysUser> collect = sysUsersList.stream().filter(user -> qwUser.getUserid().equals(user.getWorkNo()) ).collect(Collectors.toList()); - if (collect != null && collect.size() > 0) { + if (CollectionUtil.isNotEmpty(collect)) { SysUser sysUserTemp = collect.get(0); // 寰幆鍒版璇存槑鐢ㄦ埛鍖归厤鎴愬姛锛岃繘琛屾洿鏂版搷浣� SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp); @@ -413,7 +420,7 @@ this.syncUserCollectErrInfo(e, qwUser, syncInfo); } - this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser.getUserid()); + this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser); // 鏇存柊瀹屾垚锛岀洿鎺ヨ烦鍒颁笅涓�娆″閮ㄥ惊鐜户缁� }else{ // 娌″尮閰嶅埌鐢ㄦ埛鍒欒蛋鏂板閫昏緫 @@ -425,7 +432,7 @@ } catch (Exception e) { this.syncUserCollectErrInfo(e, qwUser, syncInfo); } - this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser.getUserid()); + this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser); } } return syncInfo; @@ -447,6 +454,20 @@ sysThirdAccount.setThirdType(THIRD_TYPE); } sysThirdAccount.setThirdUserId(qwUserId); + sysThirdAccountService.saveOrUpdate(sysThirdAccount); + } + + private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, User qwUser) { + if (sysThirdAccount == null) { + sysThirdAccount = new SysThirdAccount(); + sysThirdAccount.setThirdUserId(qwUser.getUserid()); + sysThirdAccount.setRealname(qwUser.getName()); + sysThirdAccount.setThirdUserUuid(qwUser.getUserid()); + sysThirdAccount.setStatus(1); + sysThirdAccount.setDelFlag(0); + sysThirdAccount.setThirdType(THIRD_TYPE); + } + sysThirdAccount.setSysUserId(sysUserId); sysThirdAccountService.saveOrUpdate(sysThirdAccount); } @@ -622,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); @@ -643,22 +664,23 @@ if (oConvertUtils.isEmpty(sysUser.getWorkNo())) { sysUser.setWorkNo(qwUser.getUserid()); } - try { - sysUser.setSex(Integer.parseInt(qwUser.getGender())); - } catch (NumberFormatException ignored) { - } + //浼佷笟寰俊鎺ュ彛鏇存柊鍚庯紝涓嶅湪杩斿洖 鎬у埆銆侀偖绠便�佹墜鏈哄彿鐮� 瀛楁 + //try { + // sysUser.setSex(Integer.parseInt(qwUser.getGender())); + //} catch (NumberFormatException ignored) { + //} // 鍥犱负鍞竴閿害鏉熺殑鍘熷洜锛屽鏋滃師鏁版嵁鍜屾棫鏁版嵁鐩稿悓锛屽氨涓嶆洿鏂� - if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) { - sysUser.setEmail(qwUser.getEmail()); - } else { - sysUser.setEmail(null); - } + //if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) { + // sysUser.setEmail(qwUser.getEmail()); + //} else { + // sysUser.setEmail(null); + //} // 鍥犱负鍞竴閿害鏉熺殑鍘熷洜锛屽鏋滃師鏁版嵁鍜屾棫鏁版嵁鐩稿悓锛屽氨涓嶆洿鏂� - if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) { - sysUser.setPhone(qwUser.getMobile()); - } else { - sysUser.setPhone(null); - } + //if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) { + // sysUser.setPhone(qwUser.getMobile()); + //} else { + // sysUser.setPhone(null); + //} // 鍚敤/绂佺敤鎴愬憳锛堢姸鎬侊級锛岃鍒欎笉鍚岋紝闇�瑕佽浆鎹� // 浼佷笟寰俊瑙勫垯锛�1琛ㄧず鍚敤鎴愬憳锛�0琛ㄧず绂佺敤鎴愬憳 @@ -667,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() @@ -822,7 +846,7 @@ String userId = announcement.getUserIds(); String[] userIds = null; if(oConvertUtils.isNotEmpty(userId)){ - userIds = userId.substring(0, (userId.length() - 1)).split(","); + userIds = userId.substring(0, userId.length()).split(","); }else{ LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); @@ -857,7 +881,126 @@ return JwMessageAPI.sendTextCardMessage(textCard, accessToken); } - private String getTouser(String origin, boolean toAll) { + /** + * 鍙戦�佹ā鏉垮崱鐗囨秷鎭紙涓氬姟娴佺▼璋冪敤姝ゆ柟娉曪級 + * @param templateCard + * @param verifyConfig + * @return + */ + public JSONObject sendTemplateCardMsg(TemplateCard templateCard, boolean verifyConfig) { + if (verifyConfig && !thirdAppConfig.isWechatEnterpriseEnabled()) { + return null; + } + String accessToken = this.getAppAccessToken(); + if (accessToken == null) { + return null; + } + templateCard.setAgentid(thirdAppConfig.getWechatEnterprise().getAgentIdInt()); + return MessageAPI.sendTemplateCardMessage(templateCard, accessToken); + } + + /** + * 鍙戦�佹ā鏉垮崱鐗囨秷鎭紙娑堟伅娴嬭瘯璋冪敤姝ゆ柟娉曪級 + * + * @return + */ + public JSONObject sendTemplateCardMsg(SysAnnouncement announcement, boolean verifyConfig) { + if (verifyConfig && !thirdAppConfig.isWechatEnterpriseEnabled()) { + return null; + } + String accessToken = this.getAppAccessToken(); + if (accessToken == null) { + return null; + } + + TemplateCard templateCard = new TemplateCard(); + templateCard.setAgentid(thirdAppConfig.getWechatEnterprise().getAgentIdInt()); + boolean isToAll = CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType()); + String usernameString = ""; + if (!isToAll) { + // 灏唘serId杞负username + String userId = announcement.getUserIds(); + String[] userIds = null; + if (oConvertUtils.isNotEmpty(userId)) { + userIds = userId.substring(0, userId.length()).split(","); + } else { + LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); + SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); + userIds = new String[]{sysAnnouncementSend.getUserId()}; + } + + LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SysUser::getId, userIds); + List<SysUser> userList = userMapper.selectList(queryWrapper); + List<String> usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); + usernameString = String.join(",", usernameList); + } + templateCard.setTouser(this.getTouser(usernameString, isToAll)); + + TemplateCardEntity templateCardEntity = new TemplateCardEntity(); + templateCard.setTemplate_card(templateCardEntity); + templateCardEntity.setTask_id(UUID.randomUUID().toString().replaceAll("-", "")); + TemplateCardEntity.Source source = new TemplateCardEntity.Source(); + source.setIcon_url("https://www.jeecg.org/logo.png"); + source.setDesc("璁惧绠$悊娴嬭瘯"); + templateCardEntity.setSource(source); + TemplateCardEntity.MainTitle mainTitle = new TemplateCardEntity.MainTitle(); + mainTitle.setTitle("璁惧鍛ㄤ繚"); + //mainTitle.setDesc("璁惧鍛ㄤ繚淇℃伅"); + templateCardEntity.setMain_title(mainTitle); + templateCardEntity.setSub_title_text("璁惧鍛ㄤ繚娴佺▼璇︽儏"); + List<TemplateCardEntity.HorizontalContent> horizontalContentList = getHorizontalContents(); + templateCardEntity.setHorizontal_content_list(horizontalContentList); + TemplateCardEntity.CardAction cardAction = new TemplateCardEntity.CardAction(); + cardAction.setType(1); + cardAction.setUrl("https://houjie.xalxzn.com:8866/h5"); + templateCardEntity.setCard_action(cardAction); + TemplateCardEntity.ActionMenu actionMenu = new TemplateCardEntity.ActionMenu(); + actionMenu.setDesc("鏇村"); + actionMenu.setAction_list(cn.hutool.core.collection.CollectionUtil + .newArrayList(new TemplateCardEntity.ActionMenu.ActionList("鎺ユ敹鎺ㄩ��", "A"), + new TemplateCardEntity.ActionMenu.ActionList("涓嶅啀鎺ㄩ��", "B"))); + templateCardEntity.setAction_menu(actionMenu); + //templateCardEntity.setJump_list(cn.hutool.core.collection.CollectionUtil + // .newArrayList(new TemplateCardEntity.Jump(1, "浼佷笟寰俊瀹樼綉", "https://work.weixin.qq.com"))); + //TemplateCardEntity.CardImage cardImage = new TemplateCardEntity.CardImage(); + //cardImage.setUrl("https://www.jeecg.org/logo.png"); + //templateCardEntity.setCard_image(cardImage); + return MessageAPI.sendTemplateCardMessage(templateCard, accessToken); + } + + @NotNull + private static List<TemplateCardEntity.HorizontalContent> getHorizontalContents() { + List<TemplateCardEntity.HorizontalContent> horizontalContentList = new ArrayList<>(); + TemplateCardEntity.HorizontalContent content1 = new TemplateCardEntity.HorizontalContent(); + content1.setKeyname("娴佺▼鎻忚堪"); + content1.setValue("宸ュ崟鍙�:WMCR2025050011;璁惧缂栧彿:031-41杩涜璁惧鍛ㄤ繚"); + horizontalContentList.add(content1); + TemplateCardEntity.HorizontalContent content2 = new TemplateCardEntity.HorizontalContent(); + content2.setKeyname("涔嬪墠澶勭悊浜�"); + content2.setValue("绠$悊鍛�"); + horizontalContentList.add(content2); + TemplateCardEntity.HorizontalContent content3 = new TemplateCardEntity.HorizontalContent(); + content3.setKeyname("鍓嶉┍鑺傜偣"); + content3.setValue("鍛ㄤ繚棰嗗彇"); + horizontalContentList.add(content3); + TemplateCardEntity.HorizontalContent content4 = new TemplateCardEntity.HorizontalContent(); + content4.setKeyname("褰撳墠鑺傜偣"); + content4.setValue("鍛ㄤ繚鎵ц"); + horizontalContentList.add(content4); + TemplateCardEntity.HorizontalContent content5 = new TemplateCardEntity.HorizontalContent(); + content5.setKeyname("宸ュ崟鍙�"); + content5.setValue("WMCR2025050011"); + horizontalContentList.add(content5); + TemplateCardEntity.HorizontalContent content6 = new TemplateCardEntity.HorizontalContent(); + content6.setKeyname("璁惧缂栧彿"); + content6.setValue("031-41"); + horizontalContentList.add(content6); + return horizontalContentList; + } + + public String getTouser(String origin, boolean toAll) { if (toAll) { return "@all"; } else { @@ -895,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<>(); @@ -903,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 + } + } + /** * 鏍规嵁绗笁鏂硅处鍙疯幏鍙栨湰鍦拌处鍙凤紝濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓 @@ -928,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()); @@ -943,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