新火炬后端单体项目初始化代码
已修改23个文件
461 ■■■■ 文件已修改
db/双林新火炬MES数据库设计.pdma.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/entity/CuttingReceive.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveDetailMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/ICuttingInventoryService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/controller/EamInspectionOrderController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/mapper/LswMaterialInventoryMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/mapper/xml/LswMaterialInventoryMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/ILswMaterialInventoryService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialInventoryServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/mapper/MesProductionWorkOrderMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/mapper/xml/MesProductionWorkOrderMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/mapper/PmsProcessBillMaterialsDetailMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/mapper/xml/PmsProcessBillMaterialsDetailMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/Ë«ÁÖлð¾æMESÊý¾Ý¿âÉè¼Æ.pdma.json
@@ -4,7 +4,7 @@
  "avatar": "",
  "version": "4.9.2",
  "createdTime": "2025-3-10 16:38:19",
  "updatedTime": "2025-9-9 17:51:22",
  "updatedTime": "2025-9-12 15:03:56",
  "dbConns": [],
  "profile": {
    "default": {
@@ -71266,7 +71266,9 @@
        "B57F92D3-3089-453E-A007-85C497CEE088",
        "EE37A932-3559-47C8-A1F3-1E788DE4A116",
        "D1A16DCC-C4AB-4717-A74C-1B52B918A87F",
        "378CF92C-B63B-4D7F-84DF-5D2F84CE4753"
        "378CF92C-B63B-4D7F-84DF-5D2F84CE4753",
        "9F7C10B2-9B87-4E80-AF35-D054CEEF11FA",
        "C4D7D8D8-A80F-4A15-B253-50CF701ADF78"
      ],
      "refViews": [],
      "refDiagrams": [],
src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java
@@ -1,8 +1,7 @@
package org.jeecg.modules.cms.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
@@ -3,6 +3,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -12,6 +13,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.micrometer.core.annotation.Timed;
import liquibase.pro.packaged.G;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
@@ -43,10 +45,10 @@
import org.jeecg.common.aspect.annotation.AutoLog;
/**
 * @Description: åˆ€å…·é¢†ç”¨å•
 * @Author: jeecg-boot
 * @Date: 2025-07-28
 * @Version: V1.0
 * @Description:  åˆ€å…·é¢†ç”¨å•
 * @Author:  jeecg-boot
 * @Date:  2025-07-28
 * @Version:  V1.0
 */
@Api(tags = "刀具领用单")
@RestController
@@ -58,14 +60,12 @@
    @Autowired
    private ICuttingReceiveDetailService cuttingReceiveDetailService;
    @Autowired
    private ICuttingInventoryService cuttingInventoryService;
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param cuttingReceive
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "刀具领用单-分页列表查询")
    @ApiOperation(value = "刀具领用单-分页列表查询", notes = "刀具领用单-分页列表查询")
