From 8d6e5b78fc08c66a913badc9b9863ded208e186b Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期六, 14 三月 2026 13:53:06 +0800
Subject: [PATCH] 同步宜搭客户信息(定时任务)

---
 src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java |  142 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 138 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index b7cb426..080314c 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ruoyi.basic.service.impl;
 
 
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,23 +22,33 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.config.AliDingConfig;
 import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.util.AliDingUtils;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.enums.MaterialConfigTypeEnum;
+import com.ruoyi.production.pojo.ProductMaterial;
+import com.ruoyi.production.pojo.ProductMaterialSku;
+import com.ruoyi.productionPlan.enums.DataSourceTypeEnum;
+import com.ruoyi.productionPlan.pojo.ProductionPlan;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 
@@ -58,6 +70,13 @@
     private CustomerFollowUpFileService customerFollowUpFileService;
 
     private CustomerReturnVisitService customerReturnVisitService;
+
+    private AliDingConfig aliDingConfig;
+
+    /**
+     * 鍚屾閿侊紝闃叉鎵嬪姩鍜屽畾鏃朵换鍔″悓鏃舵墽琛�
+     */
+    private final ReentrantLock syncLock = new ReentrantLock();
 
     /**
      * 鏌ヨ瀹㈡埛妗f
@@ -256,6 +275,11 @@
     }
 
     @Override
+    public void syncCustomerJob() {
+        syncCustomerData(2);
+    }
+
+    @Override
     public List<Map<String, Object>> customerList(Customer customer) {
         LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber);
@@ -292,4 +316,114 @@
         }
         return sb.toString();
     }
+
+
+    /**
+     * 鍚屾鏁版嵁
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void syncCustomerData(Integer dataSyncType) {
+        if (!syncLock.tryLock()) {
+            log.warn("鍚屾姝e湪杩涜涓紝鏈 {} 鍚屾璇锋眰琚烦杩�", dataSyncType == 1 ? "鎵嬪姩" : "瀹氭椂浠诲姟");
+            return;
+        }
+        try {
+            JSONArray searchConditions = new JSONArray();
+            JSONObject statusCondition = new JSONObject();
+            statusCondition.put("key", "processInstanceStatus");
+            JSONArray statusValueArray = new JSONArray();
+            statusValueArray.add("COMPLETED");
+            statusCondition.put("value", statusValueArray);
+            statusCondition.put("type", "ARRAY");
+            statusCondition.put("operator", "in");
+            statusCondition.put("componentName", "SelectField");
+            searchConditions.add(statusCondition);
+
+            JSONObject resultCondition = new JSONObject();
+            resultCondition.put("key", "processApprovedResult");
+            JSONArray resultValueArray = new JSONArray();
+            resultValueArray.add("agree");
+            resultCondition.put("value", resultValueArray);
+            resultCondition.put("type", "ARRAY");
+            resultCondition.put("operator", "in");
+            resultCondition.put("componentName", "SelectField");
+            searchConditions.add(resultCondition);
+
+            String searchFieldJson = searchConditions.toJSONString();
+
+            JSONArray dataArr = AliDingUtils.getFormDataList(aliDingConfig, aliDingConfig.getCustomerCodeFormUuid(), searchFieldJson, this, Customer::getFormModifiedTime);
+
+            if (dataArr.isEmpty()) {
+                log.info("娌℃湁鏇村鏂版暟鎹渶瑕佸悓姝�");
+                return;
+            }
+
+            // 瑙f瀽骞朵繚瀛樻暟鎹�
+            List<Customer> list = parseCustomer(dataArr);
+            if (!list.isEmpty()) {
+                // 澶勭悊鏇存柊鎴栨柊澧�
+                int affected = processSaveOrUpdate(list);
+                log.info("瀹㈡埛鏁版嵁鍚屾瀹屾垚锛屽叡鍚屾 {} 鏉℃暟鎹�", affected);
+            }
+
+        } catch (Exception e) {
+            log.error("鍚屾瀹㈡埛淇℃伅寮傚父", e);
+        } finally {
+            // 閲婃斁閿�
+            syncLock.unlock();
+        }
+    }
+
+    private List<Customer> parseCustomer(JSONArray dataArr) {
+        List<Customer> list = new ArrayList<>();
+        for (int i = 0; i < dataArr.size(); i++) {
+            JSONObject item = dataArr.getJSONObject(i);
+            String formInstanceId = item.getString("formInstanceId");
+            JSONObject formData = item.getJSONObject("formData");
+            Customer customer = new Customer();
+            customer.setCustomerName(formData.getString("textField_l7fwg8uh"));
+            customer.setTaxpayerIdentificationNumber(formData.getString("textField_l88df8ae"));
+            customer.setCompanyAddress(formData.getString("textField_l7fwg8uj"));
+            customer.setCompanyPhone(formData.getString("textField_lb38bng2"));
+            customer.setContactPerson(formData.getString("textField_l7fwg8ut"));
+            customer.setContactPhone(formData.getString("textField_l7fwg8uu"));
+            customer.setMaintainer("绠$悊鍛樿处鍙�");
+            LocalDateTime dateTime = AliDingUtils.parseUtcTime(item.getString("modifiedTimeGMT"));
+            ZoneId zoneId = ZoneId.of("Asia/Shanghai");
+            Date date = Date.from(dateTime.atZone(zoneId).toInstant());
+            customer.setMaintenanceTime(date);
+            customer.setFormInstanceId(formInstanceId);
+            customer.setFormModifiedTime(dateTime);
+            list.add(customer);
+        }
+        return list;
+    }
+
+    private int processSaveOrUpdate(List<Customer> list) {
+        if (list == null || list.isEmpty()) {
+            return 0;
+        }
+        int affected = 0;
+
+        for (Customer customer : list) {
+
+            LambdaQueryWrapper<Customer> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(Customer::getFormInstanceId, customer.getFormInstanceId());
+
+            Customer exist = this.getOne(wrapper);
+            if (exist == null) {
+                this.save(customer);
+                affected++;
+                log.info("鏂板瀹㈡埛淇℃伅 {}", customer.getCustomerName());
+            } else {
+                if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(customer.getFormModifiedTime())) {
+                    customer.setId(exist.getId());
+                    this.updateById(customer);
+                    affected++;
+                    log.info("鏇存柊瀹㈡埛淇℃伅 {}", customer.getCustomerName());
+                }
+            }
+        }
+        return affected;
+    }
 }

--
Gitblit v1.9.3