gongchunyi
4 天以前 dbf3089d808f869d99d3bac744c3d10da58b2102
refactor: 销售生产计划表字段修改
已添加2个文件
已修改6个文件
已删除2个文件
762 ■■■■■ 文件已修改
doc/宁夏-中盛建材.sql 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/enums/DataSourceTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/enums/DataSyncTypeEnum.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java 148 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProdDemandService.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/com/ruoyi/productionPlan/service/ProdDemandServiceTest.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -1,37 +1,56 @@
CREATE TABLE `production_plan`
DROP TABLE IF EXISTS `production_plan`;
CREATE TABLE production_plan
(
    `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`),
    KEY `idx_form_instance_id` (`form_instance_id`)
) ENGINE = INNODB
  DEFAULT CHARSET = utf8mb4 COMMENT = '销售生产需求';
    id                 BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    form_instance_id   VARCHAR(64) COMMENT '表单实例ID',
    serial_no          VARCHAR(50) COMMENT '流水号',
    apply_no           VARCHAR(100) COMMENT '申请单编号',
    customer_name      VARCHAR(200) COMMENT '客户名称',
    material_code      VARCHAR(100) COMMENT '物料编码',
    product_name       VARCHAR(200) COMMENT '产品名称',
    product_spec       VARCHAR(200) COMMENT '产品规格',
    length             INT COMMENT '长',
    width              INT COMMENT '宽',
    height             INT COMMENT '高',
    quantity           INT COMMENT '块数',
    volume             DECIMAL(10, 4) COMMENT '方数',
    strength           VARCHAR(50) COMMENT '强度',
    start_date         DATETIME COMMENT '开始日期',
    end_date           DATETIME COMMENT '结束日期',
    submitter          VARCHAR(100) COMMENT '提交人',
    submit_org         VARCHAR(200) COMMENT '提交人组织',
    remark_one         TEXT COMMENT '备注1',
    remark_two         TEXT COMMENT '备注2',
    creator_name       VARCHAR(100) COMMENT '创建人',
    modifier_name      VARCHAR(100) COMMENT '修改人',
    form_created_time  DATETIME COMMENT '表单创建时间',
    form_modified_time DATETIME 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 COMMENT '数据库创建时间',
    update_time        DATETIME COMMENT '数据库更新时间',
    INDEX idx_apply_no (apply_no),
    INDEX idx_serial_no (serial_no),
    INDEX idx_form_instance_id (form_instance_id),
    INDEX idx_material_code (material_code)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='销售生产计划';