@@ -75,16 +75,13 @@
                                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                       HttpServletRequest req) {
        QueryWrapper<CuttingReceive> queryWrapper = QueryGenerator.initQueryWrapper(cuttingReceive, req.getParameterMap());
        Page<CuttingReceive> page = new Page<CuttingReceive>(pageNo, pageSize);
        Page<CuttingReceive> page = new Page<>(pageNo, pageSize);
        IPage<CuttingReceive> pageList = cuttingReceiveService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
    /**
     * æ·»åŠ 
     *
     * @param jSONObject
     * @return
     */
    @AutoLog(value = "刀具领用单-添加")
    @ApiOperation(value = "刀具领用单-添加", notes = "刀具领用单-添加")
@@ -99,23 +96,32 @@
        // åˆ é™¤åŽŸæœ‰å…³è”çš„æ˜Žç»†æ•°æ®
        List<CuttingReceiveDetail> cuttingReceiveDetailList = cuttingReceiveDetailService.lambdaQuery().eq(CuttingReceiveDetail::getOrderId, cuttingReceive.getId()).list();
        cuttingReceiveDetailService.removeBatchByIds(cuttingReceiveDetailList);
        // é‡æ–°æ·»åŠ æ–°çš„æ˜Žç»†æ•°æ®
        JSONArray jsonArray = jSONObject.getJSONArray("detailData");
        List<CuttingReceiveDetail> list = jsonArray.toJavaList(CuttingReceiveDetail.class);
        for (int i = 0; i < list.size(); i++) {
            CuttingReceiveDetail temp = list.get(i);
        for (CuttingReceiveDetail temp : list) {
            temp.setOrderId(cuttingReceive.getId());
            cuttingReceiveDetailService.save(temp);
        }
        // æ›´æ–°åº“存刀具状态为"已出库"
        if (!list.isEmpty()) {
            // æ”¶é›†æ‰€æœ‰éœ€è¦æ›´æ–°çŠ¶æ€çš„åº“å­˜ID
            List<String> inventoryIds = list.stream()
                    .map(CuttingReceiveDetail::getInventoryId) // å‡è®¾CuttingReceiveDetail中有inventoryId字段
                    .filter(id -> id != null && !id.isEmpty())
                    .collect(Collectors.toList());
            if (!inventoryIds.isEmpty()) {
                // æ›´æ–°åº“存状态为"已出库"
                cuttingInventoryService.updateStatus(inventoryIds, "待出库");
            }
        }
        return Result.OK("添加成功!");
    }
    /**
     * ç¼–辑
     *
     * @param cuttingReceive
     * @return
     */
    @AutoLog(value = "刀具领用单-编辑")
    @ApiOperation(value = "刀具领用单-编辑", notes = "刀具领用单-编辑")
@@ -128,44 +134,35 @@
    /**
     * é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "刀具领用单-通过id删除")
    @ApiOperation(value = "刀具领用单-通过id删除", notes = "刀具领用单-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
    public Result<String> delete(@RequestParam(name = "id") String id) {
        cuttingReceiveService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "刀具领用单-批量删除")
    @ApiOperation(value = "刀具领用单-批量删除", notes = "刀具领用单-批量删除")
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
    public Result<String> deleteBatch(@RequestParam(name = "ids") String ids) {
        this.cuttingReceiveService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "刀具领用单-通过id查询")
    @ApiOperation(value = "刀具领用单-通过id查询", notes = "刀具领用单-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<CuttingReceive> queryById(@RequestParam(name = "id", required = true) String id) {
    public Result<CuttingReceive> queryById(@RequestParam(name = "id") String id) {
        CuttingReceive cuttingReceive = cuttingReceiveService.getById(id);
        if (cuttingReceive == null) {
            return Result.error("未找到对应数据");
@@ -175,9 +172,6 @@
    /**
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param cuttingReceive
     */
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:exportXls")
    @RequestMapping(value = "/exportXls")
@@ -187,10 +181,6 @@
    /**
     * é€šè¿‡excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("cms_cutting_receive:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
@@ -200,9 +190,6 @@
    /**
     * æ ¹æ®é¢†ç”¨id查询领用明细
     *
     * @param orderId
     * @return
     */
    @GetMapping("/detailList")
    public Result<?> detailList(@RequestParam("orderId") String orderId) {
@@ -212,8 +199,6 @@
    /**
     * é€‰æ‹©åº“存刀具的列表
     *
     * @return
     */
    @GetMapping("/getInventoryToolList")
    public Result<?> getInventoryToolList(@RequestParam("pageNo") Integer pageNo,
@@ -222,4 +207,12 @@
        IPage<Map<String, Object>> inventoryTooList = cuttingReceiveService.getInventoryToolList(pageNo, pageSize, params);
        return Result.ok(inventoryTooList);
    }
    @GetMapping("/submit")
    @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时")
    public Result<?> submit(@RequestParam("orderId") String orderId) {
        return cuttingReceiveService.submit(orderId);
    }
    //TODO: @GetMapping("/handleBack")
}
src/main/java/org/jeecg/modules/cms/entity/CuttingReceive.java
@@ -59,6 +59,7 @@
    /**领用单状态*/
    @Excel(name = "领用单状态", width = 15)
    @ApiModelProperty(value = "领用单状态")
    @Dict(dicCode = "order_status")
    private String orderStatus;
    /**领用人*/
    @Excel(name = "领用人", width = 15)
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveDetailMapper.xml
@@ -9,9 +9,10 @@
            t1.cutting_id cuttingId,
            t1.workpiece_material workpieceMaterial,
            t1.used_life usedLife,
            t2.cutting_barcode cuttingCBarcode,
            t2.cutting_barcode cuttingBarcode,
            t2.inventory_status inventoryStatus,
            t2.current_life currentLife,
            t2.id inventoryId,
            t3.cutting_code cuttingCode,
            t3.cutting_name cuttingName
        FROM
src/main/java/org/jeecg/modules/cms/service/ICuttingInventoryService.java
@@ -17,5 +17,6 @@
public interface ICuttingInventoryService extends IService<CuttingInventory> {
    IPage<Map<String, Object>> statisticsByCuttingIdAndStatus(Page<Map<String, Object>> page);
    void updateStatus(List<String> ids, String status);
}
src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.cms.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cms.entity.CuttingReceive;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -15,4 +16,5 @@
public interface ICuttingReceiveService extends IService<CuttingReceive> {
    IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params);
    Result<?> submit(String orderId);
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
@@ -89,6 +89,13 @@
        // æ¡ç ç”Ÿæˆè§„则示例:刀具ID + åºå·(4位) + éšæœºæ•°
        return cuttingId + String.format("%04d", index + 1) + (int) (Math.random() * 10000);
    }
    /**
     * æäº¤å…¥åº“单
     *
     * @param orderId å…¥åº“单ID
     * @return æäº¤ç»“æžœ
     */
    @Override
    @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时")
    public synchronized Result<?> submit(String orderId) {
@@ -160,8 +167,4 @@
            return Result.error("提交失败: " + e.getMessage());
        }
    }
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
@@ -1,21 +1,19 @@
package org.jeecg.modules.cms.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.cms.entity.CuttingInventory;
import org.jeecg.modules.cms.mapper.CuttingInventoryMapper;
import org.jeecg.modules.cms.mapper.CuttingToolMapper;
import org.jeecg.modules.cms.service.ICuttingInventoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * @Description: åˆ€å…·åº“å­˜
@@ -30,4 +28,15 @@
        IPage<Map<String, Object>> result = baseMapper.statisticsByCuttingIdAndStatus(page);
        return result;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(List<String> ids, String status) {
        if (ids != null && !ids.isEmpty() && StringUtils.isNotBlank(status)) {
            UpdateWrapper<CuttingInventory> updateWrapper = new UpdateWrapper<>();
            updateWrapper.in("id", ids);
            updateWrapper.set("inventory_status", status); // æ ¹æ®å®žé™…数据库字段名调整
            this.update(updateWrapper);
        }
    }
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java
@@ -2,13 +2,22 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.micrometer.core.annotation.Timed;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cms.entity.CuttingReceive;
import org.jeecg.modules.cms.entity.CuttingReceiveDetail;
import org.jeecg.modules.cms.mapper.CuttingReceiveMapper;
import org.jeecg.modules.cms.service.ICuttingInventoryService;
import org.jeecg.modules.cms.service.ICuttingReceiveDetailService;
import org.jeecg.modules.cms.service.ICuttingReceiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
@@ -17,12 +26,66 @@
 * @Date:   2025-07-28
 * @Version: V1.0
 */
