Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

yys 3 месяцев назад
Родитель
Сommit
063b318723

+ 9 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -498,8 +498,16 @@ public class QwExternalContactController extends BaseController
     @PostMapping("/delTag")
     public R delTag(@RequestBody QwExternalContactAddTagParam Param)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+
+        String url = OpenQwConfig.baseApi + "/delTag?tenantId=" + loginUser.getTenantId();
+        String result = HttpUtil.createPost(url)
+                .body(JSON.toJSONString(Param))
+                .execute()
+                .body();
+        return JSONObject.parseObject(result, R.class);
 
-        return qwExternalContactService.delUserTag(Param);
+//        return qwExternalContactService.delUserTag(Param);
     }
 
     @PreAuthorize("@ss.hasPermi('qw:externalContact:delTag')")

+ 14 - 0
fs-qw-api/src/main/java/com/fs/app/controller/OpenQwApiController.java

@@ -112,5 +112,19 @@ public class OpenQwApiController extends BaseController {
             tenantDataSourceManager.clear();
         }
     }
+
+    /**
+     * 移除标签
+     */
+    @PostMapping("/delTag")
+    public R delTag(@RequestBody QwExternalContactAddTagParam param, @RequestParam(value = "tenantId", required = true) Long tenantId){
+        tenantDataSourceManager.ensureSwitchByTenantId(tenantId);
+
+        try {
+            return openQwApiService.delTag(param);
+        } finally {
+            tenantDataSourceManager.clear();
+        }
+    }
 }
 

+ 2 - 0
fs-qw-api/src/main/java/com/fs/app/service/OpenQwApiService.java

@@ -17,4 +17,6 @@ public interface OpenQwApiService {
     int edit(QwExternalContact qwExternalContact);
 
     R addTag(QwExternalContactAddTagParam param);
+
+    R delTag(QwExternalContactAddTagParam param);
 }

+ 133 - 0
fs-qw-api/src/main/java/com/fs/app/service/impl/OpenQwApiServiceImpl.java

@@ -489,6 +489,139 @@ public class OpenQwApiServiceImpl implements OpenQwApiService {
         return R.ok("成功:" + suc.get() + ",失败:" + failList);
     }
 
+    @Override
+    public R delTag(QwExternalContactAddTagParam param) {
+        // 获取当前日期和时间
+        LocalDate currentDate = LocalDate.now();
+        LocalTime localTime = LocalTime.now();
+
+        // 使用线程安全的计数器
+        AtomicInteger suc = new AtomicInteger(0);
+
+        List<String> failList = new CopyOnWriteArrayList<>(); // 记录失败客户的名字
+
+        // 创建线程池
+        int threadCount = Math.min(8, Runtime.getRuntime().availableProcessors() * 2);
+        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
+
+
+        try {
+            // 使用线程安全的List来收集需要批量更新的数据
+            List<QwExternalContact> batchUpdateList = Collections.synchronizedList(new ArrayList<>());
+
+            // 存储Future对象以便检查所有任务完成情况
+            List<Future<?>> futures = new ArrayList<>();
+
+
+            // 1. 批量查询所有用户数据
+            List<QwExternalContact> contacts;
+            try {
+                contacts = qwExternalContactMapper.selectQwExternalContactByIds(param.getUserIds());
+                if (contacts == null || contacts.isEmpty()) {
+                    return R.error("成功:0,失败:" + param.getUserIds().size());
+                }
+            } catch (Exception e) {
+                return R.error("批量查询用户数据失败:"+e.getMessage());
+            }
+
+            // 直接遍历contacts而不是userIds
+            for (QwExternalContact qwExternalContact : contacts) {
+                futures.add(executor.submit(() -> {
+                    try {
+                        QwEditUserTagParam qwEditUserTagParam = new QwEditUserTagParam();
+                        qwEditUserTagParam.setRemove_tag(param.getTagIds());
+                        qwEditUserTagParam.setUserid(qwExternalContact.getUserId());
+                        qwEditUserTagParam.setExternal_userid(qwExternalContact.getExternalUserId());
+
+                        QwResult qwResult = qwApiService.editUserTag(qwEditUserTagParam, param.getCorpId());
+                        if (qwResult.getErrcode() == 0) {
+
+                            String tagIds = qwExternalContact.getTagIds();
+                            if (tagIds != null && tagIds != "") {
+                                List<String> ids = JSON.parseArray(tagIds, String.class);
+                                for (String tagId : param.getTagIds()) {
+                                    ids.removeIf(str -> str.equals(tagId));
+                                }
+
+                                QwExternalContact qwExternal = new QwExternalContact();
+                                qwExternal.setId(qwExternalContact.getId());
+                                qwExternal.setTagIds(JSON.toJSONString(ids));
+
+
+                                log.info("客户移除标签delUserTag:"+qwExternalContact.getName()+"|公司"+qwExternalContact.getCorpId()+"|员工"+qwExternalContact.getUserId()+"|总标签"+ids);
+
+                                //检查sop
+                                processTagsAll(qwExternalContact,param.getCorpId(),ids,currentDate,localTime);
+
+                                // 添加到批量更新列表
+                                batchUpdateList.add(qwExternal);
+                            }
+
+                            suc.incrementAndGet();
+                        } else {
+                            failList.add("【"+qwExternalContact.getName()+"】" + "原因:(" + getErrorMsg(qwResult.getErrcode()) + ")\n");
+                        }
+                    } catch (Exception e) {
+                        log.error("客户移除标签delUserTag失败,userId: " + qwExternalContact.getId() +
+                                ", externalUserId: " + qwExternalContact.getExternalUserId() +
+                                ", 错误信息: " + e.getMessage());
+                        failList.add("【"+qwExternalContact.getName()+"】" + "原因:(" + e.getMessage() + ")\n");
+                    }
+                }));
+            }
+
+
+            // 等待所有任务完成
+            for (Future<?> future : futures) {
+                try {
+                    future.get();
+                } catch (InterruptedException | ExecutionException e) {
+                    log.error("任务执行异常: " + e.getMessage());
+                    Thread.currentThread().interrupt();
+                }
+            }
+
+            // 批量更新数据库
+            if (!batchUpdateList.isEmpty()) {
+                try {
+                    // 分批处理,避免单次批量过大
+                    int batchSize = 500; // 根据数据库性能调整
+                    for (int i = 0; i < batchUpdateList.size(); i += batchSize) {
+                        int end = Math.min(i + batchSize, batchUpdateList.size());
+                        List<QwExternalContact> subList = batchUpdateList.subList(i, end);
+                        qwExternalContactMapper.batchUpdateQwExternalContactByTags(subList);
+                    }
+                } catch (Exception e) {
+                    log.error("批量更新失败: " + e.getMessage());
+                }
+            }
+
+            // 关闭线程池
+            executor.shutdown();
+
+        }catch (Exception e){
+            failList.add("处理过程中发生异常:"+e.getMessage());
+        }finally {
+
+            // 7. 确保线程池关闭
+            try {
+                // 先尝试正常关闭
+                executor.shutdown();
+                if (!executor.awaitTermination(15, TimeUnit.SECONDS)) {
+                    // 超时后强制关闭
+                    executor.shutdownNow();
+                    log.warn("线程池强制关闭");
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                executor.shutdownNow();
+            }
+        }
+
+
+        return R.ok("成功:" + suc.get() + ",失败:" + failList);
+    }
+
     @Autowired
     private QwSopMapper qwSopMapper;