Browse Source

Changes 修改站点绑定业务

cyan 4 months ago
parent
commit
00178d7f2d

+ 11 - 6
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/account/service/impl/OkkiAccountServiceImpl.java

@@ -1,21 +1,19 @@
 package org.jeecg.modules.okki.account.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.common.util.FastJsonUtil;
+import org.jeecg.common.util.ThreadPoolUtil;
 import org.jeecg.modules.okki.account.dto.OkkiBindSiteDto;
 import org.jeecg.modules.okki.account.entity.OkkiAccount;
 import org.jeecg.modules.okki.account.mapper.OkkiAccountMapper;
 import org.jeecg.modules.okki.account.param.OkkiAccountResetPwdParam;
 import org.jeecg.modules.okki.account.service.IOkkiAccountService;
-import org.jeecg.modules.okki.site.entity.OkkiSite;
 import org.jeecg.modules.okki.site.service.IOkkiSiteService;
 import org.jeecg.modules.okki.siteuser.entity.OkkiSiteUser;
 import org.jeecg.modules.okki.siteuser.service.IOkkiSiteUserService;
@@ -23,7 +21,6 @@ import org.jeecg.modules.okki.utils.HttpClientUtils;
 import org.jeecg.modules.system.service.ISysDictService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -50,6 +47,9 @@ public class OkkiAccountServiceImpl extends ServiceImpl<OkkiAccountMapper, OkkiA
     @Autowired
     private IOkkiSiteUserService okkiSiteUserService;
 
