新火炬后端单体项目初始化代码
zhangherong
5 天以前 0bbd986930e4b41e0741fd07c4287208da398330
art: 生产订单同步定时任务
已添加1个文件
已修改15个文件
858 ■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 204 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/FunctionConst.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -4,7 +4,7 @@
  "avatar": "",
  "version": "4.9.2",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-7-31 10:26:58",
  "updatedTime": "2025-8-1 16:49:40",
  "dbConns": [],
  "profile": {
    "default": {
@@ -10822,6 +10822,114 @@
          "id": "4BF071F1-4F69-4044-8C17-25D7B66404F7"
        },
        {
          "defKey": "dispatcher_code",
          "defName": "调度员编号",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "09E4DA62-D2E3-4D82-9259-DCACA5C40FFD"
        },
        {
          "defKey": "dispatcher_name",
          "defName": "调度员名称",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
          "id": "C700FB1A-B747-4E97-A7BE-0044C0B3B2EE"
        },
        {
          "defKey": "order_create_date",
          "defName": "订单创建日期",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "BD647EC3-B32A-460E-A6D9-A4A1D808F849"
        },
        {
          "defKey": "order_update_date",
          "defName": "订单更新日期",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "E2F64B2D-D193-410E-83F5-7CA29FC2F1C7"
        },
        {
          "defKey": "order_update_time",
          "defName": "订单更新时间",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "99C90188-1886-45E3-8A66-062CF8672F15"
        },
        {
          "defKey": "order_update_user",
          "defName": "订单修改人",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "57BE810E-5423-4B64-B5C4-914D4FC48965"
        },
        {
          "defKey": "customer_order_model",
          "defName": "客户型号",
          "comment": "",
@@ -12045,8 +12153,8 @@
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
        },
        {
          "defKey": "del_flag",
          "defName": "删除标记",
          "defKey": "order_id",
          "defName": "生产订单ID",
          "comment": "",
          "type": "",
          "len": "",
@@ -12057,10 +12165,10 @@
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "id": "ABF02681-A2E7-4077-AEEF-7338AF47C4B8"
          "domain": "16120F75-6AA7-4483-868D-F07F511BB081",
          "id": "FE30BEF4-FD2C-477D-83B9-DAE0546C7D09"
        },
        {
          "defKey": "material_number",
@@ -12107,24 +12215,6 @@
          "attr9": "",
          "id": "CADE8A93-4759-4DA5-8210-942102A9F18B",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "factory_id",
          "defName": "产线ID(SAP工作中心)",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
          "id": "F5683C11-B21C-44C4-AF88-2D9A92F7444F"
        },
        {
          "defKey": "process_code",
@@ -12426,24 +12516,6 @@
          "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
        },
        {
          "defKey": "del_flag",
          "defName": "删除标记",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
          "extProps": {},
          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
          "id": "B43CBCB3-5BC6-4411-9999-C50D2C6A8A5D"
        },
        {
          "defKey": "order_id",
          "defName": "生成订单ID",
          "comment": "",
@@ -12516,24 +12588,6 @@
          "attr9": "",
          "id": "5428A165-EF43-40AF-B56F-9F75CBA47A0C",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "bill_materials_code",
          "defName": "BOM代码",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "BE09D493-E183-402D-ACC4-EEA21EB35B8E",
          "id": "07D7B55E-B88D-4493-B916-987978EA20D1"
        },
        {
          "defKey": "production_unit",
@@ -60905,7 +60959,35 @@
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "usage_unit",
          "defKey": "production_unit",
          "defName": "基本单位",
          "comment": "",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "refDict": "",
          "extProps": {},
          "notes": {},
          "attr1": "",
          "attr2": "",
          "attr3": "",
          "attr4": "",
          "attr5": "",
          "attr6": "",
          "attr7": "",
          "attr8": "",
          "attr9": "",
          "id": "4F81E835-2971-44F0-872E-61BD47417674",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "usage_quantity",
          "defName": "需求用量",
          "comment": "",
          "type": "",
src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java
@@ -11,124 +11,167 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @Description: SAP生产订单
 * @Author: jeecg-boot
 * @Date:   2025-07-04
 * @Date: 2025-07-04
 * @Version: V1.0
 */
@Data
@TableName("mes_production_order")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="mes_production_order对象", description="SAP生产订单")
@ApiModel(value = "mes_production_order对象", description = "SAP生产订单")
public class MesProductionOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**创建人*/
    /**创建人*/
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**创建日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**创建日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    private Date createTime;
    /**更新人*/
    /**更新人*/
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**更新日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    /**删除标记*/
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    /**生产订单号*/
    @Excel(name = "生产订单号", width = 15)
    /**生产订单号*/
    @ApiModelProperty(value = "生产订单号")
    private String orderCode;
    /**订单类型*/
    @Excel(name = "订单类型", width = 15)
    /**订单类型*/
    @ApiModelProperty(value = "订单类型")
    private String orderCategory;
    /**物料编号*/
    @Excel(name = "物料编号", width = 15)
    /**物料编号*/
    @ApiModelProperty(value = "物料编号")
    private String materialNumber;
    /**物料名称*/
    @Excel(name = "物料名称", width = 15)
    /**物料名称*/
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**计划开始日期*/
    @Excel(name = "计划开始日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**计划开始日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "计划开始日期")
    private Date planStart;
    /**计划结束日期*/
    @Excel(name = "计划结束日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**计划结束日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "计划结束日期")
    private Date planEnd;
    /**订单数量*/
    @Excel(name = "订单数量", width = 15)
    /**订单数量*/
    @ApiModelProperty(value = "订单数量")
    private Double orderQuantity;
    /**产品单位*/
    @Excel(name = "产品单位", width = 15, dicCode = "production_unit")
    @Dict(dicCode = "production_unit")
    private BigDecimal orderQuantity;
    /**产品单位*/
    @Dict(dicCode = "production_unit")
    @ApiModelProperty(value = "产品单位")
    private String productionUnit;
    /**订单状态*/
    @Excel(name = "订单状态", width = 15, dicCode = "order_status")
    @Dict(dicCode = "order_status")
    /**订单状态*/
    @Dict(dicCode = "order_status")
    @ApiModelProperty(value = "订单状态")
    private String orderStatus;
    /**优先级*/
    @Excel(name = "优先级", width = 15, dicCode = "priority")
    @Dict(dicCode = "priority")
    /**优先级*/
    @Dict(dicCode = "priority")
    @ApiModelProperty(value = "优先级")
    private String priority;
    /**计划工艺路线*/
    @Excel(name = "计划工艺路线", width = 15)
    /**计划工艺路线*/
    @ApiModelProperty(value = "计划工艺路线")
    private String processRoute;
    /**计划物料清单*/
    @Excel(name = "计划物料清单", width = 15)
    /**计划物料清单*/
    @ApiModelProperty(value = "计划物料清单")
    private String materialListCode;
    /**工厂编码*/
    @Excel(name = "工厂编码", width = 15)
    /**工厂编码*/
    @ApiModelProperty(value = "工厂编码")
    private String factoryCode;
    /**工厂名称*/
    @Excel(name = "工厂名称", width = 15)
    /**工厂名称*/
    @ApiModelProperty(value = "工厂名称")
    private String factoryName;
    /**客户型号*/
    @Excel(name = "客户型号", width = 15)
    /**调度员编号*/
    @ApiModelProperty(value = "调度员编号")
    private String dispatcherCode;
    /**调度员名称*/
    @ApiModelProperty(value = "调度员名称")
    private String dispatcherName;
    /**订单创建日期 yyyy-MM-dd*/
    @ApiModelProperty(value = "订单创建日期")
    private String orderCreateDate;
    /**订单更新日期 yyyy-MM-dd*/
    @ApiModelProperty(value = "订单更新日期")
    private String orderUpdateDate;
    /**订单更新时间 HH:mm:ss*/
    @ApiModelProperty(value = "订单更新时间")
    private String orderUpdateTime;
    /**订单修改人*/
    @ApiModelProperty(value = "订单修改人")
    private String orderUpdateUser;
    /**客户型号*/
    @ApiModelProperty(value = "客户型号")
    private String customerOrderModel;
    /**客户名称*/
    @Excel(name = "客户名称", width = 15)
    /**客户名称*/
    @ApiModelProperty(value = "客户名称")
    private String customer;
    /**备注*/
    @Excel(name = "备注", width = 15)
    /**备注*/
    @ApiModelProperty(value = "备注")
    private String remark;
    public MesProductionOrder() {
    }
    public MesProductionOrder(ProductionOrderDTO dto) {
        this.orderCode = dto.getAUFNR();
        this.orderCategory = dto.getDAUAT();
        this.materialNumber = dto.getMATNR();
        this.materialName = dto.getMAKTX();
        this.planStart = DateUtils.str2Date(dto.getGSTRP(), DateUtils.date_sdf.get());
        this.planEnd = DateUtils.str2Date(dto.getGLTRP(), DateUtils.date_sdf.get());
        this.orderQuantity = new BigDecimal(dto.getGAMNG());
        this.productionUnit = dto.getGMEIN();
        this.orderStatus = dto.getTXT04();
        this.priority = dto.getAPRIO();
        this.processRoute = dto.getAUFPL();
        this.materialListCode = dto.getSTLNR();
        this.factoryCode = dto.getDWERK();
        this.factoryName = dto.getNAME1();
        this.dispatcherCode = dto.getFEVOR();
        this.dispatcherName = dto.getTXT();
        this.orderCreateDate = dto.getUDATE();
        this.orderUpdateDate = dto.getLAEDA();
        this.orderUpdateTime = dto.getTIMES();
        this.orderUpdateUser = dto.getUSNAM();
        this.delFlag = CommonConstant.DEL_FLAG_0;
    }
    public void updateEntity(ProductionOrderDTO dto) {
        this.orderCategory = dto.getDAUAT();
        this.planStart = DateUtils.str2Date(dto.getGSTRP(), DateUtils.date_sdf.get());
        this.planEnd = DateUtils.str2Date(dto.getGLTRP(), DateUtils.date_sdf.get());
        this.orderQuantity = new BigDecimal(dto.getGAMNG());
        this.orderStatus = dto.getTXT04();
        this.priority = dto.getAPRIO();
        this.orderCreateDate = dto.getUDATE();
        this.orderUpdateDate = dto.getLAEDA();
        this.orderUpdateTime = dto.getTIMES();
        this.orderUpdateUser = dto.getUSNAM();
    }
}
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
package org.jeecg.modules.mes.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.mes.service.IMesProductionOrderService;
import org.jeecg.modules.pms.service.IPmsMaterialProcessService;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.jeecg.modules.sap.service.OrderBomSync;
import org.jeecg.modules.sap.service.OrderProcessSync;
import org.jeecg.modules.sap.service.ProductionOrderSync;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
public class ProductionOrderSyncJob implements Job {
    //工厂编码(新火炬 2301)
    private static final String FACTORY_CODE = "2301";
    /**
     * è®¢å•类型
     * æ ‡å‡†ç”Ÿäº§è®¢å• Z001
     * å®¢é€€è¿”工生产订单 Z002
     * å‘†æ»žå¤„理返工生产订单 Z003
     * è¯•制生产订单(新火炬)  Z011
     * æ‹†é›¶ç”Ÿäº§è®¢å•(新火炬)  2012
     */
    private static final String ORDER_TYPE_CODE = "Z001";
    /**
     * ç”Ÿäº§è°ƒåº¦å‘˜
     * 001 ä¸€åˆ†åŽ‚è°ƒåº¦å‘˜
     * 002 äºŒåˆ†åŽ‚è°ƒåº¦å‘˜
     * 003 ä¸‰åˆ†åŽ‚è°ƒåº¦å‘˜
     * 004 å››åˆ†åŽ‚è°ƒåº¦å‘˜
     * 005 ABS调度员
     * 006 è°ƒè´¨è°ƒåº¦å‘˜
     * 007 äº”分厂调度员
     * 008 è¯•制车间调度员
     * 009 å¤–采调度员
     * 010 å…­åŽ‚è°ƒåº¦å‘˜
     * 012 å…«åˆ†åŽ‚è°ƒåº¦å‘˜
     */
    private static final String PRODUCTION_MANAGER = "010";
    /**
     * ç”Ÿäº§è®¢å•状态,实际上,只有REL状态的工单才可以进行操作
     * CRTD æ–°å»º
     * REL ä¸‹è¾¾
     * TECO å…³é—­
     */
    private static final String ORDER_STATUS = "REL";
    /**
     * è¯·æ±‚成功编码
     */
    private static final String SUCCESS_CODE = "S";
    @Autowired
    private ProductionOrderSync productionOrderSync;
    @Autowired
    private OrderBomSync orderBomSync;
    @Autowired
    private OrderProcessSync orderProcessSync;
    @Autowired
    private IMesProductionOrderService productionOrderService;
    @Autowired
    private IPmsProcessBillMaterialsService processBillMaterialsService;
    @Autowired
    private IPmsMaterialProcessService materialProcessService;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //获取上次同步时间
        try {
            //调用SAP接口获取生产订单
            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(FACTORY_CODE, ORDER_TYPE_CODE, PRODUCTION_MANAGER, ORDER_STATUS, null, null);
            if (productionOrderMap == null || !SUCCESS_CODE.equals(productionOrderMap.get("ztype"))) {
                log.error("未同步到订单信息!日期:{}", LocalDateTime.now());
                return;
            }
            //调用成功,获取返回数据
            Object result = productionOrderMap.get("result");
            boolean b = result instanceof List;
            if(!b) {
                log.error("返回类型错误, class:{}", result == null ? null : result.getClass());
                return;
            }
            List<ProductionOrderDTO> productionOrderDTOList = (List<ProductionOrderDTO>) result;
            Map<String, MesProductionOrder> orderMap = productionOrderService.saveOrUpdateProductionOrder(productionOrderDTOList);
            String orderCodes = String.join(",", orderMap.keySet());
            //订单BOM同步
            Map<String, Object> orderBomMap = orderBomSync.syncOrderBom(FACTORY_CODE, orderCodes);
            if (orderBomMap == null || !SUCCESS_CODE.equals(orderBomMap.get("ztype"))) {
                log.error("未同步到订单BOM信息!日期:{}", LocalDateTime.now());
                return;
            }
            //调用成功,获取返回数据
            result = orderBomMap.get("result");
            b = result instanceof List;
            if(!b) {
                log.error("返回类型错误, class:{}", result == null ? null : result.getClass());
                return;
            }
            List<OrderBomDTO> orderBomDTOList = (List<OrderBomDTO>) result;
            b = processBillMaterialsService.saveOrUpdateOrderBom(orderMap, orderBomDTOList);
            if(!b) {
                log.error("保存订单BOM失败,日期:{}", LocalDateTime.now());
                return;
            }
            //订单工序同步
            Map<String, Object> orderProcessMap = orderProcessSync.syncOrderProcess(FACTORY_CODE, orderCodes);
            if (orderBomMap == null || !SUCCESS_CODE.equals(orderProcessMap.get("ztype"))) {
                log.error("未同步到订单工序信息!日期:{}", LocalDateTime.now());
                return;
            }
            //调用成功,获取返回数据
            result = orderBomMap.get("result");
            b = result instanceof List;
            if(!b) {
                log.error("返回类型错误, class:{}", result == null ? null : result.getClass());
                return;
            }
            List<OrderProcessDTO> orderProcessDTOList = (List<OrderProcessDTO>) result;
            b = materialProcessService.saveOrUpdateOrderProcess(orderMap, orderProcessDTOList);
            if(!b) {
                log.error("保存订单工序失败,日期:{}", LocalDateTime.now());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java
@@ -2,6 +2,10 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import java.util.List;
import java.util.Map;
/**
 * @Description: SAP生产订单
@@ -11,4 +15,17 @@
 */
public interface IMesProductionOrderService extends IService<MesProductionOrder> {
    /**
     * SAP同步数据保存
     * @param productionOrderDTOList
     * @return
     */
    Map<String, MesProductionOrder> saveOrUpdateProductionOrder(List<ProductionOrderDTO> productionOrderDTOList);
    /**
     * æ ¹æ®è®¢å•号查询
     * @param orderCode
     * @return
     */
    MesProductionOrder getByOrderCode(String orderCode);
}
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java
@@ -1,18 +1,65 @@
package org.jeecg.modules.mes.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.mes.mapper.MesProductionOrderMapper;
import org.jeecg.modules.mes.service.IMesProductionOrderService;
import org.jeecg.modules.sap.dto.ProductionOrderDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
 * @Description: SAP生产订单
 * @Author: jeecg-boot
 * @Date:   2025-07-04
 * @Date: 2025-07-04
 * @Version: V1.0
 */
@Service
public class MesProductionOrderServiceImpl extends ServiceImpl<MesProductionOrderMapper, MesProductionOrder> implements IMesProductionOrderService {
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Map<String, MesProductionOrder> saveOrUpdateProductionOrder(List<ProductionOrderDTO> productionOrderDTOList) {
        List<MesProductionOrder> addList = new ArrayList<>();
        List<MesProductionOrder> updateList = new ArrayList<>();
        Map<String, MesProductionOrder> resultMap = new HashMap<>();
        for (ProductionOrderDTO productionOrderDTO : productionOrderDTOList) {
            MesProductionOrder updated = getByOrderCode(productionOrderDTO.getAUFNR());
            if (updated == null) {
                updated = new MesProductionOrder(productionOrderDTO);
                addList.add(updated);
                resultMap.put(updated.getOrderCode(), updated);
            } else {
                updated.updateEntity(productionOrderDTO);
                updateList.add(updated);
                resultMap.put(updated.getOrderCode(), updated);
            }
        }
        if(CollectionUtil.isEmpty(addList)){
            super.saveBatch(addList);
        }
        if(CollectionUtil.isEmpty(updateList)){
            super.updateBatchById(updateList);
        }
        return resultMap;
    }
    @Override
    public MesProductionOrder getByOrderCode(String orderCode) {
        LambdaQueryWrapper<MesProductionOrder> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MesProductionOrder::getOrderCode, orderCode);
        queryWrapper.eq(MesProductionOrder::getDelFlag, CommonConstant.DEL_FLAG_0);
        List<MesProductionOrder> list = super.list(queryWrapper);
        if (CollectionUtil.isNotEmpty(list)) {
            return list.get(0);
        }
        return null;
    }
}
src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -10,8 +9,7 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@@ -20,65 +18,64 @@
/**
 * @Description: ç‰©æ–™å·¥åº
 * @Author: jeecg-boot
 * @Date:   2025-07-01
 * @Date: 2025-07-01
 * @Version: V1.0
 */
@Data
@TableName("pms_material_process")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="pms_material_process对象", description="物料工序")
@ApiModel(value = "pms_material_process对象", description = "物料工序")
public class PmsMaterialProcess implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**创建人*/
    /**创建人*/
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**创建日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**创建日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    private Date createTime;
    /**更新人*/
    /**更新人*/
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    /**更新日期*/
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    /**物料编码*/
    @Excel(name = "物料编码", width = 15)
    /**生产订单ID*/
    @ApiModelProperty(value = "生产订单ID")
    private String orderId;
    /**物料编码*/
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @Excel(name = "物料名称", width = 15)
    /**物料名称*/
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**产线ID(SAP工作中心)*/
    @Excel(name = "产线ID(SAP工作中心)", width = 15)
    @ApiModelProperty(value = "产线ID(SAP工作中心)")
    @Dict(dictTable = "base_factory", dicCode = "id", dicText = "factory_name")
    private String factoryId;
    /**工序号*/
    @Excel(name = "工序号", width = 15)
    /**工序号*/
    @ApiModelProperty(value = "工序号")
    private String processCode;
    /**工序名称*/
    @Excel(name = "工序名称", width = 15)
    /**工序名称*/
    @ApiModelProperty(value = "工序名称")
    private String processName;
    /**控制码*/
    @Excel(name = "控制码", width = 15)
    /**控制码*/
    @ApiModelProperty(value = "控制码")
    private String controlCode;
    public PmsMaterialProcess(){}
    public PmsMaterialProcess(String orderId, String materialName,  OrderProcessDTO dto) {
        this.orderId = orderId;
        this.materialNumber = dto.getMATNR();
        this.materialName = materialName;
        this.processCode = dto.getVORNR();
        this.processName = dto.getLTXA1();
        this.controlCode = dto.getSTEUS();
    }
}
src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
@@ -10,10 +9,10 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -50,33 +49,19 @@
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    /**生成订单ID*/
    @Excel(name = "生成订单ID", width = 15)
    @ApiModelProperty(value = "生成订单ID")
    private String orderId;
    /**物料编码*/
    @Excel(name = "物料编码", width = 15)
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @Excel(name = "物料名称", width = 15)
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**BOM代码*/
    @Excel(name = "BOM代码", width = 15)
    @ApiModelProperty(value = "BOM代码")
    private String billMaterialsCode;
    /**基本单位*/
    @Excel(name = "基本单位", width = 15)
    @ApiModelProperty(value = "基本单位")
    private String productionUnit;
    /**订单数量*/
    @Excel(name = "订单数量", width = 15)
    @ApiModelProperty(value = "订单数量")
    private Double productionQuantity;
    private BigDecimal productionQuantity;
}
src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java
@@ -10,10 +10,11 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -51,20 +52,29 @@
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**生产物料ID*/
    @Excel(name = "生产物料ID", width = 15)
    @ApiModelProperty(value = "生产物料ID")
    @Dict(dictTable = "pms_process_bill_materials", dicCode = "id", dicText = "material_number")
    private String materialId;
    /**物料编码*/
    @Excel(name = "物料编码", width = 15)
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @Excel(name = "物料名称", width = 15)
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**基本单位*/
    @ApiModelProperty(value = "基本单位")
    private String productionUnit;
    /**需求用量*/
    @Excel(name = "需求用量", width = 15)
    @ApiModelProperty(value = "需求用量")
    private Double usageUnit;
    private BigDecimal usageQuantity;
    public PmsProcessBillMaterialsDetail(){}
    public PmsProcessBillMaterialsDetail(String materialId, OrderBomDTO dto) {
        this.materialId = materialId;
        this.materialNumber = dto.getMATNR();
        this.materialName = dto.getMAKTX();
        this.productionUnit = dto.getMEINS();
        this.usageQuantity = new BigDecimal(dto.getBDMNG());
    }
}
src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java
@@ -2,9 +2,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.pms.entity.PmsMaterialProcess;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
@@ -15,4 +18,17 @@
 */
