新火炬后端单体项目初始化代码
已添加7个文件
已修改29个文件
1067 ■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/entity/Factory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/base/model/FactoryTreeModel.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/entity/LswMaterial.java 60 ●●●●● 补丁 | 查看 | 原始文档 | 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/enums/MaterialCategoryEnum.java 10 ●●●●● 补丁 | 查看 | 原始文档 | 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/ILswMaterialService.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialInventoryServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialServiceImpl.java 168 ●●●●● 补丁 | 查看 | 原始文档 | 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/job/ProductionOrderSyncCreationJob.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java 9 ●●●●● 补丁 | 查看 | 原始文档 | 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 | 历史
src/main/java/org/jeecg/modules/wms/controller/WMSTestController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/WMSWebService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.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-8-14 13:31:57",
  "updatedTime": "2025-8-15 14:58:22",
  "dbConns": [],
  "profile": {
    "default": {
@@ -11467,7 +11467,7 @@
        {
          "defKey": "work_order_status",
          "defName": "工单状态",
          "comment": "新建、已发布、重发布",
          "comment": "新建、已发布、执行中、已关闭",
          "type": "",
          "len": "",
          "scale": "",
@@ -11481,6 +11481,60 @@
          "extProps": {},
          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
          "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",
@@ -61126,7 +61180,7 @@
          "codeRoot": ""
        }
      },
      "defKey": "lsw_​material",
      "defKey": "lsw_material",
      "defName": "线边库物料信息",
      "comment": "",
      "properties": {
@@ -61433,24 +61487,6 @@
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
        },
        {
          "defKey": "material_model",
          "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": "C2AF21CA-2BB0-4F88-9E66-F216401711A0"
        },
        {
          "defKey": "material_category",
          "defName": "物料类型",
          "comment": "成品/外法兰/内法兰/毛坯/配件",
@@ -61485,6 +61521,24 @@
          "extProps": {},
          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
          "id": "11AE1590-5695-4C1E-A85F-72AAD8288740"
        },
        {
          "defKey": "material_status",
          "defName": "状态",
          "comment": "启用、禁用",
          "type": "",
          "len": "",
          "scale": "",
          "primaryKey": false,
          "notNull": false,
          "autoIncrement": false,
          "defaultValue": "",
          "hideInGraph": false,
          "refDict": "",
          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
          "extProps": {},
          "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792",
          "id": "D9381762-109B-4003-9520-FF30D6D1D2AF"
        }
      ],
      "correlations": [],
src/main/java/org/jeecg/modules/base/entity/Factory.java
@@ -94,4 +94,9 @@
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**产线类型*/
    @Excel(name = "产线类型", width = 15)
    @ApiModelProperty(value = "产线类型")
    private String productionType;
}
src/main/java/org/jeecg/modules/base/enums/ProductionTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.base.enums;
public enum ProductionTypeEnum {
    /**
     * è£…配
     */
    ASSEMBLE,
    /**
     * å†…法兰
     */
    INNERFLANGE,
    /**
     * å¤–法兰
     */
    OUTERFLANGE,
    /**
     * çƒ­å¤„理
     */
    HEATTREATMENT
}
src/main/java/org/jeecg/modules/base/model/FactoryTreeModel.java
@@ -74,6 +74,8 @@
    private String mdcFlag;
    private String productionType;
    private List<FactoryTreeModel> children = new ArrayList<>();
    public FactoryTreeModel() {
@@ -103,5 +105,6 @@
        this.updateTime = factory.getUpdateTime();
        this.mdcFlag = factory.getMdcFlag();
        this.factoryCategory = factory.getFactoryCategory();
        this.productionType = factory.getProductionType();
    }
}
src/main/java/org/jeecg/modules/lsw/controller/LswMaterialController.java
@@ -10,6 +10,8 @@
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
@@ -20,21 +22,15 @@
import org.jeecg.modules.lsw.service.ILswMaterialInventoryService;
import org.jeecg.modules.lsw.service.ILswMaterialService;
import org.jeecg.modules.lsw.vo.LswMaterialPage;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -48,7 +44,7 @@
 */
