gongchunyi
4 天以前 0674b30cb6e106ca23d432430aad1cad93cbbc99
refactor: 合并生产需求子表
已添加9个文件
已修改3个文件
已删除13个文件
1053 ■■■■ 文件已修改
doc/宁夏-中盛建材.sql 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/http/HttpUtils.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandDetailController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandMainController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandDetailMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandMainMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandDetail.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandMain.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/ProdDemandDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/ProdDemandMainService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandDetailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandMainServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/prodDemand/task/ProdDemandTask.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/mapper/ProductionPlanMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProdDemandService.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/task/ProductionPlanTask.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zsjc.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/prodDemand/ProdDemandDetailMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/prodDemand/ProdDemandMainMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/com/ruoyi/productionPlan/service/ProdDemandServiceTest.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -1,53 +1,34 @@
CREATE TABLE `prod_demand_main`
CREATE TABLE `production_plan`
(
    `id`                 bigint(20)  NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `tenant_id`          bigint(20)  NOT NULL COMMENT '租户编号',
    `dept_id`            bigint(20)   DEFAULT NULL COMMENT '部门ID (用于数据权限隔离)',
    `form_instance_id`   varchar(64) NOT NULL COMMENT '表单实例唯一ID (关联子表用)',
    `serial_no`          varchar(64)  DEFAULT NULL COMMENT '单据流水号 (serialNo)',
    `title`              varchar(128) DEFAULT NULL COMMENT '单据标题 (title)',
    `originator_user_id` varchar(64)  DEFAULT NULL COMMENT '第三方发起人ID (creatorUserId)',
    `originator_name`    varchar(64)  DEFAULT NULL COMMENT '第三方发起人姓名 (originator.userName)',
    `biz_create_time`    datetime     DEFAULT NULL COMMENT '第三方单据创建时间 (createdTimeGMT)',
    `project_name`       varchar(128) DEFAULT NULL COMMENT '项目名称/客户 (textField_lbkozohg)',
    `batch_no`           varchar(128) DEFAULT NULL COMMENT '批次/关联编号 (textField_l7fytfco)',
    `contact_person`     varchar(128) DEFAULT NULL COMMENT '联系人/备注 (textareaField_l7fytfcy)',
    `ext_text1`          varchar(128) DEFAULT NULL COMMENT '预留文本1 (textField_l7fytfcx)',
    `ext_text2`          varchar(128) DEFAULT NULL COMMENT '预留文本2 (textField_lbknlltp)',
    `create_user`        bigint(20)   DEFAULT NULL COMMENT '创建者',
    `create_time`        datetime     DEFAULT NULL COMMENT '创建时间',
    `update_user`        bigint(20)   DEFAULT NULL COMMENT '更新者',
    `update_time`        datetime     DEFAULT NULL COMMENT '更新时间',
    `remark`             varchar(500) DEFAULT NULL COMMENT '备注',
    `id`                  BIGINT      NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `form_instance_id`    VARCHAR(64) NOT NULL COMMENT '表单实例ID',
    `serial_no`           VARCHAR(64)    DEFAULT NULL COMMENT '单据流水号',
    `title`               VARCHAR(128)   DEFAULT NULL COMMENT '单据标题',
    `originator_user_id`  VARCHAR(64)    DEFAULT NULL COMMENT '发起人ID',
    `originator_name`     VARCHAR(64)    DEFAULT NULL COMMENT '发起人姓名',
    `biz_create_time`     DATETIME       DEFAULT NULL COMMENT '单据创建时间',
    `project_name`        VARCHAR(128)   DEFAULT NULL COMMENT '项目名称',
    `batch_no`            VARCHAR(128)   DEFAULT NULL COMMENT '批次号',
    `contact_person`      VARCHAR(128)   DEFAULT NULL COMMENT '联系人',
    `ext_text1`           VARCHAR(128)   DEFAULT NULL COMMENT '预留1',
    `ext_text2`           VARCHAR(128)   DEFAULT NULL COMMENT '预留2',
    `material_code`       VARCHAR(64)    DEFAULT NULL COMMENT '物料编码',
    `material_category`   VARCHAR(64)    DEFAULT NULL COMMENT '物料分类',
    `spec_desc`           VARCHAR(128)   DEFAULT NULL COMMENT '规格描述',
    `grade_type`          VARCHAR(32)    DEFAULT NULL COMMENT '等级',
    `length`              DECIMAL(10, 2) DEFAULT NULL COMMENT '长度',
    `width`               DECIMAL(10, 2) DEFAULT NULL COMMENT '宽度',
    `thickness`           DECIMAL(10, 2) DEFAULT NULL COMMENT '厚度',
    `quantity`            INT            DEFAULT NULL COMMENT '数量',
    `volume`              DECIMAL(10, 4) DEFAULT NULL COMMENT '总体积',
    `date_start`          DATETIME       DEFAULT NULL COMMENT '开始时间',
    `date_end`            DATETIME       DEFAULT NULL COMMENT '结束时间',
    `association_receipt` TEXT COMMENT '关联单据',
    `data_sync_type`      TINYINT        DEFAULT 1 COMMENT '数据方式: 1=手动 2=定时',
    `data_source_type`    TINYINT        DEFAULT 1 COMMENT '数据来源: 1=销售订单 2=生产预测',
    `create_time`         DATETIME       DEFAULT CURRENT_TIMESTAMP,
    `update_time`         DATETIME       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_form_instance_id` (`form_instance_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产需求';
CREATE TABLE `prod_demand_detail`
(
    `id`                  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `tenant_id`           bigint(20) NOT NULL COMMENT '租户编号',
    `prod_demand_main_id` bigint(20) NOT NULL COMMENT '父类关联ID',
    `material_code`       varchar(64)    DEFAULT NULL COMMENT '物料编码 (textField_l9xo62q5)',
    `material_category`   varchar(64)    DEFAULT NULL COMMENT '物料分类 (textField_l9xo62q7)',
    `spec_desc`           varchar(128)   DEFAULT NULL COMMENT '规格描述 (textField_l9xo62q8)',
    `grade_type`          varchar(32)    DEFAULT NULL COMMENT '等级/类型 (radioField_m9urarr2)',
    `length`              decimal(10, 2) DEFAULT NULL COMMENT '长度 (numberField_lb7lgatg)',
    `width`               decimal(10, 2) DEFAULT NULL COMMENT '宽度 (numberField_lb7lgath)',
    `thickness`           decimal(10, 2) DEFAULT NULL COMMENT '厚度 (numberField_lb7lgati)',
    `quantity`            int(11)        DEFAULT NULL COMMENT '数量 (numberField_lb7lgatj)',
    `volume`              decimal(10, 4) DEFAULT NULL COMMENT '总体积 (numberField_l7fytfd3)',
    `date_range`          varchar(255)   DEFAULT NULL COMMENT '时间区间数组字符串 (cascadeDateField_lfxqqluw)',
    `association_receipt` text           DEFAULT NULL COMMENT '关联的其他单据 (associationFormField_l9xo62q6_id)',
    `create_user`         bigint(20)     DEFAULT NULL COMMENT '创建者',
    `create_time`         datetime       DEFAULT NULL COMMENT '创建时间',
    `update_user`         bigint(20)     DEFAULT NULL COMMENT '更新者',
    `update_time`         datetime       DEFAULT NULL COMMENT '更新时间',
    `remark`              varchar(500)   DEFAULT NULL COMMENT '备注',
    PRIMARY KEY (`id`),
    KEY `idx_prod_demand_main_id` (`prod_demand_main_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产需求_明细表';
    KEY `idx_form_instance_id` (`form_instance_id`)
) ENGINE = INNODB
  DEFAULT CHARSET = utf8mb4 COMMENT = '销售生产需求';
src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
@@ -25,7 +25,7 @@
/**
 * é€šç”¨http发送方法
 *
 *
 * @author ruoyi
 */
public class HttpUtils
@@ -132,7 +132,7 @@
    /**
     * å‘指定 URL å‘送POST方法的请求
     *
     *
     * @param url å‘送请求的 URL
     * @param param è¯·æ±‚参数
     * @param contentType å†…容类型
@@ -299,7 +299,7 @@
     */
    public static String sendPostJson(String url, String jsonParam) {
        // é‡è½½è°ƒç”¨ï¼Œé»˜è®¤ä½¿ç”¨UTF-8编码,Content-Type固定为application/json
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),null);
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(), null, "");
    }
    /**
@@ -311,7 +311,7 @@
     */
    public static String sendPostJson(String url, String jsonParam, String headerValue) {
        // é‡è½½è°ƒç”¨ï¼Œé»˜è®¤ä½¿ç”¨UTF-8编码,Content-Type固定为application/json
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),headerValue);
        return sendPostJson(url, jsonParam, StandardCharsets.UTF_8.name(),headerValue,"");
    }
    /**
@@ -321,7 +321,7 @@
     * @param charset ç¼–码类型(如UTF-8、GBK等,建议使用StandardCharsets常量)
     * @return è¿œç¨‹èµ„源的响应结果
     */
    public static String sendPostJson(String url, String jsonParam, String charset,String headerValue) {
    public static String sendPostJson(String url, String jsonParam, String charset,String headerValue,String accessToken) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
@@ -340,6 +340,9 @@
            if(StringUtils.isNotEmpty(headerValue)){
                conn.setRequestProperty("Authorization", headerValue);
            }
            if (StringUtils.isNotEmpty(accessToken)) {
                conn.setRequestProperty("x-acs-dingtalk-access-token", accessToken);
            }
            // 2. å¼€å¯è¾“入输出流(POST请求必须)
            conn.setDoOutput(true);
            conn.setDoInput(true);
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandDetailController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/controller/ProdDemandMainController.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandDetailMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/mapper/ProdDemandMainMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandDetail.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/pojo/ProdDemandMain.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/ProdDemandDetailService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/ProdDemandMainService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandDetailServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/service/impl/ProdDemandMainServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/prodDemand/task/ProdDemandTask.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.productionPlan.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚控制层
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:01
 */
@RestController
@RequestMapping("/productionPlan")
public class ProductionPlanController {
}
src/main/java/com/ruoyi/productionPlan/mapper/ProductionPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.productionPlan.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚Mapper
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 9:56
 */
public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> {
}
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.ruoyi.productionPlan.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 9:54
 */
@Data
@TableName("production_plan")
public class ProductionPlan {
    /**
     * è‡ªå¢žä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * è¡¨å•实例ID
     */
    private String formInstanceId;
    /**
     * å•据流水号
     */
    private String serialNo;
    /**
     * å•据标题
     */
    private String title;
    /**
     * å‘起人ID
     */
    private String originatorUserId;
    /**
     * å‘起人姓名
     */
    private String originatorName;
    /**
     * å•据创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime bizCreateTime;
    /**
     * é¡¹ç›®åç§°
     */
    private String projectName;
    /**
     * æ‰¹æ¬¡å·
     */
    private String batchNo;
    /**
     * è”系人
     */
    private String contactPerson;
    /**
     * é¢„ç•™1
     */
    private String extText1;
    /**
     * é¢„ç•™2
     */
    private String extText2;
    /**
     * ç‰©æ–™ç¼–码
     */
    private String materialCode;
    /**
     * ç‰©æ–™åˆ†ç±»
     */
    private String materialCategory;
    /**
     * è§„格描述
     */
    private String specDesc;
    /**
     * ç­‰çº§
     */
    private String gradeType;
    /**
     * é•¿åº¦
     */
    private BigDecimal length;
    /**
     * å®½åº¦
     */
    private BigDecimal width;
    /**
     * åŽšåº¦
     */
    private BigDecimal thickness;
    /**
     * æ•°é‡
     */
    private Integer quantity;
    /**
     * æ€»ä½“积
     */
    private BigDecimal volume;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateStart;
    /**
     * ç»“束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateEnd;
    /**
     * å…³è”单据
     */
    private String associationReceipt;
    /**
     * æ•°æ®æ–¹å¼: 1=手动 2=定时
     */
    private Integer dataSyncType;
    /**
     * æ•°æ®æ¥æº: 1=销售订单 2=生产预测
     */
    private Integer dataSourceType;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.productionPlan.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚接口
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:00
 */
public interface ProductionPlanService extends IService<ProductionPlan> {
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProdDemandService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
package com.ruoyi.productionPlan.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.AliDingConfig;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
/**
 * <br>
 * æ‹‰å–钉钉数据并导入
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/09 17:31
 */
@Slf4j
@Service
public class ProdDemandService {
    @Autowired
    private ProductionPlanService productionPlanService;
    @Autowired
    private AliDingConfig aliDingConfig;
    @Transactional(rollbackFor = Exception.class)
    public void LoadProdDemandData(Integer currentPage, Integer pageSize) {
        System.out.println("aliDingConfig = " + aliDingConfig);
        String params = "appkey=" + "dingjnydbagc9ol7cwq4" + "&appsecret=" + "fO07qSZC5SMLw9It3Ydd3BuoFyVbRlsWXUnVr2kwPJXz0OpUntCAO5dqnr8G7zq5";
        String tokenRes = HttpUtils.sendGet(aliDingConfig.getAccessTokenUrl(), params);
        JSONObject tokenObj = JSON.parseObject(tokenRes);
        String accessToken = tokenObj.getString("access_token");
        if (StringUtils.isEmpty(accessToken)) {
            log.error("获取钉钉 AccessToken å¤±è´¥ï¼Œè¿”回结果:{}", tokenRes);
            return;
        }
        log.info("成功获取钉钉 AccessToken: {}", accessToken);
        JSONObject searchParam = new JSONObject();
        searchParam.put("appType", aliDingConfig.getAppType());
        searchParam.put("systemToken", aliDingConfig.getSystemToken());
        searchParam.put("userId", aliDingConfig.getUserId());
        searchParam.put("formUuid", aliDingConfig.getFormUuid());
        if (currentPage == null || currentPage <= 0) {
            currentPage = 1;
        }
        searchParam.put("currentPage", currentPage);
        if (pageSize == null || pageSize <= 0) {
            pageSize = 1;
        }
        searchParam.put("pageSize", pageSize);
        String dataRes = HttpUtils.sendPostJson(
                aliDingConfig.getSearchFormDataUrl(),
                searchParam.toJSONString(),
                StandardCharsets.UTF_8.name(),
                null,
                accessToken
        );
        if (StringUtils.isEmpty(dataRes)) {
            log.error("拉取宜搭表单数据为空!");
            return;
        }
        JSONObject resultObj = JSON.parseObject(dataRes);
        JSONArray dataArr = resultObj.getJSONArray("data");
        if (dataArr == null || dataArr.isEmpty()) {
            log.warn("没有获取到表单数据");
            return;
        }
        List<ProductionPlan> list = new ArrayList<>();
        for (int i = 0; i < dataArr.size(); i++) {
            JSONObject item = dataArr.getJSONObject(i);
            String formInstanceId = item.getString("formInstanceId");
            String serialNo = item.getString("serialNo");
            String title = item.getString("title");
            JSONObject originator = item.getJSONObject("originator");
            String originatorUserId = originator.getString("userId");
            String originatorName = originator.getJSONObject("userName").getString("nameInChinese");
            JSONObject formData = item.getJSONObject("formData");
            String projectName = formData.getString("textField_lbkozohg");
            String batchNo = formData.getString("textField_l7fytfco");
            String contactPerson = formData.getString("textareaField_l7fytfcy");
            JSONArray tableArr = formData.getJSONArray("tableField_l7fytfcn");
            if (tableArr == null) {
                continue;
            }
            for (int j = 0; j < tableArr.size(); j++) {
                JSONObject row = tableArr.getJSONObject(j);
                ProductionPlan plan = new ProductionPlan();
                plan.setFormInstanceId(formInstanceId);
                plan.setSerialNo(serialNo);
                plan.setTitle(title);
                plan.setOriginatorUserId(originatorUserId);
                plan.setOriginatorName(originatorName);
                plan.setProjectName(projectName);
                plan.setBatchNo(batchNo);
                plan.setContactPerson(contactPerson);
                plan.setMaterialCode(row.getString("textField_l9xo62q5"));
                plan.setMaterialCategory(row.getString("textField_l9xo62q7"));
                plan.setSpecDesc(row.getString("textField_l9xo62q8"));
                plan.setGradeType(row.getString("radioField_m9urarr2"));
                plan.setLength(row.getBigDecimal("numberField_lb7lgatg"));
                plan.setWidth(row.getBigDecimal("numberField_lb7lgath"));
                plan.setThickness(row.getBigDecimal("numberField_lb7lgati"));
                plan.setQuantity(row.getInteger("numberField_lb7lgatj"));
                plan.setVolume(row.getBigDecimal("numberField_l7fytfd3"));
                // æ—¥æœŸ
                JSONArray dateArr = row.getJSONArray("cascadeDateField_lfxqqluw");
                if (dateArr != null && dateArr.size() == 2) {
                    long start = dateArr.getLongValue(0);
                    long end = dateArr.getLongValue(1);
                    plan.setDateStart(Instant.ofEpochMilli(start)
                            .atZone(ZoneId.systemDefault())
                            .toLocalDateTime());
                    plan.setDateEnd(Instant.ofEpochMilli(end)
                            .atZone(ZoneId.systemDefault())
                            .toLocalDateTime());
                }
                plan.setDataSyncType(2);
                plan.setDataSourceType(1);
                plan.setCreateTime(LocalDateTime.now());
                list.add(plan);
            }
        }
        if (!list.isEmpty()) {
            productionPlanService.saveBatch(list);
        }
        log.info("同步生产需求数据完成,共 {} æ¡", list.size());
    }
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.productionPlan.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚接口实现类
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:00
 */
@Slf4j
@Service
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
}
src/main/java/com/ruoyi/productionPlan/task/ProductionPlanTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.productionPlan.task;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚定时任务
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/09 17:02
 */
public class ProductionPlanTask {
}
src/main/resources/application-zsjc.yml
@@ -33,7 +33,7 @@
    form-uuid: "FORM-4IA66891C5H3QWMDBSGO05C0OX9628GRPYF7L8"
    system-token: "4J766L91OFH3V612E7LG5B4DI8M13MQF9VF7LG4"
    # æŽ¥å£åœ°å€
    access-token-url: "https://api.dingtalk.com/v1.0/oauth2/accessToken"
    access-token-url: "https://oapi.dingtalk.com/gettoken"
    search-form-data-url: "https://api.dingtalk.com/v2.0/yida/forms/instances/search"
# å¼€å‘环境配置
src/main/resources/mapper/prodDemand/ProdDemandDetailMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/prodDemand/ProdDemandMainMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.productionPlan.mapper.ProductionPlanMapper">
    <resultMap id="ProductionPlanResultMap" type="com.ruoyi.productionPlan.pojo.ProductionPlan">
        <id property="id" column="id"/>
        <result property="formInstanceId" column="form_instance_id"/>
        <result property="serialNo" column="serial_no"/>
        <result property="title" column="title"/>
        <result property="originatorUserId" column="originator_user_id"/>
        <result property="originatorName" column="originator_name"/>
        <result property="bizCreateTime" column="biz_create_time"/>
        <result property="projectName" column="project_name"/>
        <result property="batchNo" column="batch_no"/>
        <result property="contactPerson" column="contact_person"/>
        <result property="extText1" column="ext_text1"/>
        <result property="extText2" column="ext_text2"/>
        <result property="materialCode" column="material_code"/>
        <result property="materialCategory" column="material_category"/>
        <result property="specDesc" column="spec_desc"/>
        <result property="gradeType" column="grade_type"/>
        <result property="length" column="length"/>
        <result property="width" column="width"/>
        <result property="thickness" column="thickness"/>
        <result property="quantity" column="quantity"/>
        <result property="volume" column="volume"/>
        <result property="dateStart" column="date_start"/>
        <result property="dateEnd" column="date_end"/>
        <result property="associationReceipt" column="association_receipt"/>
        <result property="dataSyncType" column="data_sync_type"/>
        <result property="dataSourceType" column="data_source_type"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
</mapper>
src/test/com/ruoyi/productionPlan/service/ProdDemandServiceTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.productionPlan.service;
import com.ruoyi.productionPlan.service.impl.ProdDemandService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
 * <br>
 *
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 9:15
 */
@SpringBootTest
class ProdDemandServiceTest {
    @Autowired
    private ProdDemandService prodDemandService;
    @Test
    void loadProdDemandData() {
        prodDemandService.LoadProdDemandData(1, 1);
    }
}