新火炬后端单体项目初始化代码
cuilei
3 天以前 52adc4d46bf83cf8c968a8cd870fb021519e145f
报工、齐套性检查部分接口
已添加4个文件
已修改19个文件
523 ■■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInventory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/enums/MaterialCategory.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/mapper/LswMaterialInventoryMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/mapper/xml/LswMaterialInventoryMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/ILswMaterialInventoryService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialInventoryServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/vo/LswMaterialInventoryVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesKittingCompletenessCheckController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesProductionOrderController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesWorkReportingController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesKittingCompletenessCheck.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/enums/ProductionOrderStatus.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesKittingCompletenessCheckService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesWorkReportingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesKittingCompletenessCheckServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/utils/CommonUtils.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -2,9 +2,9 @@
  "name": "双林新火炬MES数据库设计",
  "describe": "描述双薪新火炬MES数据库设计详情",
  "avatar": "",
  "version": "4.9.2",
  "version": "4.9.4",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-8-14 13:31:57",
  "updatedTime": "2025-8-15 14:58:22",
  "dbConns": [],
  "profile": {
    "default": {
@@ -632,7 +632,7 @@
      "#DDE5FF"
    ],
    "DDLToggleCase": "L",
    "menuWidth": "364px"
    "menuWidth": "309px"
  },
  "entities": [
    {
@@ -11467,7 +11467,7 @@
        {
          "defKey": "work_order_status",
          "defName": "工单状态",
          "comment": "新建、已发布、重发布",
          "comment": "新建、已发布、执行中、已关闭",
          "type": "",
          "len": "",
          "scale": "",
@@ -11483,6 +11483,60 @@
          "id": "2150E931-22A6-452C-BD42-54A37E0A5968"
        },
        {
          "defKey": "completeness_check_flag",
          "defName": "是否通过齐套性检查",
          "comment": "0否1是",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF",
          "id": "D9F104A5-0DF1-40FB-8F0D-850E0E0C7EC6"
        },
        {
          "defKey": "equipment_inspection_flag",
          "defName": "是否通过设备点检",
          "comment": "0否1是",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF",
          "id": "CAF6B87F-AC08-41D7-867B-31B6906A35FC"
        },
        {
          "defKey": "process_inspection_flag",
          "defName": "是否通过工艺点检",
          "comment": "0否1是",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF",
          "id": "17F725F0-ADC2-4265-9136-125AE1FDA8CA"
        },
        {
          "defKey": "actual_quantity",
          "defName": "实际报工数量",
          "comment": "",
src/main/java/org/jeecg/modules/lsw/entity/LswMaterialInventory.java
@@ -14,6 +14,7 @@
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -62,7 +63,7 @@
    /**数量*/
    @Excel(name = "数量", width = 15)
    @ApiModelProperty(value = "数量")
    private Double quantity;
    private BigDecimal quantity;
    /**库存地ID*/
    @Excel(name = "库存地ID", width = 15)
    @Dict(dictTable = "base_line_side_warehouse", dicCode = "id", dicText = "warehouse_name")
src/main/java/org/jeecg/modules/lsw/enums/MaterialCategory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package org.jeecg.modules.lsw.enums;
public enum MaterialCategory {
    /**
     * æˆå“
     */
    FINISHED,
    /**
     * åŠæˆå“
     */
    HALF,
    /**
     * æ¯›å¯
     */
    RAW,
    /**
     * é…ä»¶
     */
    PARTS;
    /**
     * @param name æžšä¸¾çš„名称
     * @return å¯¹åº”çš„ MaterialCategory æžšä¸¾ç±»åž‹ï¼Œå¦‚果未找到则返回 null
     */
    public static MaterialCategory fromName(String name) {
        for (MaterialCategory category : MaterialCategory.values()) {
            if (category.name().equals(name)) {
                return category;
            }
        }
        return null;
    }
}
src/main/java/org/jeecg/modules/lsw/mapper/LswMaterialInventoryMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.lsw.vo.LswMaterialInventoryVo;
import java.util.List;
@@ -29,4 +30,7 @@
   * @return List<LswMaterialInventory>
   */
    public List<LswMaterialInventory> selectByMainId(@Param("mainId") String mainId);
    List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(@Param("materialNumberList") List<String> bomMaterialNumberList,
                                                                                 @Param("factoryId") String factoryId);
}
src/main/java/org/jeecg/modules/lsw/mapper/xml/LswMaterialInventoryMapper.xml
@@ -13,4 +13,22 @@
        FROM  lsw_material_inventory
        WHERE
             material_id = #{mainId}     </select>
    <select id="selectLineSideMaterialInventoryByMaterialNumber"
            resultType="org.jeecg.modules.lsw.vo.LswMaterialInventoryVo">
        SELECT
            t1.material_number materialNumber,
            t1.material_name materialName,
        SUM(t2.quantity) AS stockQuantity
        FROM lsw_material t1
        INNER JOIN lsw_material_inventory t2 ON t1.id = t2.material_id
        WHERE t1.material_number IN
        <foreach collection="materialNumberList" item="item" separator="," open="(" close=")">
            #{item}
        </foreach>
        AND t2.warehouse_id = #{factoryId}
        AND t1.del_flag = 0
        GROUP BY
            t1.material_number,
            t1.material_name
    </select>
</mapper>
src/main/java/org/jeecg/modules/lsw/service/ILswMaterialInventoryService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.lsw.vo.LswMaterialInventoryVo;
import java.util.List;
@@ -20,4 +21,6 @@
     * @return List<LswMaterialInventory>
     */
    public List<LswMaterialInventory> selectByMainId(String mainId);
    /** é€šè¿‡ç‰©æ–™ç¼–码和线边库id查询物料库存 */
    List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId);
}
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialInventoryServiceImpl.java
@@ -4,9 +4,11 @@
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.lsw.mapper.LswMaterialInventoryMapper;
import org.jeecg.modules.lsw.service.ILswMaterialInventoryService;
import org.jeecg.modules.lsw.vo.LswMaterialInventoryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
@@ -25,4 +27,9 @@
    public List<LswMaterialInventory> selectByMainId(String mainId) {
        return lswMaterialInventoryMapper.selectByMainId(mainId);
    }
    @Override
    public List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId) {
        return lswMaterialInventoryMapper.selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, factoryId);
    }
}
src/main/java/org/jeecg/modules/lsw/vo/LswMaterialInventoryVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.lsw.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class LswMaterialInventoryVo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**物料编码*/
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**数量*/
    @ApiModelProperty(value = "库存数量")
    private BigDecimal stockQuantity;
}
src/main/java/org/jeecg/modules/mes/controller/MesKittingCompletenessCheckController.java
@@ -6,6 +6,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
@@ -19,6 +20,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
/**
* @Description: é½å¥—性检查记录
@@ -71,6 +73,15 @@
       return Result.OK("添加成功!");
   }
   @AutoLog(value = "齐套性检查记录-批量添加")
   @ApiOperation(value="齐套性检查记录-批量添加", notes="齐套性检查记录-批量添加")
   //@RequiresPermissions("org.jeecg.modules:mes_kitting_completeness_check:addBatch")
   @PostMapping(value = "/addBatch")
   public Result<String> addBatch(@RequestBody List<MesKittingCompletenessCheck> mesKittingCompletenessCheckList) {
       mesKittingCompletenessCheckService.batchSave(mesKittingCompletenessCheckList);
       return Result.OK("批量添加成功!");
   }
   /**
    *  ç¼–辑
    *
src/main/java/org/jeecg/modules/mes/controller/MesProductionOrderController.java
@@ -1,21 +1,29 @@
package org.jeecg.modules.mes.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.mes.enums.ProductionOrderStatus;
import org.jeecg.modules.mes.service.IMesProductionOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @Description: SAP生产订单
@@ -81,4 +89,25 @@
        }
        return Result.OK(mesProductionOrder);
    }
    @ApiOperation(value = "SAP生产订单-查询可报工的生产订单", notes = "SAP生产订单-查询可报工的生产订单")
    @GetMapping(value = "/selectReportWorkOrderList")
    public Result<?> selectReportWorkOrderList(MesProductionOrder mesProductionOrder) {
        if (StringUtils.isBlank(mesProductionOrder.getMaterialNumber())) {
            return Result.error("请传入必要的查询参数!");
        }
        List<MesProductionOrder> orderList = mesProductionOrderService.list(new LambdaQueryWrapper<MesProductionOrder>()
                .eq(MesProductionOrder::getMaterialNumber, mesProductionOrder.getMaterialNumber())
                .eq(MesProductionOrder::getOrderStatus, ProductionOrderStatus.REL.name())
                .eq(MesProductionOrder::getDelFlag, CommonConstant.DEL_FLAG_0)
                .orderByAsc(MesProductionOrder::getPlanStart));
        List<Map<String, Object>> res = orderList.stream().map(order -> {
            Map<String, Object> map = new HashMap<>();
            map.put("title", order.getOrderCode());
            map.put("label", order.getOrderCode());
            map.put("value", order.getId());
            return map;
        }).collect(Collectors.toList());
        return Result.OK(res);
    }
}
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
@@ -9,18 +9,19 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mes.dto.MesProductionWorkOrderRepublishRequest;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.entity.MesKittingCompletenessCheck;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.enums.ProductionWorkOrderStatus;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.jeecg.modules.mes.utils.CommonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@@ -136,7 +137,7 @@
    @AutoLog(value = "排产工单-发布排产计划")
    @ApiOperation(value = "排产工单-发布排产计划", notes = "排产工单-发布排产计划")
    //@RequiresPermissions("mes:production:work:order:publish")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:publish")
    @RequestMapping(value = "/publish", method = {RequestMethod.POST, RequestMethod.PUT})
    public Result<String> publish(@RequestParam("ids") String ids) {
        List<String> idList = Arrays.asList(ids.split(","));
@@ -153,7 +154,7 @@
            MesProductionWorkOrder publish = new MesProductionWorkOrder()
                    .setId(id)
                    .setPublishTime(new Date())
                    .setPublisher(Objects.requireNonNull(getCurrentUser()).getUsername())
                    .setPublisher(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername())
                    .setWorkOrderStatus(ProductionWorkOrderStatus.PUBLISHED.name());
            publishList.add(publish);
        });
@@ -163,7 +164,7 @@
    @AutoLog(value = "排产工单-重发布排产计划")
    @ApiOperation(value="排产工单-重发布排产计划", notes="重发布排产计划")
    //@RequiresPermissions("mes:production:work:order:republish")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:republish")
    @PostMapping(value = "/republish")
    public Result<String> republish(@RequestBody MesProductionWorkOrderRepublishRequest request) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(request.getId());
@@ -174,15 +175,32 @@
        MesProductionWorkOrder republish = new MesProductionWorkOrder()
                .setId(request.getId())
                .setPlanQuantity(request.getPlanQuantity())
                .setRepublisher(Objects.requireNonNull(getCurrentUser()).getUsername())
                .setRepublisher(Objects.requireNonNull(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername()))
                .setRepublishTime(new Date())
                .setRepublishReason(request.getRepublishReason());
        mesProductionWorkOrderService.updateById(republish);
        return Result.ok("重发布成功!");
    }
    @AutoLog(value = "排产工单-齐套性检查")
    @ApiOperation(value="排产工单-齐套性检查", notes="齐套性检查")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:workOrderCompletenessCheck")
    @GetMapping(value = "/workOrderCompletenessCheck")
    public Result<List<MesKittingCompletenessCheck>> workOrderCompletenessCheck(@RequestParam("id") String id) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id);
        if (workOrder == null) {
            return Result.error("工单不存在!");
        }
        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) {
            return Result.error("当前工单状态不能进行齐套性检查!");
        }
        List<MesKittingCompletenessCheck> list = mesProductionWorkOrderService.workOrderCompletenessCheck(workOrder);
        return Result.ok(list);
    }
    @AutoLog(value = "排产工单-执行排产工单计划")
    @ApiOperation(value = "排产工单-执行排产工单计划", notes = "排产工单-执行排产工单计划")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:execute")
    @GetMapping(value = "/execute")
    public Result<?> execute(@RequestParam("id") String id) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id);
@@ -284,11 +302,4 @@
        return super.importExcel(request, response, MesProductionWorkOrder.class);
    }
    private LoginUser getCurrentUser() {
        try {
            return (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {
            return null;
        }
    }
}
src/main/java/org/jeecg/modules/mes/controller/MesWorkReportingController.java
@@ -63,12 +63,12 @@
    * @param mesWorkReporting
    * @return
    */
   @AutoLog(value = "工单报工-添加")
   @ApiOperation(value="工单报工-添加", notes="工单报工-添加")
   @AutoLog(value = "工单报工-新增报工")
   @ApiOperation(value="工单报工-新增报工", notes="工单报工-新增报工")
   //@RequiresPermissions("org.jeecg.modules:mes_work_reporting:add")
   @PostMapping(value = "/add")
   public Result<String> add(@RequestBody MesWorkReporting mesWorkReporting) {
       mesWorkReportingService.save(mesWorkReporting);
       mesWorkReportingService.addReporting(mesWorkReporting);
       return Result.OK("添加成功!");
   }
