新火炬后端单体项目初始化代码
已修改31个文件
856 ■■■■ 文件已修改
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 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | 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 4 ●●●● 补丁 | 查看 | 原始文档 | 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 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/controller/EamInspectionOrderController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/controller/EamMaintenanceStandardController.java 218 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandard.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | 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,16 @@
        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")
    @GetMapping("/handleBack")
    public Result<?> handleBack(@RequestParam("orderId") String orderId) {
        return cuttingReceiveService.handleBack(orderId);
    }
}
src/main/java/org/jeecg/modules/cms/entity/CuttingInventory.java
@@ -77,4 +77,11 @@
    @TableField(exist = false) // è¡¨ç¤ºè¿™ä¸æ˜¯æ•°æ®åº“字段
    private String cuttingBarcodeSearch;
    @TableField(exist = false) // è¡¨ç¤ºè¿™ä¸æ˜¯æ•°æ®åº“字段
    private String workpieceMaterial;
    @TableField(exist = false) // è¡¨ç¤ºè¿™ä¸æ˜¯æ•°æ®åº“字段
    private BigDecimal ratedLife;
}
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,7 @@
public interface ICuttingReceiveService extends IService<CuttingReceive> {
    IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params);
    Result<?> submit(String orderId);
    Result<?> handleBack(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,26 @@
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.CuttingInventory;
import org.jeecg.modules.cms.entity.CuttingReceive;
import org.jeecg.modules.cms.entity.CuttingReceiveDetail;
import org.jeecg.modules.cms.entity.RatedLife;
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.jeecg.modules.cms.service.IRatedLifeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
@@ -17,12 +30,139 @@
 * @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;
    @Autowired
    private IRatedLifeService ratedLifeService;
    @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());
        }
    }
    @Override
    public synchronized Result<?> handleBack(String orderId) {
        long startTime = System.currentTimeMillis();
        try {
            // 1. æ›´æ–°é¢†ç”¨å•状态为已归还
            CuttingReceive cuttingReceive = this.getById(orderId);
            if (cuttingReceive == null) {
                return Result.error("未找到对应的领用单");
            }
            // æ£€æŸ¥é¢†ç”¨å•状态,只允许状态为"已领用"的领用单进行归还操作
            if (!"2".equals(cuttingReceive.getOrderStatus())) {
                return Result.error("只有状态为已领用的领用单才能执行归还操作");
            }
            cuttingReceive.setOrderStatus("3"); // è®¾ç½®ä¸ºå·²å½’还状态
            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, "正常");
            }
            // 5. å¯¿å‘½æ‰£å‡
            for (CuttingReceiveDetail detail : detailList) {
                if (detail.getInventoryId() != null && !detail.getInventoryId().isEmpty()) {
                    CuttingInventory inventory = cuttingInventoryService.getById(detail.getInventoryId());
                    //FIXME:ratedLife空指针
                    RatedLife ratedLife = ratedLifeService.lambdaQuery() //额定寿命
                            .eq(RatedLife::getCuttingId, inventory.getCuttingId())
                            .eq(RatedLife::getWorkpieceMaterial, inventory.getWorkpieceMaterial())
                            .one();
                    BigDecimal currentLife = inventory.getCurrentLife().divide(BigDecimal.valueOf(100),java.math.RoundingMode.HALF_UP);//当前寿命百分比
                    Integer useLife = detail.getUsedLife();//使用寿命
                    //计算公式: (ratedLife * currentLife - useLife) * 100
                    BigDecimal newLife = ratedLife.getRatedLife()
                            .multiply(currentLife)
                            .subtract(BigDecimal.valueOf(useLife))
                            .multiply(BigDecimal.valueOf(100));
                    // æ›´æ–°åº“存寿命
                    inventory.setCurrentLife(newLife);
                    cuttingInventoryService.updateById(inventory);
                }
            }
            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/eam/controller/EamMaintenanceStandardController.java