@Slf4j
@Service
public class CuttingReceiveServiceImpl extends ServiceImpl<CuttingReceiveMapper, CuttingReceive> implements ICuttingReceiveService {
    @Autowired
    private ICuttingInventoryService cuttingInventoryService;
    @Autowired
    private ICuttingReceiveDetailService cuttingReceiveDetailService;
    @Override
    public IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params) {
        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
        return super.getBaseMapper().getInventoryToolList(pageData,params);
    }
    @Override
    @Timed(value = "cutting.receive.submit", description = "刀具领用提交耗时")
    public synchronized Result<?> submit(String orderId) {
        long startTime = System.currentTimeMillis();
        try {
            // 1. æ›´æ–°é¢†ç”¨å•状态
            CuttingReceive cuttingReceive = this.getById(orderId);
            if (cuttingReceive == null) {
                return Result.error("未找到对应的领用单");
            }
            // æ£€æŸ¥é¢†ç”¨å•状态,只允许状态为"1"的领用单提交
            if (!"1".equals(cuttingReceive.getOrderStatus())) {
                return Result.error("只有状态为未提交的领用单才能执行提交操作");
            }
            cuttingReceive.setOrderStatus("2"); // è®¾ç½®ä¸ºå·²é¢†ç”¨çŠ¶æ€
            boolean updateResult = this.updateById(cuttingReceive);
            if (!updateResult) {
                return Result.error("更新领用单状态失败,可能已被其他用户处理");
            }
            // 2. èŽ·å–é¢†ç”¨æ˜Žç»†
            List<CuttingReceiveDetail> detailList = cuttingReceiveDetailService.lambdaQuery()
                    .eq(CuttingReceiveDetail::getOrderId, orderId)
                    .list();
            // 3. æ”¶é›†æ‰€æœ‰éœ€è¦æ›´æ–°çŠ¶æ€çš„åº“å­˜ID
            List<String> inventoryIds = new ArrayList<>();
            for (CuttingReceiveDetail detail : detailList) {
                if (detail.getInventoryId() != null && !detail.getInventoryId().isEmpty()) {
                    inventoryIds.add(detail.getInventoryId());
                }
            }
            // 4. æ‰¹é‡æ›´æ–°åº“存状态为"已出库"
            if (!inventoryIds.isEmpty()) {
                cuttingInventoryService.updateStatus(inventoryIds, "已出库");
            }
            long endTime = System.currentTimeMillis();
            log.info("刀具领用提交完成,耗时: {} ms", (endTime - startTime));
            return Result.ok("提交成功");
        } catch (Exception e) {
            long endTime = System.currentTimeMillis();
            log.error("提交领用单失败,orderId: " + orderId + ",耗时: " + (endTime - startTime) + " ms", e);
            return Result.error("提交失败: " + e.getMessage());
        }
    }
}
src/main/java/org/jeecg/modules/eam/controller/EamInspectionOrderController.java
@@ -12,6 +12,7 @@
import lombok.extern.slf4j.Slf4j;
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.util.TranslateDictTextUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
@@ -109,6 +110,7 @@
        String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.INSPECTION_ORDER_CODE_RULE);
        eamInspectionOrderRequest.setOrderNum(codeSeq);
        eamInspectionOrderRequest.setCreationMethod(String.valueOf(OrderCreationMethodEnum.MANUAL));
        eamInspectionOrderRequest.setDelFlag(CommonConstant.DEL_FLAG_0);
        eamInspectionOrderService.addInspectionOrder(eamInspectionOrderRequest);
        return Result.OK("添加成功!");
    }