src/main/java/org/jeecg/modules/mes/dto/MesProductionWorkOrderRepublishRequest.java
@@ -4,6 +4,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MesProductionWorkOrderRepublishRequest {
@@ -13,7 +15,7 @@
    /**计划生产数量*/
    @ApiModelProperty(value = "计划生产数量")
    private Double planQuantity;
    private BigDecimal planQuantity;
    /**重发布原因*/
    @ApiModelProperty(value = "重发布原因")
src/main/java/org/jeecg/modules/mes/entity/MesKittingCompletenessCheck.java
@@ -15,6 +15,7 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -59,11 +60,11 @@
    /**需求数量*/
    @Excel(name = "需求数量", width = 15)
    @ApiModelProperty(value = "需求数量")
    private Double requiredQuantity;
    private BigDecimal requiredQuantity;
    /**实际数量*/
    @Excel(name = "实际数量", width = 15)
    @ApiModelProperty(value = "实际数量")
    private Double actualQuantity;
    private BigDecimal actualQuantity;
    /**是否齐备*/
    @Excel(name = "是否齐备", width = 15)
    @ApiModelProperty(value = "是否齐备")
@@ -71,4 +72,7 @@
    @TableField(exist = false)
    @ApiModelProperty(value = "工单号")
    private String workOrderCode;
    @TableField(exist = false)
    @ApiModelProperty(value = "基本单位")
    private String productionUnit;
}
src/main/java/org/jeecg/modules/mes/entity/MesProductionWorkOrder.java
@@ -13,6 +13,7 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -69,7 +70,7 @@
    /**计划生产数量*/
    @Excel(name = "计划生产数量", width = 15)
    @ApiModelProperty(value = "计划生产数量")
    private Double planQuantity;
    private BigDecimal planQuantity;
    /**产线ID(冗余)*/
    @Excel(name = "产线ID(冗余)", width = 15)
    @Dict(dictTable = "base_factory", dicCode = "id", dicText = "factory_name")