public interface IPmsMaterialProcessService extends IService<PmsMaterialProcess> {
    IPage<Map<String, Object>> getpmsMaterialProcessListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
    /**
     *
     * @param orderMap
     * @param orderProcessDTOList
     * @return
     */
    boolean saveOrUpdateOrderProcess(Map<String, MesProductionOrder> orderMap, List<OrderProcessDTO> orderProcessDTOList);
    /**
     * åˆ é™¤åŽŸæœ‰çš„æ•°æ®
     * @param orderId
     */
    void removeByOrderId(String orderId);
}
src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java
@@ -3,8 +3,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
@@ -16,4 +18,17 @@
public interface IPmsProcessBillMaterialsDetailService extends IService<PmsProcessBillMaterialsDetail> {
    PmsProcessBillMaterialsDetail queryByMaterialId(String materialId);
    IPage<Map<String, Object>> getpmsProcessBillMaterialsDetailListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
    /**
     * åˆ é™¤åŽŸæœ‰çš„æ•°æ®
     * @param materialsId
     */
    void removeByMaterialsId(String materialsId);
    /**
     * æ‰¹é‡ä¿¡æ¯ç‰©æ–™æ¸…单明细
     * @param materialsId
     * @param collect
     */
    void saveBatchDetail(String materialsId, List<OrderBomDTO> collect);
}
src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
@@ -2,9 +2,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
@@ -15,4 +18,19 @@
 */