src/main/java/org/jeecg/modules/lsw/mapper/LswMaterialInventoryMapper.java
@@ -18,7 +18,8 @@
public interface LswMaterialInventoryMapper extends BaseMapper<LswMaterialInventory> {
    List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(@Param("materialNumberList") List<String> bomMaterialNumberList,
                                                                                 @Param("factoryId") String factoryId);
                                                                                 @Param("factoryId") String factoryId,
                                                                                 @Param("heatFlag") String heatFlag);
    /**
     * åº“存统计
src/main/java/org/jeecg/modules/lsw/mapper/xml/LswMaterialInventoryMapper.xml
@@ -13,7 +13,11 @@
        <foreach collection="materialNumberList" item="item" separator="," open="(" close=")">
            #{item}
        </foreach>
        <if test="heatFlag != null and heatFlag != ''">
            AND t2.heat_treatment_flag = #{heatFlag}
        </if>
        AND t2.warehouse_id = #{factoryId}
        AND t2.inventory_status = 'NORMAL'
        AND t1.del_flag = 0
        GROUP BY
            t1.material_number,
src/main/java/org/jeecg/modules/lsw/service/ILswMaterialInventoryService.java
@@ -16,7 +16,7 @@
 */
public interface ILswMaterialInventoryService extends IService<LswMaterialInventory> {
    /** é€šè¿‡ç‰©æ–™ç¼–码和线边库id查询物料库存 */
    List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId);
    List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId, String heatFlag);
    /**
     * åº“存统计
src/main/java/org/jeecg/modules/lsw/service/impl/LswMaterialInventoryServiceImpl.java
@@ -43,8 +43,8 @@
    private IFactoryService factoryService;
    @Override
    public List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId) {
        return lswMaterialInventoryMapper.selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, factoryId);
    public List<LswMaterialInventoryVo> selectLineSideMaterialInventoryByMaterialNumber(List<String> bomMaterialNumberList, String factoryId, String heatFlag) {
        return lswMaterialInventoryMapper.selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, factoryId, heatFlag);
    }
    @Override
src/main/java/org/jeecg/modules/mes/controller/MesProductionWorkOrderController.java
@@ -13,18 +13,31 @@
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.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.base.entity.Factory;
import org.jeecg.modules.base.enums.ProductionTypeEnum;
import org.jeecg.modules.base.service.IFactoryService;
import org.jeecg.modules.eam.constant.MaintenanceCategoryEnum;
import org.jeecg.modules.eam.constant.MaintenanceStandardStatusEnum;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamInspectionOrder;
import org.jeecg.modules.eam.entity.EamInspectionOrderDetail;
import org.jeecg.modules.eam.entity.EamProcessCheck;
import org.jeecg.modules.eam.service.*;
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.IMesKittingCompletenessCheckService;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
@@ -44,6 +57,20 @@
public class MesProductionWorkOrderController extends JeecgController<MesProductionWorkOrder, IMesProductionWorkOrderService> {
    @Autowired
    private IMesProductionWorkOrderService mesProductionWorkOrderService;
    @Autowired
    private IMesKittingCompletenessCheckService mesKittingCompletenessCheckService;
    @Autowired
    private IEamInspectionOrderService eamInspectionOrderService;
    @Autowired
    private IEamInspectionOrderDetailService eamInspectionOrderDetailService;
    @Autowired
    private IEamProcessCheckService eamProcessCheckService;
    @Autowired
    private IEamProcessCheckDetailService eamProcessCheckDetailService;
    @Autowired
    private IEamEquipmentService eamEquipmentService;
    @Autowired
    private IFactoryService factoryService;
    /**
     * åˆ†é¡µåˆ—表查询
@@ -148,8 +175,8 @@
    public Result<String> publish(@RequestParam("ids") String ids) {
        List<String> idList = Arrays.asList(ids.split(","));
        List<MesProductionWorkOrder> list = mesProductionWorkOrderService.list(new LambdaQueryWrapper<MesProductionWorkOrder>()
                .in(MesProductionWorkOrder::getId, idList)
                .eq(MesProductionWorkOrder::getDelFlag, CommonConstant.DEL_FLAG_0)).stream()
                        .in(MesProductionWorkOrder::getId, idList)
                        .eq(MesProductionWorkOrder::getDelFlag, CommonConstant.DEL_FLAG_0)).stream()
                .filter(i -> !ProductionWorkOrderStatus.NEW.name().equals(i.getWorkOrderStatus()))
                .collect(Collectors.toList());
        if (!list.isEmpty()) {
@@ -169,7 +196,7 @@
    }
    @AutoLog(value = "排产工单-重发布排产计划")
    @ApiOperation(value="排产工单-重发布排产计划", notes="重发布排产计划")
    @ApiOperation(value = "排产工单-重发布排产计划", notes = "重发布排产计划")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:republish")
    @PostMapping(value = "/republish")
    public Result<String> republish(@RequestBody MesProductionWorkOrderRepublishRequest request) {
@@ -189,7 +216,7 @@
    }
    @AutoLog(value = "排产工单-齐套性检查")
    @ApiOperation(value="排产工单-齐套性检查", notes="齐套性检查")
    @ApiOperation(value = "排产工单-齐套性检查", notes = "齐套性检查")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:workOrderCompletenessCheck")
    @GetMapping(value = "/workOrderCompletenessCheck")
    public Result<List<MesKittingCompletenessCheck>> workOrderCompletenessCheck(@RequestParam("id") String id) {
@@ -200,6 +227,14 @@
        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) {
            return Result.error("当前工单状态不能进行齐套性检查!");
        }
        Factory factory = factoryService.getById(workOrder.getFactoryId());
        String productionType = factory.getProductionType();
        if (ProductionTypeEnum.HEATTREATMENT.name().equals(productionType)) {
            //热处理产线
            List<MesKittingCompletenessCheck> list = mesProductionWorkOrderService.workOrderCompletenessCheckOnHeatTreatment(workOrder);
            return Result.ok(list);
        }
        //其余产线
        List<MesKittingCompletenessCheck> list = mesProductionWorkOrderService.workOrderCompletenessCheck(workOrder);
        return Result.ok(list);
    }
@@ -210,17 +245,116 @@
    @GetMapping(value = "/execute")
    public Result<?> execute(@RequestParam("id") String id) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id);
        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())
                && !CommonConstant.DEFAULT_1.equals(workOrder.getCompletenessCheckFlag())
                && !CommonConstant.DEFAULT_1.equals(workOrder.getEquipmentInspectionFlag())
                && !CommonConstant.DEFAULT_1.equals(workOrder.getProcessInspectionFlag())) {
        if (!ProductionWorkOrderStatus.PUBLISHED.name().equals(workOrder.getWorkOrderStatus())) {
            return Result.error("当前工单状态不能执行!");
        }
        //检查是否做过齐套性检查、工艺点检、设备点检
        if (!completeCheck(workOrder)) {
            return Result.error("请先完成齐套性检查、工艺点检、设备点检!");
        }
        MesProductionWorkOrder executeOrder = new MesProductionWorkOrder()
                .setId(id)
                .setWorkOrderStatus(ProductionWorkOrderStatus.EXECUTING.name());
        mesProductionWorkOrderService.updateById(executeOrder);
        return Result.ok("执行成功!");
    }
    private boolean completeCheck(MesProductionWorkOrder workOrder) {
        List<MesKittingCompletenessCheck> completenessCheckList = mesKittingCompletenessCheckService.list(new LambdaQueryWrapper<MesKittingCompletenessCheck>()
                .eq(MesKittingCompletenessCheck::getWorkOrderId, workOrder.getId()));
        if (completenessCheckList.isEmpty()) {
            return false;
        }
        List<EamInspectionOrder> inspectionOrderList = eamInspectionOrderService.list(new LambdaQueryWrapper<EamInspectionOrder>()
                .eq(EamInspectionOrder::getWorkOrderId, workOrder.getId()));
        if (inspectionOrderList.isEmpty()) {
            return false;
        }
        List<EamProcessCheck> processCheckList = eamProcessCheckService.list(new LambdaQueryWrapper<EamProcessCheck>()
                .eq(EamProcessCheck::getWorkOrderId, workOrder.getId()));
        if (processCheckList.isEmpty()) {
            return false;
        }
        return true;
    }
    @AutoLog(value = "排产工单-工单执行前检查")
    @ApiOperation(value = "排产工单-工单执行前检查", notes = "排产工单-工单执行前检查")
    //@RequiresPermissions("org.jeecg.modules:mes_production_work_order:execute")
    @GetMapping(value = "/checkBeforeExecute")
    public Result<?> checkBeforeExecute(@RequestParam("id") String id) {
        MesProductionWorkOrder workOrder = mesProductionWorkOrderService.getById(id);
        if (workOrder == null) {
            throw new JeecgBootException("工单不存在!");
        }
        Map<String, Object> resMap = new HashMap<>();
        //齐套性检查
        List<MesKittingCompletenessCheck> completenessCheckList = mesKittingCompletenessCheckService.list(new LambdaQueryWrapper<MesKittingCompletenessCheck>()
                .eq(MesKittingCompletenessCheck::getWorkOrderId, id));
        if (completenessCheckList.isEmpty()) {
            //未执行过齐套性检查
            resMap.put("completenessCheckFlag", false);
        } else {
            List<MesKittingCompletenessCheck> unCompletenessList = completenessCheckList.stream().filter(i -> !CommonConstant.DEFAULT_1.equals(i.getCheckFlag()))
                    .collect(Collectors.toList());
            if (unCompletenessList.isEmpty()) {
                //齐套性检查全部通过
                resMap.put("completenessCheckFlag", true);
            } else {
                List<String> unCompletenessListMaterial = unCompletenessList.stream()
                        .map(i -> i.getMaterialNumber() + "[" + i.getMaterialName() + "]").collect(Collectors.toList());
                //存在未通过
                resMap.put("completenessCheckFlag", false);
                resMap.put("unCompletenessCheckList", unCompletenessListMaterial);
            }
        }
        //设备点检
        List<EamInspectionOrder> inspectionOrderList = eamInspectionOrderService.list(new LambdaQueryWrapper<EamInspectionOrder>()
                .eq(EamInspectionOrder::getWorkOrderId, workOrder.getId()));
        if (inspectionOrderList.isEmpty()) {
            //未执行过设备点检
            resMap.put("inspectionFlag", false);
        } else {
            List<String> unInspectEquipmentList = eamEquipmentService.list(new LambdaQueryWrapper<EamEquipment>()
                            .eq(EamEquipment::getOrgId, workOrder.getFactoryId())
                            .eq(EamEquipment::getDelFlag, CommonConstant.DEL_FLAG_0)
                            .apply("NOT EXISTS (SELECT 1 FROM eam_inspection_order t WHERE t.equipment_id = eam_equipment.id AND t.work_order_id = {0})", workOrder.getId())
                            .apply("EXISTS (SELECT 1 FROM eam_maintenance_standard t WHERE t.equipment_id = eam_equipment.id AND t.del_flag = {0} " +
                                            "AND t.standard_status = {1} AND t.maintenance_category = {2})",
                                    CommonConstant.DEL_FLAG_0, MaintenanceStandardStatusEnum.NORMAL.name(), MaintenanceCategoryEnum.POINT_INSPECTION.name()))
                    .stream().map(e -> e.getEquipmentCode() + "[" + e.getEquipmentName() + "]").collect(Collectors.toList());
            if (unInspectEquipmentList.isEmpty()) {
                //全部设备都已点检
                resMap.put("equipmentInspectFlag", true);
            } else {
                //存在未点检的设备
                resMap.put("equipmentInspectFlag", false);
                resMap.put("unInspectEquipmentList", unInspectEquipmentList);
            }
        }
        //工艺点检
        List<EamProcessCheck> processCheckList = eamProcessCheckService.list(new LambdaQueryWrapper<EamProcessCheck>()
                .eq(EamProcessCheck::getWorkOrderId, workOrder.getId()));
        if (processCheckList.isEmpty()) {
            //未执行过工艺点检
            resMap.put("processCheckFlag", false);
        } else {
            List<String> unCheckEquipmentList = eamEquipmentService.list(new LambdaQueryWrapper<EamEquipment>()
                            .eq(EamEquipment::getOrgId, workOrder.getFactoryId())
                            .eq(EamEquipment::getDelFlag, CommonConstant.DEL_FLAG_0)
                            .apply("EXISTS (SELECT 1 FROM eam_equipment_process_parameters t WHERE t.equipment_id = eam_equipment.id)")
                            .apply("NOT EXISTS (SELECT 1 FROM eam_process_check t WHERE t.equipment_id = eam_equipment.id AND t.work_order_id = {0})", workOrder.getId()))
                    .stream().map(e -> e.getEquipmentCode() + "[" + e.getEquipmentName() + "]").collect(Collectors.toList());
            if (unCheckEquipmentList.isEmpty()) {
                //全部设备都已点检
                resMap.put("processCheckFlag", true);
            } else {
                //存在未点检的设备
                resMap.put("processCheckFlag", false);
                resMap.put("unCheckEquipmentList", unCheckEquipmentList);
            }
        }
        return Result.ok(resMap);
    }
    /**
@@ -310,4 +444,20 @@
        return super.importExcel(request, response, MesProductionWorkOrder.class);
    }
    /**
     * ç‰©æ–™æ‹‰åŠ¨é€‰æ‹©æŽ’äº§å·¥å•åˆ—è¡¨æŸ¥è¯¢
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    @ApiOperation(value = "排产工单-物料拉动工单列表", notes = "排产工单-物料拉动工单列表")
    @GetMapping(value = "/queryWorkOrderByTransfer")
    public Result<IPage<MesProductionWorkOrder>> queryWorkOrderByTransfer(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
        Page<MesProductionWorkOrder> page = new Page<>(pageNo, pageSize);
        IPage<MesProductionWorkOrder> pageList = mesProductionWorkOrderService.queryWorkOrderByTransfer(page);
        return Result.OK(pageList);
    }
}
src/main/java/org/jeecg/modules/mes/mapper/MesProductionWorkOrderMapper.java
@@ -1,15 +1,12 @@
package org.jeecg.modules.mes.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.mes.entity.MesProductionWorkOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * @Description: æŽ’产工单
@@ -21,4 +18,11 @@
    IPage<MesProductionWorkOrder> queryPageList(Page<MesProductionWorkOrder> page,
                                                @Param(Constants.WRAPPER) Wrapper<MesProductionWorkOrder> queryWrapper);
    /**
     * ç‰©æ–™æ‹‰åŠ¨å·¥å•æŸ¥è¯¢
     * @param page
     * @return
     */
    IPage<MesProductionWorkOrder> queryWorkOrderByTransfer(Page<MesProductionWorkOrder> page);
}
src/main/java/org/jeecg/modules/mes/mapper/xml/MesProductionWorkOrderMapper.xml
@@ -15,4 +15,14 @@
        LEFT JOIN base_shift t3 ON t1.shift_id = t3.id
        ${ew.customSqlSegment}
    </select>
    <select id="queryWorkOrderByTransfer" resultType="org.jeecg.modules.mes.entity.MesProductionWorkOrder">
        SELECT t1.*
        FROM mes_production_work_order t1
                 LEFT JOIN base_factory t2 ON t1.factory_id = t2.id
        where t1.work_order_status = 'PUBLISHED'
          and t2.production_type in ('ASSEMBLE', 'HEATTREATMENT')
          and t1.plan_quantity > 0
        order by t1.create_time desc
    </select>