CREATE TABLE `product-inventory-management-zsjc`.`energy`  (
    `id` int NOT NULL AUTO_INCREMENT,
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
@@ -1,11 +1,11 @@
package com.ruoyi.productionPlan.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import com.ruoyi.productionPlan.service.impl.ProdDemandService;
import com.ruoyi.staff.dto.StaffLeaveDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
@@ -36,4 +36,11 @@
    public AjaxResult productionPlanListPage(Page page, ProductionPlanDto productionPlanDto) {
        return AjaxResult.success(productionPlanService.listPage(page, productionPlanDto));
    }
    @GetMapping("/loadProdData")
    @Log(title = "拉取销售生产计划", businessType = BusinessType.INSERT)
    public AjaxResult loadProdData() {
        productionPlanService.loadProdData();
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/productionPlan/enums/DataSourceTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.productionPlan.enums;
import lombok.Getter;
/**
 * <br>
 * æ•°æ®æ¥æºæ–¹å¼æžšä¸¾ç±»
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:37
 */
@Getter
public enum DataSourceTypeEnum {
    SALES_ORDER(1, "销售订单"),
    PRODUCTION_FORECAST(2, "生产预测");
    private final Integer code;
    private final String desc;
    DataSourceTypeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static DataSourceTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (DataSourceTypeEnum type : DataSourceTypeEnum.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/productionPlan/enums/DataSyncTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.productionPlan.enums;
import lombok.Getter;
/**
 * <br>
 * æ•°æ®æ–¹å¼æžšä¸¾ç±»
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/10 10:36
 */
@Getter
public enum DataSyncTypeEnum {
    MANUAL(1, "手动"),
    SCHEDULED(2, "定时");
    private final Integer code;
    private final String desc;
    DataSyncTypeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public static DataSyncTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (DataSyncTypeEnum type : DataSyncTypeEnum.values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
@@ -23,7 +23,7 @@
public class ProductionPlan {
    /**
     * è‡ªå¢žä¸»é”®
     * ä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
@@ -34,55 +34,19 @@
    private String formInstanceId;
    /**
     * å•据流水号
     * æµæ°´å·
     */
    private String serialNo;
    /**
     * å•据标题
     * ç”³è¯·å•编号
     */
    private String title;
    private String applyNo;
    /**
     * å‘起人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 customerName;
    /**
     * ç‰©æ–™ç¼–码
@@ -90,82 +54,118 @@
    private String materialCode;
    /**
     * ç‰©æ–™åˆ†ç±»
     * äº§å“åç§°
     */
    private String materialCategory;
    private String productName;
    /**
     * è§„格描述
     * äº§å“è§„æ ¼
     */
    private String specDesc;
    private String productSpec;
    /**
     * ç­‰çº§
     * é•¿
     */
    private String gradeType;
    private Integer length;
    /**
     * é•¿åº¦
     * å®½
     */
    private BigDecimal length;
    private Integer width;
    /**
     * å®½åº¦
     * é«˜
     */
    private BigDecimal width;
    private Integer height;
    /**
     * åŽšåº¦
     */
    private BigDecimal thickness;
    /**
     * æ•°é‡
     * å—æ•°
     */
    private Integer quantity;
    /**
     * æ€»ä½“积
     * æ–¹æ•°
     */
    private BigDecimal volume;
    /**
     * å¼€å§‹æ—¶é—´
     * å¼ºåº¦
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateStart;
    private String strength;
    /**
     * ç»“束时间
     * å¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateEnd;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startDate;
    /**
     * å…³è”单据
     * ç»“束日期
     */
    private String associationReceipt;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endDate;
    /**
     * æ•°æ®æ–¹å¼: 1=手动 2=定时
     * æäº¤äºº
     */
    private String submitter;
    /**
     * æäº¤äººç»„织
     */
    private String submitOrg;
    /**
     * å¤‡æ³¨1
     */
    private String remarkOne;
    /**
     * å¤‡æ³¨2
     */
    private String remarkTwo;
    /**
     * åˆ›å»ºäºº
     */
    private String creatorName;
    /**
     * ä¿®æ”¹äºº
     */
    private String modifierName;
    /**
     * è¡¨å•创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime formCreatedTime;
    /**
     * è¡¨å•修改时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime formModifiedTime;
    /**
     * æ•°æ®åŒæ­¥ç±»åž‹ï¼š1=手动 2=定时任务
     */
    private Integer dataSyncType;
    /**
     * æ•°æ®æ¥æº: 1=销售订单 2=生产预测
     * æ•°æ®æ¥æºç±»åž‹ï¼š1=销售订单 2=销售预测
     */
    private Integer dataSourceType;
    /**
     * åˆ›å»ºæ—¶é—´
     * æ•°æ®åº“创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     * æ•°æ®åº“æ›´æ–°æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
@@ -5,7 +5,6 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import com.ruoyi.staff.dto.StaffLeaveDto;
/**
 * <br>
@@ -18,4 +17,14 @@
 */
public interface ProductionPlanService extends IService<ProductionPlan> {
    IPage<ProductionPlanDto> listPage(Page page, ProductionPlanDto productionPlanDto);
    /**
     * æ‰‹åŠ¨åŒæ­¥
     */
    void loadProdData();
    /**
     * å®šæ—¶åŒæ­¥
     */
    void syncProdDataJob();
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProdDemandService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -1,8 +1,14 @@
package com.ruoyi.productionPlan.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.config.AliDingConfig;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
@@ -10,6 +16,16 @@
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.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
/**
 * <br>
@@ -24,6 +40,10 @@
@Slf4j
@Service
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
    @Autowired
    private AliDingConfig aliDingConfig;
    @Autowired
    private ProductionPlanMapper productionPlanMapper;
@@ -31,4 +51,181 @@
    public IPage<ProductionPlanDto> listPage(Page page, ProductionPlanDto productionPlanDto) {
        return productionPlanMapper.listPage(page, productionPlanDto);
    }
    /**
     * é¡µé¢æ‰‹åŠ¨åŒæ­¥
     */
    @Override
    public void loadProdData() {
        syncProdData(1);
    }
    /**
     * å®šæ—¶ä»»åŠ¡åŒæ­¥
     */
    @Override
    public void syncProdDataJob() {
        syncProdData(2);
    }
    /**
     * åŒæ­¥æ•°æ®
     */
    @Transactional(rollbackFor = Exception.class)
    public void syncProdData(Integer dataSyncType) {
        try {
            //  èŽ·å–AccessToken
            String params = "appkey=" + aliDingConfig.getAppKey()
                    + "&appsecret=" + aliDingConfig.getAppSecret();
            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());
            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");
                // å‘起人
                JSONObject originator = item.getJSONObject("originator");
                String originatorName = originator.getJSONObject("userName").getString("nameInChinese");
                JSONObject formData = item.getJSONObject("formData");
                // æ˜Žç»†è¡¨
                JSONArray tableArr = formData.getJSONArray("tableField_l7fytfcn");
                if (tableArr == null || tableArr.isEmpty()) {
                    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.setApplyNo(formData.getString("textField_l7fytfco"));
                    plan.setCustomerName(formData.getString("textField_lbkozohg"));
                    // æ˜Žç»†å­—段
                    plan.setMaterialCode(row.getString("textField_l9xo62q5"));
                    plan.setProductName(row.getString("textField_l9xo62q7"));
                    plan.setProductSpec(row.getString("textField_l9xo62q8"));
                    plan.setLength(row.getInteger("numberField_lb7lgatg_value"));
                    plan.setWidth(row.getInteger("numberField_lb7lgath_value"));
                    plan.setHeight(row.getInteger("numberField_lb7lgati_value"));
                    plan.setQuantity(row.getInteger("numberField_lb7lgatj_value"));
                    plan.setVolume(row.getBigDecimal("numberField_l7fytfd3_value"));
                    plan.setStrength(row.getString("radioField_m9urarr2_id"));
                    // æ—¥æœŸåŒºé—´
                    JSONArray dateArr = row.getJSONArray("cascadeDateField_lfxqqluw");
                    if (dateArr != null && dateArr.size() == 2) {
                        long start = Long.parseLong(dateArr.getString(0));
                        long end = Long.parseLong(dateArr.getString(1));
                        plan.setStartDate(Instant.ofEpochMilli(start)
                                .atZone(ZoneId.systemDefault())
                                .toLocalDateTime());
                        plan.setEndDate(Instant.ofEpochMilli(end)
                                .atZone(ZoneId.systemDefault())
                                .toLocalDateTime());
                    }
                    // æäº¤äºº
                    plan.setSubmitter(originatorName);
                    // ç»„织
                    plan.setSubmitOrg("宁夏中创绿能实业集团有限公司");
                    // å¤‡æ³¨
                    plan.setRemarkOne(formData.getString("textareaField_l7fytfcy"));
                    plan.setRemarkTwo(formData.getString("textField_l7fytfcx"));
                    // åˆ›å»ºäºº
                    plan.setCreatorName(originatorName);
                    // ä¿®æ”¹äºº
                    JSONObject modifyUser = item.getJSONObject("modifyUser");
                    if (modifyUser != null) {
                        plan.setModifierName(modifyUser.getJSONObject("userName").getString("nameInChinese"));
                    }
                    // è¡¨å•æ—¶é—´
                    plan.setFormCreatedTime(parseUtcTime(item.getString("createdTimeGMT")));
                    plan.setFormModifiedTime(parseUtcTime(item.getString("modifiedTimeGMT")));
                    // åŒæ­¥ä¿¡æ¯
                    plan.setDataSyncType(dataSyncType);
                    plan.setDataSourceType(1);
                    // æ•°æ®åº“æ—¶é—´
                    LocalDateTime now = LocalDateTime.now();
                    plan.setCreateTime(now);
                    plan.setUpdateTime(now);
                    list.add(plan);
                }
            }
            if (!list.isEmpty()) {
                saveBatch(list);
            }
            log.info("生产计划同步完成,共 {} æ¡", list.size());
        } catch (Exception e) {
            log.error("同步生产计划异常", e);
        }
    }
    private LocalDateTime parseUtcTime(String utcString) {
        if (StringUtils.isEmpty(utcString)) {
            return null;
        }
        try {
            OffsetDateTime odt = OffsetDateTime.parse(utcString);
            return odt.toLocalDateTime();
        } catch (DateTimeParseException ex) {
            log.warn("解析时间 {} å¤±è´¥: {}", utcString, ex.getMessage());
            return null;
        }
    }
}
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
@@ -9,37 +9,38 @@
        <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="applyNo" column="apply_no"/>
        <result property="customerName" column="customer_name"/>
        <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="productName" column="product_name"/>
        <result property="productSpec" column="product_spec"/>
        <result property="length" column="length"/>
        <result property="width" column="width"/>
        <result property="thickness" column="thickness"/>
        <result property="height" column="height"/>
        <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="strength" column="strength"/>
        <result property="startDate" column="start_date"/>
        <result property="endDate" column="end_date"/>
        <result property="submitter" column="submitter"/>
        <result property="submitOrg" column="submit_org"/>
        <result property="remarkOne" column="remark_one"/>
        <result property="remarkTwo" column="remark_two"/>
        <result property="creatorName" column="creator_name"/>
        <result property="modifierName" column="modifier_name"/>
        <result property="formCreatedTime" column="form_created_time"/>
        <result property="formModifiedTime" column="form_modified_time"/>
        <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>
    <select id="listPage" resultType="com.ruoyi.productionPlan.dto.ProductionPlanDto">
        SELECT
        production_plan.*
    <select id="listPage" resultMap="ProductionPlanResultMap">
        SELECT *
        FROM production_plan
        where 1=1
        WHERE 1 = 1
    </select>
</mapper>
src/test/com/ruoyi/productionPlan/service/ProdDemandServiceTest.java
ÎļþÒÑɾ³ý