@@ -9,7 +9,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
@@ -25,7 +25,6 @@
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.request.EamMaintenanceStandardRequest;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamMaintenanceOrderDetailService;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardService;
import org.jeecg.modules.eam.vo.MaintenanceStandardDetailVo;
@@ -43,10 +42,11 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -296,37 +296,58 @@
     * @return
     */
    @RequestMapping(value = "/inspectionImportExcel", method = RequestMethod.POST)
    public Result<?> inspectionImportExcel(HttpServletRequest request, HttpServletResponse response) {
    public Result<?> inspectionImportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            // èŽ·å–ä¸Šä¼ æ–‡ä»¶å¯¹è±¡
            MultipartFile file = entity.getValue();
            byte[] bytes = file.getBytes();
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setSheetNum(1);
            params.setLastOfInvalidRow(23);
            params.setTitleRows(2);  // è·³è¿‡å‰2行标题
            params.setHeadRows(2);   // ç¬¬3行是表头
            params.setSheetNum(1);   // è¯»å–第一个工作表
            params.setNeedSave(true);
            EamMaintenanceStandardRequest standardRequest = new EamMaintenanceStandardRequest();
            try {
                //读取设备编号,图片等
                readExcel(file, standardRequest);
                log.info("读取到的设备编码: {}", standardRequest.getEquipmentCode());
                EamEquipment equipment = eamEquipmentService.selectByEquipmentCode(standardRequest.getEquipmentCode());
                if(equipment == null) {
                    log.error("设备不存在:{}", standardRequest.getEquipmentCode());
                    continue;
                }
                standardRequest.setStandardName(standardRequest.getEquipmentName() + "点检标准");
                standardRequest.setMaintenanceCategory(MaintenanceCategoryEnum.POINT_INSPECTION.name());
                standardRequest.setEquipmentId(equipment.getId());
                //读取保养明细内容
                List<MaintenanceStandardImport> list = ExcelImportUtil.importExcel(file.getInputStream(), MaintenanceStandardImport.class, params);
                // è¯»å–保养明细内容前添加调试信息
                log.info("Excel导入参数: titleRows={}, headRows={}, lastOfInvalidRow={}",
                        params.getTitleRows(), params.getHeadRows(), params.getLastOfInvalidRow());
                List<MaintenanceStandardImport> list = ExcelImportUtil.importExcel(file.getInputStream(), MaintenanceStandardImport.class, params);
                log.info("实际读取到的明细数量: {}", list.size());
                //明细项
                List<EamMaintenanceStandardDetail> tableList = list.stream().map(EamMaintenanceStandardDetail::new).collect(Collectors.toList());
                List<EamMaintenanceStandardDetail> tableList = new ArrayList<>();
                for(MaintenanceStandardImport maintenanceStandardImport : list) {
                    try {
                        Integer.valueOf(maintenanceStandardImport.getItemCode());
                    } catch (NumberFormatException e) {
                        break;
                    }
                    tableList.add(new EamMaintenanceStandardDetail(maintenanceStandardImport));
                }
                standardRequest.setTableDetailList(tableList);
                log.info("转换后的明细数量: {}", tableList.size());
                String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.MAINTENANCE_STANDARD_CODE_RULE);
                standardRequest.setStandardCode(codeSeq);
                boolean b = eamMaintenanceStandardService.addMaintenanceStandard(standardRequest);
@@ -334,10 +355,8 @@
                    log.error("保存失败! {}", standardRequest.getEquipmentCode());
                }
            } catch (Exception e) {
                //update-begin-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
                String msg = e.getMessage();
                log.error("文件 {} å¤„理异常: {}", file.getOriginalFilename(), msg, e);
                //update-end-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
            } finally {
                try {
                    file.getInputStream().close();
@@ -350,8 +369,10 @@
    }
    /**
     * é€šè¿‡excel导入数据
     * å­£ä¿é€šè¿‡excel导入数据
     *
     * @param request
     * @param response
@@ -368,6 +389,7 @@
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setSheetNum(1);
            params.setLastOfInvalidRow(23);
            params.setNeedSave(true);
            EamMaintenanceStandardRequest standardRequest = new EamMaintenanceStandardRequest();
            try {
@@ -379,6 +401,7 @@
                    continue;
                }
                standardRequest.setStandardName(standardRequest.getEquipmentName() + "保养标准");
                standardRequest.setMaintenanceCategory(MaintenanceCategoryEnum.QUARTERLY_MAINTENANCE.name());
                standardRequest.setEquipmentId(equipment.getId());
                //读取保养明细内容
@@ -408,6 +431,68 @@
        return Result.ok("文件导入完成!");
    }
    /**
     * å¹´ä¿é€šè¿‡excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/annualMaintenanceImportExcel", method = RequestMethod.POST)
    public Result<?> annualMaintenanceImportExcel(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.setSheetNum(1);
            params.setLastOfInvalidRow(23);
            params.setNeedSave(true);
            EamMaintenanceStandardRequest standardRequest = new EamMaintenanceStandardRequest();
            try {
                //读取设备编号,图片等
                readWeekExcel(file, standardRequest);
                EamEquipment equipment = eamEquipmentService.selectByEquipmentCode(standardRequest.getEquipmentCode());
                if(equipment == null) {
                    log.error("设备不存在:{}", standardRequest.getEquipmentCode());
                    continue;
                }
                standardRequest.setStandardName(standardRequest.getEquipmentName() + "保养标准");
                standardRequest.setMaintenanceCategory(MaintenanceCategoryEnum.ANNUAL_MAINTENANCE.name());
                standardRequest.setEquipmentId(equipment.getId());
                //读取保养明细内容
                List<WeekMaintenanceStandardImport> list = ExcelImportUtil.importExcel(file.getInputStream(), WeekMaintenanceStandardImport.class, params);
                //明细项
                List<EamMaintenanceStandardDetail> tableList = list.stream().map(EamMaintenanceStandardDetail::new).collect(Collectors.toList());
                standardRequest.setTableDetailList(tableList);
                String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.MAINTENANCE_STANDARD_CODE_RULE);
                standardRequest.setStandardCode(codeSeq);
                boolean b = eamMaintenanceStandardService.addMaintenanceStandard(standardRequest);
                if (!b) {
                    log.error("保存失败! {}", standardRequest.getEquipmentCode());
                }
            } catch (Exception e) {
                //update-begin-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
                String msg = e.getMessage();
                log.error("文件 {} å¤„理异常: {}", file.getOriginalFilename(), msg, e);
                //update-end-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    log.error(e.getMessage(), e);
                }
            }
        }
        return Result.ok("文件导入完成!");
    }
    /**
     * è¯»å–Excel ç¬¬ä¸€è¡Œï¼Œ ç¬¬äºŒè¡Œçš„信息,包括图片信息
     * @param file
@@ -426,7 +511,7 @@
            //第二行读取
            Row row = sheet.getRow(1);
            //设备编码
            Cell equipmentCode = row.getCell(5);
            Cell equipmentCode = row.getCell(8);
            Cell targetCell = row.getCell(0);
            //文件编码
            String fileCodeValue = getCellValue(targetCell);
@@ -434,11 +519,16 @@
                throw new JeecgBootException("Excel【" + file.getOriginalFilename() + "】第二行第一列获取到的设备编号为空!");
            }
            request.setFileCode(fileCodeValue.trim());
            if(CellType.NUMERIC.equals(equipmentCode.getCellType())) {
                request.setEquipmentCode(String.valueOf((int) equipmentCode.getNumericCellValue()));
            }else if(CellType.STRING.equals(equipmentCode.getCellType())) {
                request.setEquipmentCode(equipmentCode.getStringCellValue());
//            if(CellType.NUMERIC.equals(equipmentCode.getCellType())) {
//                request.setEquipmentCode(String.valueOf((int) equipmentCode.getNumericCellValue()));
//            }else if(CellType.STRING.equals(equipmentCode.getCellType())) {
//                request.setEquipmentCode(equipmentCode.getStringCellValue());
//            }
            String equipmentCodeStr = extractEquipmentCode(equipmentCode);
            if (StringUtils.isBlank(equipmentCodeStr)) {
                throw new JeecgBootException("Excel【 " + file.getOriginalFilename() + "】没有读取到有效的设备编号,导入失败!");
            }
            request.setEquipmentCode(equipmentCodeStr);
            if (StringUtils.isBlank(request.getEquipmentCode())) {
                throw new JeecgBootException("Excel【 " + file.getOriginalFilename() + "】没有读取到设备编号,导入失败!");
            }
@@ -502,10 +592,16 @@
            }
            Sheet sheet = book.getSheetAt(0);
            //第一行读取
            Row row = sheet.getRow(0);
            //第二行读取
            Row row = sheet.getRow(1);
            //设备编码
            Cell equipmentCode = row.getCell(10);
            Cell equipmentCode = row.getCell(13);
            Cell targetCell = row.getCell(0);
            String fileCodeValue = getCellValue(targetCell);
            if (fileCodeValue == null || fileCodeValue.trim().isEmpty()) {
                throw new JeecgBootException("Excel【" + file.getOriginalFilename() + "】第二行第一列获取到的设备编号为空!");
            }
            request.setFileCode(fileCodeValue.trim());
            if(CellType.NUMERIC.equals(equipmentCode.getCellType())) {
                request.setEquipmentCode(String.valueOf((int) equipmentCode.getNumericCellValue()));
            }else if(CellType.STRING.equals(equipmentCode.getCellType())) {
@@ -515,20 +611,20 @@
                throw new JeecgBootException("Excel【 " + file.getOriginalFilename() + "】没有读取到设备编号,导入失败!");
            }
            //初始日期
            Cell initialDate = row.getCell(6);
            Cell initialDate = row.getCell(11);
            if (DateUtil.isCellDateFormatted(initialDate)) {
                request.setInitialDate(initialDate.getDateCellValue());
            } else {
                request.setInitialDate(new Date());
            }
            //设备名称
            Cell equipmentName = row.getCell(8);
            request.setEquipmentName(equipmentName.getStringCellValue());
//            Cell equipmentName = row.getCell(8);
//            request.setEquipmentName(equipmentName.getStringCellValue());
            //第二行读取
            row = sheet.getRow(1);
            row = sheet.getRow(4);
            //保养周期
            Cell period = row.getCell(6);
            Cell period = row.getCell(7);
            if (CellType.NUMERIC.equals(period.getCellType())) {
                request.setMaintenancePeriod((int) period.getNumericCellValue());
            } else {
@@ -541,4 +637,72 @@
            log.error("读取Excel信息失败:{}", e.getMessage(), e);
        }
    }
    private int findDataEndRow(InputStream inputStream) throws IOException {
        Workbook workbook = null;
        try {
            workbook = WorkbookFactory.create(inputStream);
            Sheet sheet = workbook.getSheetAt(0);
            int lastRowNum = sheet.getLastRowNum();
            log.info("Excel文件总行数: {}", lastRowNum);
            // æ‰¾åˆ°"实施要领"行,作为数据结束的标志
            for (int i = 0; i <= lastRowNum; i++) {
                Row row = sheet.getRow(i);
                if (row == null) continue;
                // æ£€æŸ¥ç¬¬A列是否包含"实施要领"
                Cell cell = row.getCell(0);
                if (cell != null && cell.getCellType() == CellType.STRING) {
                    String value = getCellValue(cell).replaceAll("\\s+", "");
                    if ("实施要领".equals(value)) {
                        log.info("找到'实施要领'在第{}行", i);
                        return i - 1; // è¿”回"实施要领"行之前的行号
                    }
                }
            }
            // å¦‚果没有找到"实施要领",返回最后一行
            log.info("未找到'实施要领',返回最后一行: {}", lastRowNum);
            return lastRowNum;
        } finally {
            if (workbook != null) {
                workbook.close();
            }
        }
    }
    /**
     * ä»Žå•元格中提取设备编号,去除前缀如"设备编号:"
     * @param cell å•元格对象
     * @return çº¯è®¾å¤‡ç¼–号字符串
     */
    private String extractEquipmentCode(Cell cell) {
        if (cell == null) {
            return null;
        }
        String cellValue = getCellValue(cell);
        if (StringUtils.isBlank(cellValue)) {
            return null;
        }
        // åŽ»é™¤å‰åŽç©ºæ ¼
        cellValue = cellValue.trim();
        // ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼æå–数字部分
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(cellValue);
        if (matcher.find()) {
            return matcher.group();
        }
        // å¦‚果没有找到数字,返回原值(可能有其他格式)
        return cellValue;
    }
}
src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
@@ -8,18 +8,46 @@
@Data
public class MaintenanceStandardImport implements Serializable {
    @Excel(name = "NO", width = 15)
//    @Excel(name = "NO", width = 15)
//    private String itemCode;
//
//    @Excel(name = "点检内容", width = 15)
//    private String itemName;
//
//    @Excel(name = "点检方法", width = 15)
//    private String subItemName;
//
//    @Excel(name = "部位名称", width = 15)
//    private String itemPart;
//
//    @Excel(name = "基准", width = 15)
//    private String itemDemand;
    @Excel(name = "NO")
    private String itemCode;
    @Excel(name = "点检内容", width = 15)
    private String itemName;
    @Excel(name = "点检条件")
    private String condition;
    @Excel(name = "点检方法", width = 15)
    private String subItemName;
    @Excel(name = "部位名称", width = 15)
    @Excel(name = "部位名称")
    private String itemPart;
    @Excel(name = "基准", width = 15)
    @Excel(name = "点检内容")
    private String itemName;
    @Excel(name = "点检方法")
    private String subItemName;
    @Excel(name = "基准")
    private String itemDemand;
    @Excel(name = "异常处理基准")
    private String abnormal;
    @Excel(name = "周期")
    private String period;
}
src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java
@@ -83,9 +83,9 @@
    /**
     * ä½¿ç”¨éƒ¨é—¨
     */
    @Excel(name = "使用车间", width = 25, dictTable = "mdc_production", dicText = "production_name", dicCode = "id", orderNum = "9")
    @Excel(name = "使用车间", width = 25, dictTable = "base_factory", dicText = "factory_name", dicCode = "id", orderNum = "9")
    @ApiModelProperty(value = "使用部门")
    @Dict(dicCode = "mdc_production, production_name, id")
    @Dict(dicCode = "base_factory, factory_name, id")
    private String orgId;
    /**
     * è®¾å¤‡ç®¡ç†å‘˜
src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandard.java
@@ -115,12 +115,6 @@
     */
    @ApiModelProperty(value = "参考文件")
    private String referenceFile;
    /**
     * æœ€æ–°ç”Ÿæˆå·¥å•æ—¶é—´
     * ä¸‹ä¸€æ¬¡ç”Ÿæˆæ—¶é—´ä¸ºæ­¤æ—¶é—´ + ä¿å…»å‘¨æœŸ
     */
    @ApiModelProperty(value = "最新生成工单时间")
    private Date lastGenerateTime;
    //列表展示
    @TableField(exist = false)