</mapper>
src/main/java/org/jeecg/modules/mes/service/IMesProductionWorkOrderService.java
@@ -23,4 +23,13 @@
    IPage<MesProductionWorkOrder> queryPageList(Page<MesProductionWorkOrder> page, Map<String, String[]> parameterMap);
    List<MesKittingCompletenessCheck> workOrderCompletenessCheck(MesProductionWorkOrder workOrder);
    List<MesKittingCompletenessCheck> workOrderCompletenessCheckOnHeatTreatment(MesProductionWorkOrder workOrder);
    /**
     * ç‰©æ–™æ‹‰åŠ¨å·¥å•æŸ¥è¯¢
     * @param page
     * @return
     */
    IPage<MesProductionWorkOrder> queryWorkOrderByTransfer(Page<MesProductionWorkOrder> page);
}
src/main/java/org/jeecg/modules/mes/service/impl/MesProductionWorkOrderServiceImpl.java
@@ -234,7 +234,7 @@
        List<String> bomMaterialNumberList = processBillMaterialsDetails.stream()
                .map(PmsProcessBillMaterialsDetail::getMaterialNumber).collect(Collectors.toList());
        Map<String, LswMaterialInventoryVo> lswMaterialInventoryMap = lswMaterialInventoryService
                .selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, lineSideWarehouse.getId()).stream()
                .selectLineSideMaterialInventoryByMaterialNumber(bomMaterialNumberList, lineSideWarehouse.getId(), null).stream()
                .collect(Collectors.toMap(LswMaterialInventoryVo::getMaterialNumber, v1 -> v1, (v1, v2) -> v1));
        List<MesKittingCompletenessCheck> completenessCheckResultList = CollectionUtil.newArrayList();
        //根据订单BOM明细列出齐套检查结果