@Api(tags = "线边库物料信息")
@RestController
@RequestMapping("/lswmaterial/lswMaterial")
@RequestMapping("/lsw/lswMaterial")
@Slf4j
public class LswMaterialController {
    @Autowired
@@ -67,7 +63,6 @@
     * @param req
     * @return
     */
    //@AutoLog(value = "线边库物料信息-分页列表查询")
    @ApiOperation(value = "线边库物料信息-分页列表查询", notes = "线边库物料信息-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<LswMaterial>> queryPageList(LswMaterial lswMaterial,
@@ -75,77 +70,55 @@
                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                    HttpServletRequest req) {
        QueryWrapper<LswMaterial> queryWrapper = QueryGenerator.initQueryWrapper(lswMaterial, req.getParameterMap());
        Page<LswMaterial> page = new Page<LswMaterial>(pageNo, pageSize);
        if (lswMaterial.isMaterialCategoryNull()) {
            queryWrapper.isNull("material_category");
        }
        Page<LswMaterial> page = new Page<>(pageNo, pageSize);
        IPage<LswMaterial> pageList = lswMaterialService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
    /**
     * æ·»åŠ 
     *
     * @param lswMaterialPage
     * @return
     */
    @AutoLog(value = "线边库物料信息-添加")
    @ApiOperation(value = "线边库物料信息-添加", notes = "线边库物料信息-添加")
    //@RequiresPermissions("org.jeecg.modules:lsw_material:add")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody LswMaterialPage lswMaterialPage) {
        LswMaterial lswMaterial = new LswMaterial();
        BeanUtils.copyProperties(lswMaterialPage, lswMaterial);
        lswMaterialService.saveMain(lswMaterial, lswMaterialPage.getLswMaterialInventoryList());
        return Result.OK("添加成功!");
    }
    /**
     * ç¼–辑
     *
     * @param lswMaterialPage
     * @param lswMaterial
     * @return
     */
    @AutoLog(value = "线边库物料信息-编辑")
    @ApiOperation(value = "线边库物料信息-编辑", notes = "线边库物料信息-编辑")
    //@RequiresPermissions("org.jeecg.modules:lsw_material:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<String> edit(@RequestBody LswMaterialPage lswMaterialPage) {
        LswMaterial lswMaterial = new LswMaterial();
        BeanUtils.copyProperties(lswMaterialPage, lswMaterial);
        LswMaterial lswMaterialEntity = lswMaterialService.getById(lswMaterial.getId());
        if (lswMaterialEntity == null) {
            return Result.error("未找到对应数据");
    public Result<String> edit(@RequestBody LswMaterial lswMaterial) {
        boolean b = lswMaterialService.editMaterial(lswMaterial);
        if (!b) {
            return Result.error("编辑失败");
        }
        lswMaterialService.updateMain(lswMaterial, lswMaterialPage.getLswMaterialInventoryList());
        return Result.OK("编辑成功!");
    }
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "线边库物料信息-通过id删除")
    @ApiOperation(value = "线边库物料信息-通过id删除", notes = "线边库物料信息-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:lsw_material:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
        lswMaterialService.delMain(id);
        return Result.OK("删除成功!");
    @AutoLog(value = "线边库物料信息-启用")
    @ApiOperation(value = "线边库物料信息-启用", notes = "线边库物料信息-启用")
    @GetMapping("/active")
    public Result<?> active(@RequestParam("id") String id) {
        LswMaterial entity = lswMaterialService.getById(id);
        if (entity == null) {
            return Result.error("数据不存在");
        }
        entity.setMaterialStatus(CommonConstant.STATUS_1);
        lswMaterialService.updateById(entity);
        return Result.OK("操作成功");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "线边库物料信息-批量删除")
    @ApiOperation(value = "线边库物料信息-批量删除", notes = "线边库物料信息-批量删除")
    //@RequiresPermissions("org.jeecg.modules:lsw_material:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        this.lswMaterialService.delBatchMain(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    @AutoLog(value = "线边库物料信息-禁用")
    @ApiOperation(value = "线边库物料信息-禁用", notes = "线边库物料信息-禁用")
    @GetMapping("/inactive")
    public Result<?> inactive(@RequestParam("id") String id) {
        LswMaterial entity = lswMaterialService.getById(id);
        if (entity == null) {
            return Result.error("数据不存在");
        }
        entity.setMaterialStatus(CommonConstant.STATUS_0);
        lswMaterialService.updateById(entity);
        return Result.OK("操作成功");
    }
    /**
@@ -178,7 +151,7 @@
    public Result<List<LswMaterialInventory>> queryLswMaterialInventoryListByMainId(@RequestParam(name = "id", required = true) String id) {
        List<LswMaterialInventory> lswMaterialInventoryList = lswMaterialInventoryService.selectByMainId(id);
        for (LswMaterialInventory lswMaterialInventory : lswMaterialInventoryList) {
            if(StringUtils.isNotEmpty(lswMaterialInventory.getWarehouseId())){
            if (StringUtils.isNotEmpty(lswMaterialInventory.getWarehouseId())) {
                String warehouseId = lswMaterialInventory.getWarehouseId();
                LineSideWarehouse warehouse = lineSideWarehouseService.getById(warehouseId);
                lswMaterialInventory.setWarehouseName(warehouse.getWarehouseName());
@@ -226,47 +199,6 @@
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("线边库物料信息数据", "导出人:" + sysUser.getRealname(), "线边库物料信息"));
        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
        return mv;
    }
    /**
     * é€šè¿‡excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("org.jeecg.modules:lsw_material:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            // èŽ·å–ä¸Šä¼ æ–‡ä»¶å¯¹è±¡
            MultipartFile file = entity.getValue();
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                List<LswMaterialPage> list = ExcelImportUtil.importExcel(file.getInputStream(), LswMaterialPage.class, params);
                for (LswMaterialPage page : list) {
                    LswMaterial po = new LswMaterial();
                    BeanUtils.copyProperties(page, po);
                    lswMaterialService.saveMain(po, page.getLswMaterialInventoryList());
                }
                return Result.OK("文件导入成功!数据行数:" + list.size());
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.OK("文件导入失败!");
    }
    @GetMapping(value = "/searchlikeQuery")
src/main/java/org/jeecg/modules/lsw/entity/LswMaterial.java
@@ -1,9 +1,6 @@
package org.jeecg.modules.lsw.entity;
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.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -18,62 +15,57 @@
/**
 * @Description: çº¿è¾¹åº“物料信息
 * @Author: jeecg-boot
 * @Date:   2025-06-30
 * @Date: 2025-06-30
 * @Version: V1.0
 */
@ApiModel(value="lsw_material对象", description="线边库物料信息")
@ApiModel(value = "lsw_material对象", description = "线边库物料信息")
@Data
@TableName("lsw_material")
public class LswMaterial 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;
    /**所属部门*/
    @ApiModelProperty(value = "所属部门")
    private String sysOrgCode;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    /**删除标记*/
    @ApiModelProperty(value = "删除标记")
    @TableLogic
    private Integer delFlag;
    /**物料编码*/
    @Excel(name = "物料编码", width = 15)
    /**物料编码*/
    @ApiModelProperty(value = "物料编码")
    private String materialNumber;
    /**物料名称*/
    @Excel(name = "物料名称", width = 15)
    /**物料名称*/
    @ApiModelProperty(value = "物料名称")
    private String materialName;
    /**物料型号*/
    @Excel(name = "物料型号", width = 15)
    @ApiModelProperty(value = "物料型号")
    private String materialModel;
    /**物料类型*/
    @Excel(name = "物料类型", width = 15, dicCode = "material_category")
    /**物料类型*/
    @Dict(dicCode = "material_category")
    @ApiModelProperty(value = "物料类型")
    private String materialCategory;
    /**单位*/
    @Excel(name = "单位", width = 15)
    @ApiModelProperty(value = "单位")
    /**基本计量单位*/
    @ApiModelProperty(value = "基本计量单位")
    private String materialUnit;
    /**物料状态*/
    @ApiModelProperty(value = "物料状态")
    private String materialStatus;
    /** ç‰©æ–™ç±»åž‹æ˜¯å¦ä¸ºç©º */
    @TableField(exist = false)
    private boolean materialCategoryNull;
}
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/enums/MaterialCategoryEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package org.jeecg.modules.lsw.enums;
public enum MaterialCategoryEnum {
    FINISHED_PRODUCT, //成品
    OUTER_FLANGE, //外法兰
    INNER_FLANGE, //内法兰
    COMPONENTS, //配件
    BLANK, //毛坯
    ;
}
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/ILswMaterialService.java
@@ -3,11 +3,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.lsw.entity.LswMaterial;
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.sap.dto.OrderBomDTO;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -19,36 +18,28 @@
 */
public interface ILswMaterialService extends IService<LswMaterial> {
    /**
     * æ·»åŠ ä¸€å¯¹å¤š
     *
     * @param lswMaterial
     * @param lswMaterialInventoryList
     */
    public void saveMain(LswMaterial lswMaterial,List<LswMaterialInventory> lswMaterialInventoryList) ;
    /**
     * ä¿®æ”¹ä¸€å¯¹å¤š
     *
   * @param lswMaterial
   * @param lswMaterialInventoryList
     */
    public void updateMain(LswMaterial lswMaterial,List<LswMaterialInventory> lswMaterialInventoryList);
    /**
     * åˆ é™¤ä¸€å¯¹å¤š
     *
     * @param id
     */
    public void delMain (String id);
    /**
     * æ‰¹é‡åˆ é™¤ä¸€å¯¹å¤š
     *
     * @param idList
     */
    public void delBatchMain (Collection<? extends Serializable> idList);
    IPage<Map<String, Object>> getLswMaterialListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
    /**
     * ç¼–辑物料信息
     * @param lswMaterial
     * @return
     */
    boolean editMaterial(LswMaterial lswMaterial);
    /**
     * æ ¹æ®ç‰©æ–™ç¼–号查询
     * @param materialNumber
     * @return
     */
    LswMaterial queryByMaterialNumber(String materialNumber);
    /**
     * æ‰¹é‡ä¿å­˜ç‰©æ–™åŸºæœ¬ä¿¡æ¯
     * @param orderMap
     * @param orderBomDTOList
     * @return
     */
    boolean saveOrUpdateMaterial(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList);
}
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/service/impl/LswMaterialServiceImpl.java
@@ -1,106 +1,126 @@
package org.jeecg.modules.lsw.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.common.constant.CommonConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.lsw.entity.LswMaterial;
import org.jeecg.modules.lsw.entity.LswMaterialInventory;
import org.jeecg.modules.lsw.mapper.LswMaterialInventoryMapper;
import org.jeecg.modules.lsw.mapper.LswMaterialMapper;
import org.jeecg.modules.lsw.service.ILswMaterialService;
import org.jeecg.modules.mes.entity.MesProductionOrder;
import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
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.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Description: çº¿è¾¹åº“物料信息
 * @Author: jeecg-boot
 * @Date:   2025-06-30
 * @Date: 2025-06-30
 * @Version: V1.0
 */
@Service
public class LswMaterialServiceImpl extends ServiceImpl<LswMaterialMapper, LswMaterial> implements ILswMaterialService {
    @Autowired
    private LswMaterialMapper lswMaterialMapper;
    @Autowired
    private LswMaterialInventoryMapper lswMaterialInventoryMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveMain(LswMaterial lswMaterial, List<LswMaterialInventory> lswMaterialInventoryList) {
        lswMaterialMapper.insert(lswMaterial);
        if(lswMaterialInventoryList!=null && lswMaterialInventoryList.size()>0) {
            for(LswMaterialInventory entity:lswMaterialInventoryList) {
                //外键设置
                entity.setMaterialId(lswMaterial.getId());
                lswMaterialInventoryMapper.insert(entity);
            }
        }
    }
    @Autowired
    private LswMaterialMapper lswMaterialMapper;
    @Autowired
    private LswMaterialInventoryMapper lswMaterialInventoryMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateMain(LswMaterial lswMaterial,List<LswMaterialInventory> lswMaterialInventoryList) {
        lswMaterialMapper.updateById(lswMaterial);
        //1.先删除子表数据
        lswMaterialInventoryMapper.deleteByMainId(lswMaterial.getId());
        //2.子表数据重新插入
        if(lswMaterialInventoryList!=null && lswMaterialInventoryList.size()>0) {
            for(LswMaterialInventory entity:lswMaterialInventoryList) {
                //外键设置
                entity.setMaterialId(lswMaterial.getId());
                lswMaterialInventoryMapper.insert(entity);
            }
        }
    }
    @Override
    public IPage<Map<String, Object>> getLswMaterialListData(Integer pageNo, Integer pageSize, HttpServletRequest req) {
        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
        Map<String, String> paramMap = new HashMap<String, String>();
        Map<String, String[]> parameterMap = req.getParameterMap();
        if (null != parameterMap) {
            if (parameterMap.containsKey("materialNumber") && StringUtils.isNotBlank(parameterMap.get("materialNumber")[0])) {
                paramMap.put("materialNumber", parameterMap.get("materialNumber")[0]);
            }
            if (parameterMap.containsKey("materialName") && StringUtils.isNotBlank(parameterMap.get("materialName")[0])) {
                paramMap.put("materialName", parameterMap.get("materialName")[0].trim());
            }
            if (parameterMap.containsKey("materialModel") && StringUtils.isNotBlank(parameterMap.get("materialModel")[0])) {
                paramMap.put("materialModel", parameterMap.get("materialModel")[0].trim());
            }
            if (parameterMap.containsKey("materialCategory") && StringUtils.isNotBlank(parameterMap.get("materialCategory")[0])) {
                paramMap.put("materialCategory", parameterMap.get("materialCategory")[0].trim());
            }
        }
        return super.getBaseMapper().getLswMaterialListData(pageData, paramMap);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delMain(String id) {
        lswMaterialInventoryMapper.deleteByMainId(id);
        lswMaterialMapper.deleteById(id);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean editMaterial(LswMaterial lswMaterial) {
        LswMaterial entity = this.getBaseMapper().selectById(lswMaterial.getId());
        if (entity == null) {
            throw new JeecgBootException("要编辑的数据不存在!");
        }
        entity.setMaterialCategory(lswMaterial.getMaterialCategory());
        this.updateById(entity);
        return true;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delBatchMain(Collection<? extends Serializable> idList) {
        for(Serializable id:idList) {
            lswMaterialInventoryMapper.deleteByMainId(id.toString());
            lswMaterialMapper.deleteById(id);
        }
    }
    @Override
    public LswMaterial queryByMaterialNumber(String materialNumber) {
        LambdaQueryWrapper<LswMaterial> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LswMaterial::getMaterialNumber, materialNumber);
        queryWrapper.eq(LswMaterial::getDelFlag, CommonConstant.DEL_FLAG_0);
        List<LswMaterial> list = this.getBaseMapper().selectList(queryWrapper);
        if (CollectionUtil.isEmpty(list)) {
            return null;
        }
        return list.get(0);
    }
    @Override
    public IPage<Map<String, Object>> getLswMaterialListData(Integer pageNo, Integer pageSize, HttpServletRequest req) {
        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
        Map<String, String> paramMap = new HashMap<String, String>();
        Map<String, String[]> parameterMap = req.getParameterMap();
        if (null != parameterMap) {
            if (parameterMap.containsKey("materialNumber") && StringUtils.isNotBlank(parameterMap.get("materialNumber")[0])) {
                paramMap.put("materialNumber", parameterMap.get("materialNumber")[0]);
            }
            if (parameterMap.containsKey("materialName") && StringUtils.isNotBlank(parameterMap.get("materialName")[0])) {
                paramMap.put("materialName", parameterMap.get("materialName")[0].trim());
            }
            if (parameterMap.containsKey("materialModel") && StringUtils.isNotBlank(parameterMap.get("materialModel")[0])) {
                paramMap.put("materialModel", parameterMap.get("materialModel")[0].trim());
            }
            if (parameterMap.containsKey("materialCategory") && StringUtils.isNotBlank(parameterMap.get("materialCategory")[0])) {
                paramMap.put("materialCategory", parameterMap.get("materialCategory")[0].trim());
            }
        }
        return super.getBaseMapper().getLswMaterialListData(pageData, paramMap);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateMaterial(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList) {
        Map<String, LswMaterial> addMap = new HashMap<>();
        for (Map.Entry<String, MesProductionOrder> entry : orderMap.entrySet()) {
            MesProductionOrder order = entry.getValue();
            LswMaterial material = queryByMaterialNumber(order.getMaterialNumber());
            if (material == null) {
                //新增物料
                material = new LswMaterial();
                material.setMaterialStatus(CommonConstant.STATUS_1);
                material.setMaterialNumber(order.getMaterialNumber());
                material.setMaterialName(order.getMaterialName());
                material.setMaterialUnit(order.getProductionUnit());
                material.setDelFlag(CommonConstant.DEL_FLAG_0);
                addMap.put(material.getMaterialNumber(), material);
            }
        }
        for (OrderBomDTO bomDTO : orderBomDTOList) {
            LswMaterial material = queryByMaterialNumber(bomDTO.getMATNR());
            if (material == null) {
                //新增物料
                material = new LswMaterial();
                material.setMaterialStatus(CommonConstant.STATUS_1);
                material.setMaterialNumber(bomDTO.getMATNR());
                material.setMaterialName(bomDTO.getMAKTX());
                material.setMaterialUnit(bomDTO.getMEINS());
                material.setDelFlag(CommonConstant.DEL_FLAG_0);
                addMap.put(material.getMaterialNumber(), material);
            }
        }
        if (CollectionUtil.isNotEmpty(addMap)) {
            Collection<LswMaterial> addList = addMap.values();
            super.saveBatch(addList);
        }
        return true;
    }
}
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/job/ProductionOrderSyncCreationJob.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.mes.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.lsw.service.ILswMaterialService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.mes.entity.MesProductionOrder;
@@ -87,6 +88,8 @@
    private ISysQuartzLogService sysQuartzLogService;
    @Autowired
    private IQuartzJobService quartzJobService;
    @Autowired
    private ILswMaterialService lswMaterialService;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
@@ -144,12 +147,19 @@
                log.error("返回类型错误, class:{}", result == null ? null : result.getClass());
                return;
            }
            //订单BOM数据处理
            List<OrderBomDTO> orderBomDTOList = (List<OrderBomDTO>) result;
            b = processBillMaterialsService.saveOrUpdateOrderBom(orderMap, orderBomDTOList);
            if (!b) {
                log.error("保存订单BOM失败,日期:{}", LocalDateTime.now());
                return;
            }
            //物料数据处理
            b = lswMaterialService.saveOrUpdateMaterial(orderMap, orderBomDTOList);
            if (!b) {
                log.error("保存物料失败,日期:{}", LocalDateTime.now());
                return;
            }
            //订单工序同步
            Map<String, Object> orderProcessMap = orderProcessSync.syncOrderProcess(FACTORY_CODE, orderCodes);
            if (orderBomMap == null || !SUCCESS_CODE.equals(orderProcessMap.get("ztype"))) {
src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncUpdateJob.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.mes.job;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.lsw.service.ILswMaterialService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.ThrowableUtil;
import org.jeecg.modules.mes.entity.MesProductionOrder;
@@ -87,6 +88,8 @@
    private ISysQuartzLogService sysQuartzLogService;
    @Autowired
    private IQuartzJobService quartzJobService;
    @Autowired
    private ILswMaterialService lswMaterialService;
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
@@ -150,6 +153,12 @@
                log.error("保存订单BOM失败,日期:{}", LocalDateTime.now());
                return;
            }
            //物料数据处理
            b = lswMaterialService.saveOrUpdateMaterial(orderMap, orderBomDTOList);
            if (!b) {
                log.error("保存物料失败,日期:{}", LocalDateTime.now());
                return;
            }
            //订单工序同步
            Map<String, Object> orderProcessMap = orderProcessSync.syncOrderProcess(FACTORY_CODE, orderCodes);
            if (orderBomMap == null || !SUCCESS_CODE.equals(orderProcessMap.get("ztype"))) {
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;
        }
    }
}
src/main/java/org/jeecg/modules/wms/controller/WMSTestController.java
@@ -8,6 +8,7 @@
import org.jeecg.modules.wms.dto.ReceiveMESScanItemListResponse;
import org.jeecg.modules.wms.request.ReceiveMESScanItemList;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.jeecg.modules.wms.service.WMSWebService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,8 +21,6 @@
public class WMSTestController {
    @Value("${webservice.url}")
    private String url;
    @Value("${webservice.namespace}")
    private String namespace;
    @ApiOperation(value = "WMS集成测试-接收WMS移库结果", notes = "WMS集成测试-接收WMS移库结果")
    @PostMapping("/testReceiveWMSScanItemList")
@@ -34,4 +33,15 @@
        ReceiveMESScanItemListResponse response = service.receiveWMSScanItemList(request);
        return Result.ok(response);
    }
    @ApiOperation(value = "WMS集成测试-HelloWord测试", notes = "WMS集成测试-HelloWord测试")
    @PostMapping("/testHelloWorld")
    public Result<?> testHelloWorld() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setAddress(url);
        factory.setServiceClass(WMSWebService.class);
        WMSWebService service = (WMSWebService) factory.create();
        String response = service.helloWorld();
        return Result.ok(response);
    }
}
src/main/java/org/jeecg/modules/wms/service/WMSWebService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package org.jeecg.modules.wms.service;
import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name = "WebService", targetNamespace = "http://tempuri.org")
public interface WMSWebService {
    @WebMethod(operationName = "HelloWorld")
    @WebResult(name = "HelloWorldResponse")
    String helloWorld();
}
src/main/java/org/jeecg/modules/wms/service/impl/ReceiveWMSScanItemListServiceImpl.java
@@ -6,13 +6,11 @@
import org.jeecg.modules.wms.dto.ReceiveMESScanItemListResponse;
import org.jeecg.modules.wms.request.ReceiveMESScanItemList;
import org.jeecg.modules.wms.service.ReceiveWMSScanItemListService;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
@Slf4j
//@Service
@WebService(name = "ReceiveWMSScanItemListService",  targetNamespace = "http://xhj008.server.webservice.com", endpointInterface = "org.jeecg.modules.wms.service.ReceiveWMSScanItemListService")
public class ReceiveWMSScanItemListServiceImpl implements ReceiveWMSScanItemListService {