zss
7 小时以前 8d6e5b78fc08c66a913badc9b9863ded208e186b
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();
    /**
     * 查询客户档案
@@ -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("同步正在进行中,本次 {} 同步请求被跳过", 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;
            }
            // 解析并保存数据
            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;
    }
}