@@ -96,10 +97,25 @@
    @Dict(dicCode = "work_order_status")
    @ApiModelProperty(value = "工单状态")
    private String workOrderStatus;
    /**是否通过齐套性检查*/
    @Excel(name = "是否通过齐套性检查", width = 15, dicCode = "yn")
    @Dict(dicCode = "yn")
    @ApiModelProperty(value = "是否通过齐套性检查")
    private String completenessCheckFlag = CommonConstant.DEFAULT_0;
    /**是否通过设备点检*/
    @Excel(name = "是否通过设备点检", width = 15, dicCode = "yn")
    @Dict(dicCode = "yn")
    @ApiModelProperty(value = "是否通过设备点检")
    private String equipmentInspectionFlag = CommonConstant.DEFAULT_0;
    /**是否通过工艺点检*/
    @Excel(name = "是否通过工艺点检", width = 15, dicCode = "yn")
    @Dict(dicCode = "yn")
    @ApiModelProperty(value = "是否通过工艺点检")
    private String processInspectionFlag = CommonConstant.DEFAULT_0;
    /**实际报工数量*/
    @Excel(name = "实际报工数量", width = 15)
    @ApiModelProperty(value = "实际报工数量")
    private Double actualQuantity;
    private BigDecimal actualQuantity;
    /**发布人*/
    @Excel(name = "发布人", width = 15)
    @ApiModelProperty(value = "发布人")