+    @Autowired
+    private IOkkiSiteService okkiSiteService;
+
     @Override
     public void insertAccount(OkkiAccount okkiAccount) {
         //查询账号是否已存在
@@ -390,8 +390,13 @@ public class OkkiAccountServiceImpl extends ServiceImpl<OkkiAccountMapper, OkkiA
             log.info(res);
             JSONObject jsonObject = JSONObject.parseObject(res);
             if (jsonObject.get("code").equals(0)) {
-                // 保存站点数据
-                buildOkkiSiteUser(okkiBindSiteDto);
+                ThreadPoolUtil.execute(() -> {
+                    // 保存站点数据
+                    buildOkkiSiteUser(okkiBindSiteDto);
+
+                    //更新飞书表格
+                    okkiSiteService.saveOrUpdateFeishuSheetFields(okkiBindSiteDto.getSiteId());
+                });
             } else {
                 throw new RuntimeException(jsonObject.get("msg").toString());
             }

+ 3 - 1
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/site/entity/FeiShuConfigEnum.java

@@ -5,12 +5,14 @@ package org.jeecg.modules.okki.site.entity;
  */
 public enum FeiShuConfigEnum {
     PROD("cli_a61c977059f01013", "saNlFj2YdMXZ0uEAucyRodfSEp5ZHikR", "X16RbjCVCasCmds7fn0c0k21nju", "tblSkc8HfEYDL99U", "tblr6rTYtEbLHmAg", "tbl9ykcEZBqZt1vj", "vewiMyOeed"),
-    DEV("cli_a61c977059f01013", "saNlFj2YdMXZ0uEAucyRodfSEp5ZHikR", "IbXcbvtyha1iIZs7foDcnCSonQd", "tblpGulK9zTrtiSV", "tblgjKUseVRlQWYk", "tblzNFg2baKP7Ssj", "vewiMyOeed");
+    DEV("cli_a61c977059f01013", "saNlFj2YdMXZ0uEAucyRodfSEp5ZHikR", "Emonb0RBsaVKjdsagjdc4tcOnUd", "tblG6SUeY3YFmnh2", "tblV1nViJgSGbmmL", "tblNApWmY1Rw9H7G", "vewiMyOeed");
 
     private final String appId;
     private final String appSecret;
     private final String appToken;
     private final String kfTableId;
+
+    // PM分组
     private final String projectTeamTableId;
     private final String seoTeamTableId;
     private final String kfTableSummaryViewId;

+ 77 - 6
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/site/service/IFeiShuCommonService.java

@@ -85,11 +85,20 @@ public class IFeiShuCommonService {
             if ("离职".equals(jsonObject.getString("状态"))) {
                 continue;
             }
-            if (targetGroups.contains(groupNameData)) {
-                if (!targetGroupData.containsKey(groupNameData)) {
-                    targetGroupData.put(groupNameData, new ArrayList<>());
+
+            if(targetGroups.isEmpty()){
+                String omsId = jsonObject.getString("OMS系统ID");
+                if (!targetGroupData.containsKey(omsId)) {
+                    targetGroupData.put(omsId, new ArrayList<>());
+                }
+                targetGroupData.get(omsId).add(jsonObject);
+            }else{
+                if (targetGroups.contains(groupNameData)) {
+                    if (!targetGroupData.containsKey(groupNameData)) {
+                        targetGroupData.put(groupNameData, new ArrayList<>());
+                    }
+                    targetGroupData.get(groupNameData).add(jsonObject);
                 }
-                targetGroupData.get(groupNameData).add(jsonObject);
             }
         }
 
@@ -155,7 +164,7 @@ public class IFeiShuCommonService {
      *
      * @param okkiSite
      */
-    public void syncWebsiteToFeiShuSheet(OkkiSite okkiSite) {
+    public void syncWebsiteToFeiShuSheet(OkkiSite okkiSite,Map<String, Object> updateGroupFieldMap) {
         FeiShuConfigEnum configEnum = FeiShuConfigManager.getInstance().getConfigEnum();
         Client client = Client.newBuilder(configEnum.getAppId(), configEnum.getAppSecret()).build();
 
@@ -166,6 +175,7 @@ public class IFeiShuCommonService {
         map.put("状态", "正常");
         map.put("当前状态", "模版待确认");
 //        map.put("顾问对接", "小满对接");
+        map.putAll(updateGroupFieldMap);
         CreateAppTableRecordReq req = CreateAppTableRecordReq.newBuilder().appToken(configEnum.getAppToken()).tableId(configEnum.getKfTableId())
                 .appTableRecord(AppTableRecord.newBuilder()
                         .fields(map)
@@ -188,7 +198,7 @@ public class IFeiShuCommonService {
         }
 
 //        System.out.println(Jsons.DEFAULT.toJson(resp.getData()));
-        feiShuMsgService.sendSyncFeiShuSheetMsg(okkiSite.getCompanyName(), okkiSite.getSiteId(), okkiSite.getTcName(), syncStatus);
+//        feiShuMsgService.sendSyncFeiShuSheetMsg(okkiSite.getCompanyName(), okkiSite.getSiteId(), okkiSite.getTcName(), syncStatus);
     }
 
     /**
@@ -851,4 +861,65 @@ public class IFeiShuCommonService {
 
         return resp.getData().getIsInChat();
     }
+
+    /**
+     * 在客服团队表根据站点ID获取数据
+     *
+     * @return
+     */
+    public List<Map<String, Object>> getCustomerInfoKfSheetBySiteId(String siteId) {
+        FeiShuConfigEnum configEnum = FeiShuConfigManager.getInstance().getConfigEnum();
+        // 构建client
+        Client client = Client.newBuilder(configEnum.getAppId(), configEnum.getAppSecret()).build();
+
+        SearchAppTableRecordReq req = SearchAppTableRecordReq.newBuilder().appToken(configEnum.getAppToken()).tableId(configEnum.getKfTableId())
+                .searchAppTableRecordReqBody(SearchAppTableRecordReqBody.newBuilder()
+                        .viewId(configEnum.getKfTableSummaryViewId())
+                        .fieldNames(new String[]{"公司名称", "网站ID"})
+                        .filter(FilterInfo.newBuilder()
+                                .conjunction("and")
+                                .conditions(new Condition[] {
+                                        Condition.newBuilder()
+                                                .fieldName("网站ID")
+                                                .operator("is")
+                                                .value(new String[] {
+                                                        siteId
+                                                })
+                                                .build(),
+                                })
+                                .build())
+                        .automaticFields(false)
+                        .build())
+                .build();
+
+        // 发起请求
+        SearchAppTableRecordResp resp = null;
+        try {
+            resp = client.bitable().appTableRecord().search(req);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        // 处理服务端错误
+        if (!resp.success()) {
+            log.error(String.format("code:%s,msg:%s,reqId:%s", resp.getCode(), resp.getMsg(), resp.getRequestId()));
+        }
+
+//        log.info(Jsons.DEFAULT.toJson(resp.getData()));
+
+        List<Map<String, Object>> mapList = new ArrayList<>();
+        if (resp.success()) {
+            SearchAppTableRecordRespBody recordRespBody = resp.getData();
+            AppTableRecord[] items = recordRespBody.getItems();
+            for (AppTableRecord item : items) {
+                Map<String,Object> fieldsObject = item.getFields();
+                fieldsObject.put("record_id",item.getRecordId());
+                mapList.add(fieldsObject);
+            }
+        }
+        // 业务数据处理
+        log.info("mapList:{}", FastJsonUtil.toJSONString(mapList));
+
+        return mapList;
+    }
 }

+ 6 - 0
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/site/service/IOkkiSiteService.java

@@ -35,4 +35,10 @@ public interface IOkkiSiteService extends IService<OkkiSite> {
     public void setApiOkkiSiteUserStr(OkkiSite item, Map<String, Object> mergedList, String key);
 
     public void setOkkiSiteUserStr(OkkiSite item, Map<String, List<OkkiSiteUser>> okkiSiteUsers, String key);
+
+    /**
+     * 保存或更新飞书客户信息
+     * @param siteId
+     */
+    public void saveOrUpdateFeishuSheetFields(String siteId);
 }

+ 192 - 13
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/site/service/impl/OkkiSiteServiceImpl.java

@@ -6,18 +6,22 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.util.FastJsonUtil;
 import org.jeecg.common.util.ThreadPoolUtil;
 import org.jeecg.modules.okki.account.dto.OkkiUserInfoDto;
+import org.jeecg.modules.okki.site.dto.FeiShuRecordSheetDto;
 import org.jeecg.modules.okki.site.entity.OkkiSite;
 import org.jeecg.modules.okki.site.entity.OkkiSiteStatusChangeLog;
 import org.jeecg.modules.okki.site.mapper.OkkiSiteMapper;
 import org.jeecg.modules.okki.site.param.ChangeSiteStatusParam;
 import org.jeecg.modules.okki.site.param.OkkiSiteParam;
 import org.jeecg.modules.okki.site.service.IFeiShuCommonService;
+import org.jeecg.modules.okki.site.service.IFeiShuMsgService;
 import org.jeecg.modules.okki.site.service.IOkkiSiteService;
 import org.jeecg.modules.okki.site.service.IOkkiSiteStatusChangeLogService;
 import org.jeecg.modules.okki.siteuser.entity.OkkiSiteUser;
+import org.jeecg.modules.okki.siteuser.service.IOkkiSiteUserService;
 import org.jeecg.modules.okki.utils.HttpClientUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -30,7 +34,7 @@ import java.util.stream.Collectors;
 /**
  * @Description: 站点
  * @Author: jeecg-boot
- * @Date:   2024-04-29
+ * @Date: 2024-04-29
  * @Version: V1.0
  */
 @Slf4j
@@ -52,6 +56,12 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
     @Autowired
     private IFeiShuCommonService feiShuCommonService;
 
+    @Autowired
+    private IOkkiSiteUserService okkiSiteUserService;
+
+    @Autowired
+    private IFeiShuMsgService feiShuMsgService;
+
     @Override
     public boolean updateBySiteId(OkkiSiteParam okkiSiteParam) {
         QueryWrapper<OkkiSite> okkiSiteQueryWrapper = new QueryWrapper<>();
@@ -71,7 +81,7 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
         int result = okkiSiteMapper.updateById(okkiSite);
         if (result == 0) {
             return false;
-        }else {
+        } else {
             return true;
         }
     }
@@ -87,7 +97,7 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
         query.put("method", "update_service_node");
         // 通过site_id获取当前站点数据status的值 +1
 
-        okkiSite1.setStatus(okkiSite1.getStatus()+1);
+        okkiSite1.setStatus(okkiSite1.getStatus() + 1);
         Map<String, Object> postData = new HashMap<>();
         postData.put("status", okkiSite1.getStatus());
         try {
@@ -100,12 +110,12 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
             String res = HttpClientUtils.doPost(okkiUrl, body);
             log.info(res);
             // {"code":0,"msg":"success","now":"2024-05-06 15:34:54","data":[]}
-            JSONObject jsonObject= JSONObject.parseObject(res);
+            JSONObject jsonObject = JSONObject.parseObject(res);
             if (jsonObject.get("code").equals(0)) {
                 int result = okkiSiteMapper.updateById(okkiSite1);
                 if (result == 0) {
                     return false;
-                }else {
+                } else {
                     OkkiSiteStatusChangeLog okkiSiteStatusChangeLog = new OkkiSiteStatusChangeLog();
                     okkiSiteStatusChangeLog.setOkkiSiteId(okkiSite.getSiteId());
                     okkiSiteStatusChangeLog.setOldStatus(okkiSite1.getStatus() - 1);
@@ -113,7 +123,7 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
                     okkiSiteStatusChangeLogService.save(okkiSiteStatusChangeLog);
                     return true;
                 }
-            }else {
+            } else {
                 throw new RuntimeException(jsonObject.get("msg").toString());
             }
         } catch (Exception e) {
@@ -133,7 +143,7 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
         int result = okkiSiteMapper.updateById(okkiSite);
         if (result == 0) {
             return false;
-        }else {
+        } else {
             OkkiSiteStatusChangeLog okkiSiteStatusChangeLog = new OkkiSiteStatusChangeLog();
             okkiSiteStatusChangeLog.setOkkiSiteId(param.getSite_id());
             okkiSiteStatusChangeLog.setOldStatus(okkiSite1.getStatus());
@@ -148,7 +158,7 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
         OkkiSite okkiSite1 = okkiSiteMapper.selectOne(new LambdaQueryWrapper<OkkiSite>().eq(OkkiSite::getSiteId, okkiSiteParam.getSite_id()));
         if (okkiSite1 != null) {
             throw new RuntimeException("site_id already exist");
-        }else {
+        } else {
             OkkiSite okkiSite = new OkkiSite();
             okkiSite.setSiteId(okkiSiteParam.getSite_id());
             okkiSite.setCompanyName(okkiSiteParam.getCompany_name());
@@ -162,10 +172,10 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
             okkiSite.setTcLanguage(okkiSiteParam.getTc_language());
             okkiSite.setRemark(okkiSiteParam.getRemark());
             boolean result = super.save(okkiSite);
-            if(result){
+            if (result) {
                 ThreadPoolUtil.execute(() -> {
-                    feiShuCommonService.syncWebsiteToFeiShuSheet(okkiSite);}
-                );
+                    feiShuMsgService.sendSyncFeiShuSheetMsg(okkiSite.getCompanyName(), okkiSite.getSiteId(), okkiSite.getTcName(), "成功");
+                });
             }
             return result;
         }
@@ -250,10 +260,10 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
 
     public void setOkkiSiteUserStr(OkkiSite item, Map<String, List<OkkiSiteUser>> okkiSiteUsers, String key) {
         log.info("okkiSiteUsers:{}", FastJsonUtil.toJSONString(okkiSiteUsers));
-        if(!okkiSiteUsers.containsKey(key)){
+        if (!okkiSiteUsers.containsKey(key)) {
             return;
         }
-        List<OkkiSiteUser> okkiSiteUsers1 = FastJsonUtil.parseList(FastJsonUtil.toJSONString(okkiSiteUsers.get(key)),OkkiSiteUser.class);
+        List<OkkiSiteUser> okkiSiteUsers1 = FastJsonUtil.parseList(FastJsonUtil.toJSONString(okkiSiteUsers.get(key)), OkkiSiteUser.class);
         if (!okkiSiteUsers1.isEmpty()) {
 //            log.info("serviceManageUsers (key={}): {}", key, FastJsonUtil.toJSONString(okkiSiteUsers.get(key)));
             List<OkkiUserInfoDto> userInfoList = new ArrayList<>();
@@ -322,4 +332,173 @@ public class OkkiSiteServiceImpl extends ServiceImpl<OkkiSiteMapper, OkkiSite> i
             }
         }
     }
+
+    /**
+     * 保存或更新飞书客户信息
+     *
+     * @param siteId
+     */
+    @Override
+    public void saveOrUpdateFeishuSheetFields(String siteId) {
+        // 获取飞书的团队信息
+        List<String> targetGroups = new ArrayList<>();
+        Map<String, List<JSONObject>> teamSheetMap = feiShuCommonService.getFeiShuTeamSheet(targetGroups);
+//        log.info("teamSheetMap: {}", FastJsonUtil.toJSONString(teamSheetMap));
+
+        // 获取站点用户信息并按类型分组
+        List<OkkiSiteUser> okkiSiteUsers = okkiSiteUserService.getSiteUserInfoBySiteId(Integer.valueOf(siteId));
+        Map<String, List<OkkiSiteUser>> okkiSiteUserMap = okkiSiteUsers.stream()
+                .collect(Collectors.groupingBy(OkkiSiteUser::getType));
+//        log.info("okkiSiteUserMap: {}", FastJsonUtil.toJSONString(okkiSiteUserMap));
+
+        // 获取站点信息
+        List<Map<String, Object>> customerInfo = feiShuCommonService.getCustomerInfoKfSheetBySiteId(siteId);
+//        log.info("customerInfo: {}", FastJsonUtil.toJSONString(customerInfo));
+
+        // Step 4: 判断信息
+        if (!customerInfo.isEmpty()) {
+            handleCustomerInfoUpdate(customerInfo, siteId, okkiSiteUserMap, teamSheetMap);
+        } else {
+            handleSiteSync(siteId, okkiSiteUserMap, teamSheetMap);
+        }
+    }
+
+    /**
+     * 处理客服团队信息的更新逻辑
+     */
+    private void handleCustomerInfoUpdate(List<Map<String, Object>> customerInfo,
+                                          String siteId, Map<String,
+            List<OkkiSiteUser>> okkiSiteUserMap, Map<String, List<JSONObject>> teamSheetMap) {
+        if (customerInfo.size() == 1) {
+            // 初始化飞书更新 DTO
+            String recordId = (String) customerInfo.get(0).get("record_id");
+            FeiShuRecordSheetDto recordSheetDto = new FeiShuRecordSheetDto();
+            recordSheetDto.setRecordId(recordId);
+            recordSheetDto.setOkTablePage("Y");
+            recordSheetDto.setOkTableName("客服团队");
+
+            // 获取更新字段映射
+            Map<String, Object> updateGroupFieldMap = getStringObjectMap(siteId, okkiSiteUserMap, teamSheetMap);
+//            log.info("updateGroupFieldMap: {}", updateGroupFieldMap);
+
+            // 发送更新请求到飞书
+            feiShuCommonService.sendUpdateRequestFeiShuSheet(updateGroupFieldMap, recordSheetDto);
+        } else {
+            log.warn("Multiple customer records found for siteId: {}", siteId);
+        }
+    }
+
+    /**
+     * 处理站点信息同步逻辑
+     */
+    private void handleSiteSync(String siteId,
+                                Map<String, List<OkkiSiteUser>> okkiSiteUserMap,
+                                Map<String, List<JSONObject>> teamSheetMap) {
+        // 查询站点信息
+        List<OkkiSite> okkiSites = list(new QueryWrapper<OkkiSite>().eq("site_id", siteId));
+        if (!okkiSites.isEmpty()) {
+            OkkiSite okkiSite = okkiSites.get(0);
+
+            // 获取更新字段映射
+            Map<String, Object> updateGroupFieldMap = getStringObjectMap(siteId, okkiSiteUserMap, teamSheetMap);
+//            log.info("updateGroupFieldMap: {}", updateGroupFieldMap);
+
+            // 同步网站信息到飞书
+            feiShuCommonService.syncWebsiteToFeiShuSheet(okkiSite, updateGroupFieldMap);
+        }
+    }
+
+    /**
+     * 获取需要更新的用户类型与对应的飞书字段
+     *
+     * @param siteId
+     * @param okkiSiteUserMap
+     * @param teamSheetMap
+     * @return
+     */
+    private Map<String, Object> getStringObjectMap(String siteId, Map<String, List<OkkiSiteUser>> okkiSiteUserMap, Map<String, List<JSONObject>> teamSheetMap) {
+        Map<String, String> userTypeToFieldMap = new HashMap<>();
+        userTypeToFieldMap.put("serviceManageUser", "OMS-服务主管");
+        userTypeToFieldMap.put("dataUser", "OMS-资料专员");
+        userTypeToFieldMap.put("kefuUser", "OMS-建站顾问");
+        userTypeToFieldMap.put("seoUser", "OMS-SEO专员");
+        userTypeToFieldMap.put("semManageUser", "OMS-SEM主管");
+        userTypeToFieldMap.put("semUser", "OMS-SEM专员");
+        userTypeToFieldMap.put("uiUser", "OMS-设计师");
+        userTypeToFieldMap.put("websiteUser", "OMS-建站专员");
+        userTypeToFieldMap.put("socialUser", "OMS-社媒专员");
+        userTypeToFieldMap.put("rdUser", "OMS-技术");
+
+        Map<String, Object> updateGroupFieldMap = new HashMap<>();
+
+        // 按用户类型处理用户信息并提取 OpenID
+        userTypeToFieldMap.forEach((userType, fieldName) -> {
+            List<OkkiSiteUser> users = okkiSiteUserMap.getOrDefault(userType, Collections.emptyList());
+            if (users.isEmpty()) {
+                log.warn("No users found for type: {} and siteId: {}", userType, siteId);
+                return;
+            }
+
+            // 按 OMS ID 分组
+            Map<String, List<OkkiSiteUser>> usersOmsIdMap = users.stream()
+                    .collect(Collectors.groupingBy(OkkiSiteUser::getId));
+//            log.info("{}OmsIdMap: {}", userType, FastJsonUtil.toJSONString(usersOmsIdMap));
+
+            // 提取并更新 OpenID
+            List<Map<String, Object>> openIds = extractAndUpdateOpenIds(teamSheetMap, usersOmsIdMap);
+//            log.info("Updated OpenIDs for {}: {}", userType, FastJsonUtil.toJSONString(openIds));
+
+            // 添加到更新字段映射
+            updateGroupFieldMap.put(fieldName, openIds);
+        });
+        return updateGroupFieldMap;
+    }
+
+    /**
+     * 提取并更新用户的 OpenID
+     *
+     * @param teamSheetMap  飞书团队信息
+     * @param usersOmsIdMap 用户 OMS ID 分组
+     * @return 更新后的 OpenID 列表
+     */
+    private List<Map<String, Object>> extractAndUpdateOpenIds(Map<String, List<JSONObject>> teamSheetMap,
+                                                              Map<String, List<OkkiSiteUser>> usersOmsIdMap) {
+        List<Map<String, Object>> openIds = new ArrayList<>();
+        for (Map.Entry<String, List<JSONObject>> teamEntry : teamSheetMap.entrySet()) {
+            String omsId = teamEntry.getKey();
+            if (!usersOmsIdMap.containsKey(omsId)) {
+                continue;
+            }
+
+            String openId = extractOpenIdFromTeamDetails(teamEntry.getValue());
+            if (StringUtils.isNotBlank(openId)) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", openId);
+                openIds.add(map);
+            }
+        }
+        return openIds;
+    }
+
+    /**
+     * 从团队详情中提取 OpenID
+     *
+     * @param teamDetails 团队详情列表
+     * @return 提取的 OpenID
+     */
+    private String extractOpenIdFromTeamDetails(List<JSONObject> teamDetails) {
+        for (JSONObject group : teamDetails) {
+            JSONArray personnelArray = group.getJSONArray("人员");
+            if (personnelArray != null) {
+                for (int i = 0; i < personnelArray.size(); i++) {
+                    JSONObject person = personnelArray.getJSONObject(i);
+                    String id = person.getString("id");
+                    if (StringUtils.isNotBlank(id)) {
+                        return id;
+                    }
+                }
+            }
+        }
+        return null;
+    }
 }

+ 6 - 0
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/siteuser/entity/OkkiSiteUser.java

@@ -48,4 +48,10 @@ public class OkkiSiteUser implements Serializable {
 
     @TableField(exist = false)
     private String account;
+
+    @TableField(exist = false)
+    private String id;
+
+    @TableField(exist = false)
+    private String openId;
 }

+ 1 - 1
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/siteuser/mapper/OkkiSiteUserMapper.java

@@ -16,5 +16,5 @@ public interface OkkiSiteUserMapper extends BaseMapper<OkkiSiteUser> {
 
     public List<OkkiSiteUser> getSiteUserInfoBySiteId(Integer siteId);
 
-    public List<OkkiSiteUser> getSiteUserInfoByUserId(Integer siteId);
+    public List<OkkiSiteUser> getSiteUserInfoByUserId(Integer userId);
 }

+ 2 - 2
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/okki/siteuser/mapper/xml/OkkiSiteUserMapper.xml

@@ -3,12 +3,12 @@
 <mapper namespace="org.jeecg.modules.okki.siteuser.mapper.OkkiSiteUserMapper">
 
     <select id="getSiteUserInfoBySiteId" resultType="org.jeecg.modules.okki.siteuser.entity.OkkiSiteUser">
-        SELECT t1.*,t2.name as nickname,t2.account FROM `okki_site_user` t1 LEFT JOIN okki_account t2 on t1.user_id = t2.user_id
+        SELECT t1.*,t2.name as nickname,t2.account,t2.id FROM `okki_site_user` t1 LEFT JOIN okki_account t2 on t1.user_id = t2.user_id
         where t1.site_id = #{siteId}
     </select>
 
     <select id="getSiteUserInfoByUserId" resultType="org.jeecg.modules.okki.siteuser.entity.OkkiSiteUser">
-        SELECT t1.*,t2.name as nickname,t2.account FROM `okki_site_user` t1 LEFT JOIN okki_account t2 on t1.user_id = t2.user_id
+        SELECT t1.*,t2.name as nickname,t2.account,t2.id FROM `okki_site_user` t1 LEFT JOIN okki_account t2 on t1.user_id = t2.user_id
         where t1.user_id = #{userId}
     </select>