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