src/main/java/org/jeecg/modules/mes/enums/ProductionOrderStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.jeecg.modules.mes.enums;
public enum ProductionOrderStatus {
    /**
     * ä¸‹è¾¾
     */
    REL,
    /**
     * å…³é—­
     */
    TECO
}
src/main/java/org/jeecg/modules/mes/service/IMesKittingCompletenessCheckService.java
@@ -13,4 +13,6 @@
 */
public interface IMesKittingCompletenessCheckService extends IService<MesKittingCompletenessCheck> {
    List<MesKittingCompletenessCheck> queryCompletenessCheckByWorkOrderId(String workOrderId);
    void batchSave(List<MesKittingCompletenessCheck> mesKittingCompletenessCheckList);
}
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.entity.MesKittingCompletenessCheck;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import java.util.List;
@@ -20,4 +21,6 @@
    List<MesProductionWorkOrder> schedule(MesProductionWorkScheduleRequest request);
    IPage<MesProductionWorkOrder> queryPageList(Page<MesProductionWorkOrder> page, Map<String, String[]> parameterMap);
    List<MesKittingCompletenessCheck> workOrderCompletenessCheck(MesProductionWorkOrder workOrder);
}
src/main/java/org/jeecg/modules/mes/service/IMesWorkReportingService.java
@@ -14,4 +14,6 @@
public interface IMesWorkReportingService extends IService<MesWorkReporting> {
    List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId);
    List<MesWorkReporting> queryWorkReportingByOrderId(String orderId);
    void addReporting(MesWorkReporting mesWorkReporting);
}
src/main/java/org/jeecg/modules/mes/service/impl/MesKittingCompletenessCheckServiceImpl.java
@@ -1,11 +1,15 @@
package org.jeecg.modules.mes.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.modules.mes.entity.MesKittingCompletenessCheck;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.mapper.MesKittingCompletenessCheckMapper;
import org.jeecg.modules.mes.service.IMesKittingCompletenessCheckService;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
@@ -17,8 +21,27 @@
@Service
public class MesKittingCompletenessCheckServiceImpl extends ServiceImpl<MesKittingCompletenessCheckMapper, MesKittingCompletenessCheck> implements IMesKittingCompletenessCheckService {
    @Autowired
    private IMesProductionWorkOrderService mesProductionWorkOrderService;
    @Override
    public List<MesKittingCompletenessCheck> queryCompletenessCheckByWorkOrderId(String workOrderId) {
        return baseMapper.queryCompletenessCheckByWorkOrderId(workOrderId);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void batchSave(List<MesKittingCompletenessCheck> mesKittingCompletenessCheckList) {
        boolean allMatch = mesKittingCompletenessCheckList.stream()
                .allMatch(item -> CommonConstant.DEFAULT_1.equals(item.getCheckFlag()));
        //物料都齐备,更新排产工单齐套检查状态
        if (allMatch) {
            MesProductionWorkOrder order = new MesProductionWorkOrder()
                    .setId(mesKittingCompletenessCheckList.get(0).getWorkOrderId())
                    .setCompletenessCheckFlag(CommonConstant.DEFAULT_1);
            mesProductionWorkOrderService.updateById(order);
        }
        //保存齐套检查记录
        saveBatch(mesKittingCompletenessCheckList);
    }
}
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -8,20 +8,35 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.entity.LineSideWarehouse;
import org.jeecg.modules.base.entity.Shift;
import org.jeecg.modules.base.entity.ShiftGroup;
import org.jeecg.modules.base.service.IFactoryService;
import org.jeecg.modules.base.service.ILineSideWarehouseService;
import org.jeecg.modules.base.service.IShiftGroupService;
import org.jeecg.modules.base.service.IShiftService;
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.lsw.service.ILswMaterialInventoryService;
import org.jeecg.modules.lsw.vo.LswMaterialInventoryVo;
import org.jeecg.modules.mes.dto.MesProductionWorkScheduleRequest;
import org.jeecg.modules.mes.entity.MesKittingCompletenessCheck;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.mes.enums.ProductionOrderStatus;
import org.jeecg.modules.mes.service.IMesProductionOrderService;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.mapper.MesProductionWorkOrderMapper;
import org.jeecg.modules.system.service.ISysDictService;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
@@ -43,6 +58,16 @@
    private IShiftGroupService shiftGroupService;
    @Autowired
    private IFactoryService factoryService;
    @Autowired
    private IMesProductionOrderService mesProductionOrderService;
    @Autowired
    private IPmsProcessBillMaterialsService pmsProcessBillMaterialsService;
    @Autowired
    private IPmsProcessBillMaterialsDetailService pmsProcessBillMaterialsDetailService;
    @Autowired
    private ILswMaterialInventoryService lswMaterialInventoryService;
    @Autowired
    private ILineSideWarehouseService lineSideWarehouseService;
    @Override
    public List<MesProductionWorkOrder> schedule(MesProductionWorkScheduleRequest request) {
@@ -127,4 +152,67 @@
        queryWrapper.orderByAsc("t1.work_order_date");
        return this.baseMapper.queryPageList(page, queryWrapper);
    }
    @Override
    public List<MesKittingCompletenessCheck> workOrderCompletenessCheck(MesProductionWorkOrder workOrder) {
        //根据当前排产工单确定生产订单
        List<MesProductionOrder> orderList = mesProductionOrderService.list(new LambdaQueryWrapper<MesProductionOrder>()
                .eq(MesProductionOrder::getMaterialNumber, workOrder.getMaterialNumber())
                .eq(MesProductionOrder::getOrderStatus, ProductionOrderStatus.REL.name())
                .eq(MesProductionOrder::getDelFlag, CommonConstant.DEL_FLAG_0)
                .orderByAsc(MesProductionOrder::getPlanStart));
        if (orderList.isEmpty()) {
            throw new JeecgBootException("未找到该物料的关联生产订单!");
        }
        //默认取时间最早未完成的订单,也就是第一项
        MesProductionOrder order = orderList.get(0);
        //根据生产订单id和物料编码查询订单BOM
        PmsProcessBillMaterials processBillMaterials = pmsProcessBillMaterialsService.list(new LambdaQueryWrapper<PmsProcessBillMaterials>()
                        .eq(PmsProcessBillMaterials::getOrderId, order.getId())
                        .eq(PmsProcessBillMaterials::getMaterialNumber, workOrder.getMaterialNumber()))
                .stream().findFirst().orElse(null);
        if (processBillMaterials == null) {
            throw new JeecgBootException("未找到与该物料关联的订单BOM!");
        }
        //查询工单所属产线对应的线边仓
        LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>()
                        .eq(LineSideWarehouse::getFactoryId, workOrder.getFactoryId())
                        .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0)
                        .eq(LineSideWarehouse::getWarehouseStatus, CommonConstant.DEFAULT_1))
                .stream().findFirst().orElse(null);
        if (lineSideWarehouse == null) {
            throw new JeecgBootException("该产线未配置线边仓!");
        }
        //订单BOM明细
        List<PmsProcessBillMaterialsDetail> processBillMaterialsDetails = pmsProcessBillMaterialsDetailService.queryByMaterialId(processBillMaterials.getId());
        //查询订单BOM明细中的物料在该产线线边仓中的库存
        List<String> bomMaterialNumberList = processBillMaterialsDetails.stream()
                .map(PmsProcessBillMaterialsDetail::getMaterialNumber).collect(Collectors.toList());
        Map<String, LswMaterialInventoryVo> lswMaterialInventoryMap = lswMaterialInventoryService
                .selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, lineSideWarehouse.getId()).stream()
                .collect(Collectors.toMap(LswMaterialInventoryVo::getMaterialNumber, v1 -> v1, (v1, v2) -> v1));
        List<MesKittingCompletenessCheck> completenessCheckResultList = CollectionUtil.newArrayList();
        //根据订单BOM明细列出齐套检查结果
        for (PmsProcessBillMaterialsDetail processBillMaterialsDetail : processBillMaterialsDetails) {
            LswMaterialInventoryVo materialInventoryVo = lswMaterialInventoryMap.get(processBillMaterialsDetail.getMaterialNumber());
            MesKittingCompletenessCheck completenessCheckItem = new MesKittingCompletenessCheck()
                    .setMaterialNumber(processBillMaterialsDetail.getMaterialNumber())
                    .setMaterialName(processBillMaterialsDetail.getMaterialName())
                    //需求数量 = (bom明细的需求数量 / bom订单的数量) * æŽ’产工单计划生产数量
                    .setRequiredQuantity(processBillMaterialsDetail.getUsageQuantity()
                            .divide(processBillMaterials.getProductionQuantity(), 2, RoundingMode.HALF_UP)
                            .multiply(workOrder.getPlanQuantity()))
                    .setActualQuantity(materialInventoryVo == null ? BigDecimal.ZERO : materialInventoryVo.getStockQuantity())
                    .setProductionUnit(processBillMaterialsDetail.getProductionUnit());
            completenessCheckResultList.add(completenessCheckItem);
        }
        completenessCheckResultList.forEach(item -> {
            if (item.getRequiredQuantity().compareTo(item.getActualQuantity()) > 0) {
                item.setCheckFlag(CommonConstant.DEFAULT_0);
            } else {
                item.setCheckFlag(CommonConstant.DEFAULT_1);
            }
        });
        return completenessCheckResultList;
    }
}
src/main/java/org/jeecg/modules/mes/service/impl/MesWorkReportingServiceImpl.java
@@ -1,12 +1,35 @@
package org.jeecg.modules.mes.service.impl;
import cn.hutool.core.date.DateUtil;
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.common.exception.JeecgBootException;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.entity.LineSideWarehouse;
import org.jeecg.modules.base.entity.Shift;
import org.jeecg.modules.base.service.IFactoryService;
import org.jeecg.modules.base.service.ILineSideWarehouseService;
import org.jeecg.modules.base.service.IShiftService;
import org.jeecg.modules.lsw.entity.LswMaterial;
import org.jeecg.modules.lsw.entity.LswMaterialInbound;
import org.jeecg.modules.lsw.enums.MaterialCategory;
import org.jeecg.modules.lsw.service.ILswMaterialInboundService;
import org.jeecg.modules.lsw.service.ILswMaterialService;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import org.jeecg.modules.mes.entity.MesWorkReporting;
import org.jeecg.modules.mes.mapper.MesWorkReportingMapper;
import org.jeecg.modules.mes.service.IMesProductionWorkOrderService;
import org.jeecg.modules.mes.service.IMesWorkReportingService;
import org.jeecg.modules.mes.utils.CommonUtils;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * @Description: å·¥å•报工
@@ -17,6 +40,21 @@
@Service
public class MesWorkReportingServiceImpl extends ServiceImpl<MesWorkReportingMapper, MesWorkReporting> implements IMesWorkReportingService {
    @Autowired
    private IMesProductionWorkOrderService mesProductionWorkOrderService;
    @Autowired
    private ILswMaterialService lswMaterialService;
    @Autowired
    private IFactoryService factoryService;
    @Autowired
    private IShiftService shiftService;
    @Autowired
    private ILineSideWarehouseService lineSideWarehouseService;
    @Autowired
    private ILswMaterialInboundService lswMaterialInboundService;
    @Autowired
    private ISysBusinessCodeRuleService sysBusinessCodeRuleService;
    @Override
    public List<MesWorkReporting> queryWorkReportingByWorkOrderId(String workOrderId) {
        return baseMapper.queryWorkReportingByWorkOrderId(workOrderId);
@@ -26,4 +64,72 @@
    public List<MesWorkReporting> queryWorkReportingByOrderId(String orderId) {
        return baseMapper.queryWorkReportingByOrderId(orderId);
    }
    @Override
    public void addReporting(MesWorkReporting mesWorkReporting) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(mesWorkReporting.getWorkOrderId());
        if (workOrder == null) {
            throw new JeecgBootException("工单不存在!");
        }
        LswMaterial material = lswMaterialService.list(new LambdaQueryWrapper<LswMaterial>()
                        .eq(LswMaterial::getMaterialNumber, workOrder.getMaterialNumber())
                        .eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0)).stream()
                .findAny().orElse(null);
        if (material == null) {
            throw new JeecgBootException("物料不存在!");
        }
        MaterialCategory materialCategory = MaterialCategory.fromName(material.getMaterialCategory());
        if (materialCategory == null) {
            throw new JeecgBootException("未知的物料类型!");
        }
        //生产批次号
        String batchNumber = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingBatchNumber");
        mesWorkReporting.setBatchNumber(batchNumber);
        LineSideWarehouse lineSideWarehouse = lineSideWarehouseService.list(new LambdaQueryWrapper<LineSideWarehouse>()
                        .eq(LineSideWarehouse::getFactoryId, mesWorkReporting.getFactoryId())
                        .eq(LineSideWarehouse::getDelFlag, CommonConstant.DEL_FLAG_0))
                .stream().findAny().orElse(null);
        if (lineSideWarehouse == null) {
            throw new JeecgBootException("线边仓库不存在!");
        }
        mesWorkReporting.setWarehouseId(lineSideWarehouse.getId());
        mesWorkReporting.setReporter(Objects.requireNonNull(CommonUtils.getCurrentUser()).getUsername());
        mesWorkReporting.setReportTime(new Date());
        String date = DateUtil.format(new Date(), "yyMMdd");
        switch (materialCategory) {
            case FINISHED:
                //成品报工逻辑
                String palletNumber4 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber4");
                String finishedPalletNumber = material.getMaterialNumber() + date + palletNumber4;
                mesWorkReporting.setPalletNumber(finishedPalletNumber);
                //todo æ‰£å‡å†…法兰(对应机加内法兰线边库)、外法兰(对应机加外法兰线边库)、小内圈(对应装配线边库)库存,调用SAP投料接口
                //todo è°ƒç”¨SAP工序报工
                //todo æ‰“印成品托标签、检验标识卡、移库单、完工检验工单;判断生产订单是否需要关闭(合格数量 = è®¢å•数量)
                break;
            case HALF:
            case RAW:
                //半成品报工逻辑
                Factory factory = factoryService.getById(mesWorkReporting.getFactoryId());
                Shift shift = shiftService.getById(workOrder.getShiftId());
                String palletNumber6 = sysBusinessCodeRuleService.generateBusinessCodeSeq("WorkReportingPalletNumber6");
                //拼接半成品报工托号
                String halfPalletNumber = factory.getFactoryCode() + material.getMaterialNumber() + date + shift.getShiftCode() + palletNumber6;
                mesWorkReporting.setPalletNumber(halfPalletNumber);
                //todo æ‰£å‡å¯¹åº”线边库(外法兰毛坯、内法兰毛坯)库存后,调用SAP投料接口
                //todo è°ƒç”¨SAP工序报工
                break;
            case PARTS:
                break;
        }
        save(mesWorkReporting);
        //线边库入库逻辑
        LswMaterialInbound lswMaterialInbound = new LswMaterialInbound()
                .setFactoryId(mesWorkReporting.getFactoryId())
                .setMaterialNumber(material.getMaterialNumber())
                .setMaterialName(material.getMaterialName())
                .setBatchNumber(batchNumber)
                .setQuantity(mesWorkReporting.getQuantity())
                .setWarehouseId(lineSideWarehouse.getId());
        lswMaterialInboundService.save(lswMaterialInbound);
    }
}
src/main/java/org/jeecg/modules/mes/utils/CommonUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.jeecg.modules.mes.utils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
public class CommonUtils {
    public static LoginUser getCurrentUser() {
        try {
            return (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {
            return null;
        }
    }
}