|
@@ -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;
|
|
|
+ }
|
|
|
}
|