zss
9 小时以前 8d6e5b78fc08c66a913badc9b9863ded208e186b
同步宜搭客户信息(定时任务)
已添加1个文件
已修改3个文件
169 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/service/ICustomerService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/task/CustomerTask.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/config/AliDingConfig.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -78,4 +78,8 @@
    List<Customer> selectCustomerLists(Customer customer);
    AjaxResult importData(MultipartFile file);
    //同步客户数据
    void syncCustomerJob();
}
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;
    }
}
src/main/java/com/ruoyi/basic/task/CustomerTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.task;
import com.ruoyi.basic.service.ICustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class CustomerTask {
    @Autowired
    private ICustomerService customerService;
    @Scheduled(cron = "0 0 * * * ?")
    public void syncCustomerDataJob() {
        customerService.syncCustomerJob();
    }
}
src/main/java/com/ruoyi/framework/config/AliDingConfig.java
@@ -53,6 +53,11 @@
    private String materialCodeFormUuid;
    /**
     * å®¢æˆ·ä¿¡æ¯-宜搭表单ID
     */
    private String customerCodeFormUuid;
    /**
     * å®œæ­åº”用密钥
     * ç”¨äºŽè®¿é—®å®œæ­è¡¨å• API
     */