public interface IPmsProcessBillMaterialsService extends IService<PmsProcessBillMaterials> {
    IPage<Map<String, Object>> getpmsProcessBillMaterialsListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
    /**
     * æ‰¹é‡ä¿å­˜æˆ–更新订单BOM数据
     * @param orderMap
     * @param orderBomDTOList
     * @return
     */
    boolean saveOrUpdateOrderBom(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList);
    /**
     * è®¢å•物料查询
     * @param orderId
     * @return
     */
    PmsProcessBillMaterials getByOrderId(String orderId);
}
src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java
@@ -1,22 +1,29 @@
package org.jeecg.modules.pms.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.pms.entity.PmsMaterialProcess;
import org.jeecg.modules.pms.mapper.PmsMaterialProcessMapper;
import org.jeecg.modules.pms.service.IPmsMaterialProcessService;
import org.jeecg.modules.sap.dto.OrderProcessDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @Description: ç‰©æ–™å·¥åº
 * @Author: jeecg-boot
 * @Date:   2025-07-01
 * @Date: 2025-07-01
 * @Version: V1.0
 */
@Service
@@ -40,4 +47,29 @@
        }
        return super.getBaseMapper().getpmsMaterialProcessListData(pageData, paramMap);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateOrderProcess(Map<String, MesProductionOrder> orderMap, List<OrderProcessDTO> orderProcessDTOList) {
        for (Map.Entry<String, MesProductionOrder> entry : orderMap.entrySet()) {
            MesProductionOrder order = entry.getValue();
            //删除原有的数据
            this.removeByOrderId(order.getId());
            //重新新增工序信息
            List<OrderProcessDTO> collect = orderProcessDTOList.stream().filter(orderProcessDTO -> entry.getKey().equals(orderProcessDTO.getAUFNR())).collect(Collectors.toList());
            if (CollectionUtil.isNotEmpty(collect)) {
                List<PmsMaterialProcess> list = collect.stream().map(orderBomDTO -> new PmsMaterialProcess(entry.getKey(), order.getMaterialName(), orderBomDTO)).collect(Collectors.toList());
                super.saveBatch(list);
            }
        }
        return true;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeByOrderId(String orderId) {
        LambdaQueryWrapper<PmsMaterialProcess> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PmsMaterialProcess::getOrderId, orderId);
        super.remove(queryWrapper);
    }
}
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java
@@ -1,5 +1,7 @@
package org.jeecg.modules.pms.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -7,16 +9,20 @@
import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsDetailMapper;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @Description: ç‰©æ–™æ¸…单
 * @Author: jeecg-boot
 * @Date:   2025-07-01
 * @Date: 2025-07-01
 * @Version: V1.0
 */