src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
@@ -75,6 +75,7 @@
        public EamMaintenanceStandardDetail(MaintenanceStandardImport dto) {
            this.itemCode = Integer.valueOf(dto.getItemCode());
            this.itemPart = dto.getItemPart();
            this.checkMethod=dto.getCondition();
            this.itemName = dto.getItemName();
            this.itemDemand = dto.getItemDemand();
        }
src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java
@@ -103,14 +103,14 @@
        if (sysUser == null) {
            return page;
        }
        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
            //选择了设备,根据设备id过滤设备
            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
            queryWrapper.in("e.equipment_code", equipArr);
        } else {
            //没有选择设备,根据车间过滤设备
            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id", sysUser.getId());
        }
//        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
//            //选择了设备,根据设备id过滤设备
//            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
//            queryWrapper.in("e.equipment_code", equipArr);
//        } else {
//            //没有选择设备,根据车间过滤设备
//            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id", sysUser.getId());
//        }
        //查询条件过滤
        if (eamEquipment != null) {
            if (StringUtils.isNotBlank(eamEquipment.getEquipmentCode())) {
src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
@@ -55,14 +55,14 @@
        if (sysUser == null) {
            return page;
        }
        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
            //选择了设备,根据设备id过滤设备
            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
            queryWrapper.in("e.equipment_code", equipArr);
        } else {
            //没有选择设备,根据车间过滤设备
            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id ", sysUser.getId());
        }
//        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
//            //选择了设备,根据设备id过滤设备
//            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
//            queryWrapper.in("e.equipment_code", equipArr);
//        } else {
//            //没有选择设备,根据车间过滤设备
//            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id ", sysUser.getId());
//        }
        if(eamMaintenanceStandard != null) {
            //编码 æ¨¡ç³ŠæŸ¥è¯¢
            if(StringUtils.isNotBlank(eamMaintenanceStandard.getStandardCode())) {
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;
    }
}