@@ -260,4 +260,37 @@
        });
        return completenessCheckResultList;
    }
    @Override
    public List<MesKittingCompletenessCheck> workOrderCompletenessCheckOnHeatTreatment(MesProductionWorkOrder workOrder) {
        //查询工单所属产线对应的线边仓
        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("该产线未配置线边仓!");
        }
        //查询工单热处理物料对应毛坯在线边仓的库存
        LswMaterialInventoryVo materialInventoryVo = lswMaterialInventoryService.selectLineSideMaterialInventoryByMaterialNumber(Collections
                        .singletonList(workOrder.getMaterialNumber()), lineSideWarehouse.getId(), CommonConstant.DEFAULT_0)
                .stream().findFirst().orElse(null);
        if (materialInventoryVo == null) {
            throw new JeecgBootException("线边库物料不存在!");
        }
        MesKittingCompletenessCheck completenessCheck = new MesKittingCompletenessCheck()
                .setMaterialNumber(materialInventoryVo.getMaterialNumber())
                .setMaterialName(materialInventoryVo.getMaterialName())
                .setRequiredQuantity(workOrder.getPlanQuantity())
                .setActualQuantity(materialInventoryVo.getStockQuantity())
                .setProductionUnit("PC")
                .setCheckFlag(materialInventoryVo.getStockQuantity().compareTo(workOrder.getPlanQuantity()) > 0 ? CommonConstant.DEFAULT_1 : CommonConstant.DEFAULT_0);
        return Collections.singletonList(completenessCheck);
    }
    @Override
    public IPage<MesProductionWorkOrder> queryWorkOrderByTransfer(Page<MesProductionWorkOrder> page) {
        return this.getBaseMapper().queryWorkOrderByTransfer(page);
    }
}
src/main/java/org/jeecg/modules/pms/mapper/PmsProcessBillMaterialsDetailMapper.java
@@ -24,4 +24,12 @@
     * @return
     */
    List<PmsProcessBillMaterialsDetail> queryByMaterialNumber(String materialNumber);
    /**
     * ç‰©æ–™æ‹‰åŠ¨é€‰æ‹©ç‰©æ–™ä½¿ç”¨
     * æ ¹æ®çƒ­å¤„理毛坯物料查询
     * @param materialNumber çƒ­å¤„理物料编码
     * @return
     */
    List<PmsProcessBillMaterialsDetail> queryByMaterialNumberOnly(String materialNumber);
}
src/main/java/org/jeecg/modules/pms/mapper/xml/PmsProcessBillMaterialsDetailMapper.xml
@@ -23,4 +23,9 @@
                       and t1.material_id = t2.id)
    </select>
    <select id="queryByMaterialNumberOnly" resultType="org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail">
        select DISTINCT t1.material_number, t1.material_name, t1.production_unit
        from pms_process_bill_materials_detail t1
        where t1.material_number = #{materialNumber}
    </select>
</mapper>
src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java
@@ -54,6 +54,11 @@
        if (StringUtils.isBlank(materialNumber)) {
            return Collections.emptyList();
        }
        return this.getBaseMapper().queryByMaterialNumber(materialNumber);
        List<PmsProcessBillMaterialsDetail> list = this.getBaseMapper().queryByMaterialNumber(materialNumber);
        if (CollectionUtil.isEmpty(list)) {
            //如果是热处理,则代表选择排产工单生产的毛坯
            return this.getBaseMapper().queryByMaterialNumberOnly(materialNumber);
        }
        return list;
    }
}