@Service
@@ -45,4 +51,22 @@
        }
        return super.getBaseMapper().getpmsProcessBillMaterialsDetailListData(pageData, paramMap);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeByMaterialsId(String materialsId) {
        LambdaQueryWrapper<PmsProcessBillMaterialsDetail> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PmsProcessBillMaterialsDetail::getMaterialId, materialsId);
        this.getBaseMapper().delete(queryWrapper);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveBatchDetail(String materialsId, List<OrderBomDTO> collect) {
        if (CollectionUtil.isEmpty(collect)) {
            return;
        }
        List<PmsProcessBillMaterialsDetail> list = collect.stream().map(orderBomDTO -> new PmsProcessBillMaterialsDetail(materialsId, orderBomDTO)).collect(Collectors.toList());
        super.saveBatch(list);
    }
}
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
@@ -1,26 +1,37 @@
package org.jeecg.modules.pms.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsMapper;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @Description: è®¢å•BOM
 * @Author: jeecg-boot
 * @Date:   2025-07-01
 * @Date: 2025-07-01
 * @Version: V1.0
 */
@Service
public class PmsProcessBillMaterialsServiceImpl extends ServiceImpl<PmsProcessBillMaterialsMapper, PmsProcessBillMaterials> implements IPmsProcessBillMaterialsService {
    @Autowired
    private IPmsProcessBillMaterialsDetailService processBillMaterialsDetailService;
    @Override
    public IPage<Map<String, Object>> getpmsProcessBillMaterialsListData(Integer pageNo, Integer pageSize, HttpServletRequest req) {
@@ -40,4 +51,50 @@
        }
        return super.getBaseMapper().getpmsProcessBillMaterialsListData(pageData, paramMap);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateOrderBom(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList) {
        for (Map.Entry<String, MesProductionOrder> entry :  orderMap.entrySet()) {
            MesProductionOrder order = entry.getValue();
            PmsProcessBillMaterials materials = getByOrderId(order.getId());
            if(materials != null) {
                //更新物料数据
                materials.setOrderId(order.getId());
                materials.setMaterialNumber(order.getMaterialNumber());
                materials.setMaterialName(order.getMaterialName());
                materials.setProductionUnit(order.getProductionUnit());
                materials.setProductionQuantity(order.getOrderQuantity());
                this.getBaseMapper().updateById(materials);
                //更新物料明细数据
                processBillMaterialsDetailService.removeByMaterialsId(materials.getId());
                //过滤出此订单的物料信息
                List<OrderBomDTO> collect = orderBomDTOList.stream().filter(orderBomDTO -> entry.getKey().equals(orderBomDTO.getAUFNR())).collect(Collectors.toList());
                processBillMaterialsDetailService.saveBatchDetail(materials.getId(), collect);
            }else {
                materials = new PmsProcessBillMaterials();
                materials.setOrderId(order.getId());
                materials.setMaterialNumber(order.getMaterialNumber());
                materials.setMaterialName(order.getMaterialName());
                materials.setProductionUnit(order.getProductionUnit());
                materials.setProductionQuantity(order.getOrderQuantity());
                this.getBaseMapper().insert(materials);
                //过滤出此订单的物料信息
                List<OrderBomDTO> collect = orderBomDTOList.stream().filter(orderBomDTO -> entry.getKey().equals(orderBomDTO.getAUFNR())).collect(Collectors.toList());
                processBillMaterialsDetailService.saveBatchDetail(materials.getId(), collect);
            }
        }
        return true;
    }
    @Override
    public PmsProcessBillMaterials getByOrderId(String orderId) {
        LambdaQueryWrapper<PmsProcessBillMaterials> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PmsProcessBillMaterials::getOrderId, orderId);
        List<PmsProcessBillMaterials> list = super.list(queryWrapper);
        if (CollectionUtil.isNotEmpty(list)) {
            return list.get(0);
        }
        return null;
    }
}
src/main/java/org/jeecg/modules/sap/FunctionConst.java
@@ -2,15 +2,15 @@
public class FunctionConst {
    //1.生产订单同步接口
    public static String ZPPF_033_1 = "ZPPF_033_1";
    public static final String ZPPF_033_1 = "ZPPF_033_1";
    //2.订单BOM同步接口
    public static String ZPPF_033_3 = "ZPPF_033_3";
    public static final String ZPPF_033_3 = "ZPPF_033_3";
    //3.产品工序同步接口
    public static String ZPPF_033_2 = "ZPPF_033_2";
    public static final String ZPPF_033_2 = "ZPPF_033_2";
    //4.生产订单工序报工接口、生产订单入库、不合格品处理
    public static String ZMES_PRODORDCONF_CREATE_TT2301 = "ZMES_PRODORDCONF_CREATE_TT2301";
    public static final String ZMES_PRODORDCONF_CREATE_TT2301 = "ZMES_PRODORDCONF_CREATE_TT2301";
    //5.生产订单投料接口
    public static String ZMES_GOODSMVT_CREATE_2301 = "ZMES_GOODSMVT_CREATE_2301";
    public static final String ZMES_GOODSMVT_CREATE_2301 = "ZMES_GOODSMVT_CREATE_2301";
    //6.生产订单关闭接口
    public static String ZPPF_019 = "ZPPF_019";
    public static final String ZPPF_019 = "ZPPF_019";
}
src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java
@@ -14,6 +14,6 @@
    private String MAKTX;
    /** éœ€æ±‚量 */
    private String BDMNG;
    /** MEINS */
    /** åŸºæœ¬è®¡é‡å•位 */
    private String MEINS;
}