已修改22个文件
262 ■■■■ 文件已修改
doc/20260317_鹏创电子.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/ProductModelExportDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/ProductModel.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260317_Åô´´µç×Ó.sql
@@ -3,4 +3,4 @@
    add defective_reason varchar(255) default '' not null comment '不良原因';
alter table quality_unqualified
    add quarantine_lifted boolean not null default false comment '是否已取消隔离';
    add quarantine_lifted boolean not null default true comment '是否已取消隔离';
src/main/java/com/ruoyi/basic/dto/ProductModelExportDto.java
@@ -14,6 +14,8 @@
 */
@Data
public class ProductModelExportDto {
    @Excel(name = "物料编号")
    private String materialCode;
    @Excel(name = "规格型号")
    private String model;
src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -31,6 +31,12 @@
    private String productName;
    /**
     * ç‰©æ–™ç¼–号
     */
    @Excel(name = "物料编号")
    private String materialCode;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -118,6 +118,10 @@
                ProductModel item = productModelList.get(i);
                int rowNum = i + 2;
                if (StringUtils.isEmpty(item.getMaterialCode())) {
                    return AjaxResult.error("第 " + rowNum + " è¡Œå¯¼å…¥å¤±è´¥: [物料编号] ä¸èƒ½ä¸ºç©º");
                }
                if (StringUtils.isEmpty(item.getModel())) {
                    return AjaxResult.error("第 " + rowNum + " è¡Œå¯¼å…¥å¤±è´¥: [规格型号] ä¸èƒ½ä¸ºç©º");
                }
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -11,6 +11,9 @@
@Data
public class ProductWorkOrderDto extends ProductWorkOrder {
    @ApiModelProperty(value = "产品ID")
    private String productId;
    //产品名称
    @ApiModelProperty(value = "产品名称")
    private String productName;
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -35,4 +35,12 @@
    ArrayList<Long> listMain(List<Long> idList);
    List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId);
    /**
     * æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
     * @param productRouteId å½“前工序的路由ID
     * @param currentDragSort å½“前工序的排序
     * @return æ˜¯å¦æœ‰éš”离的不合格记录
     */
    boolean checkPreviousProcessReported(@Param("productRouteId") Long productRouteId, @Param("currentDragSort") Integer currentDragSort);
}
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -14,6 +14,10 @@
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityUnqualified;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -39,9 +43,13 @@
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProductionProductMainMapper productionProductMainMapper;
    @Autowired
    private ProductionProductOutputMapper productionProductOutputMapper;
    @Autowired
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    @Value("${file.temp-dir}")
    private String tempDir;
@@ -50,27 +58,43 @@
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        IPage<ProductWorkOrderDto> productWorkOrderDtoIPage = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
        productWorkOrderDtoIPage.getRecords().forEach(record -> {
            //检查上一个工序是否已报工
            // æ˜¯å¦èƒ½æŠ¥å·¥ï¼š 1. ç¬¬ä¸€ä¸ªå·¥åºèƒ½æŠ¥å·¥ 2. ä¸Šä¸€ä¸ªå·¥åºå·²æŠ¥å·¥ 3. ä¹‹å‰çš„工序未被隔离
            Integer currentDragSort = record.getDragSort();
            if (currentDragSort == null || currentDragSort == 1) {
                record.setIsCanReport(true);
            } else {
                //查找上一个工序
                ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
                        Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                // ä¸Šä¸€ä¸ªå·¥åºæ˜¯å¦å·²æŠ¥å·¥
                boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
                        record.getProductRouteId(),
                        currentDragSort
                );
                record.setIsCanReport(isPreviousReported);
                if (previousItem != null) {
                    //检查上一个工序是否有报工记录
                    Long count = productionProductMainMapper.selectCount(
                            Wrappers.<ProductionProductMain>lambdaQuery()
                                    .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                // ä¹‹å‰çš„工序是否被隔离
                if (record.getIsCanReport()) {
                    // æŸ¥è¯¢æ‰€æœ‰ä¹‹å‰çš„工序(排序号小于当前工序)
                    List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                            Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                    .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                    .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
                    );
                    record.setIsCanReport(count > 0);
                } else {
                    record.setIsCanReport(true);
                    if (CollectionUtils.isNotEmpty(previousItems)) {
                        // æå–之前工序的名称列表
                        List<String> previousProcessNames = new ArrayList<>();
                        for (ProductProcessRouteItem item : previousItems) {
                            ProductProcess process = productProcessMapper.selectById(item.getProcessId());
                            if (process != null) {
                                previousProcessNames.add(process.getName());
                            }
                        }
                        // æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
                        List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
                        if (CollectionUtils.isNotEmpty(unqualifiedList)) {
                            record.setIsCanReport(false);
                        }
                    }
                }
            }
@@ -183,4 +207,4 @@
        }
        return productWorkOrderDtos;
    }
}
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -100,24 +101,38 @@
        if (productProcessRouteItem == null) {
            throw new RuntimeException("工艺路线项不存在");
        }
        // æ˜¯å¦èƒ½æŠ¥å·¥ï¼š 1. ç¬¬ä¸€ä¸ªå·¥åºèƒ½æŠ¥å·¥ 2. ä¸Šä¸€ä¸ªå·¥åºå·²æŠ¥å·¥ 3. ä¹‹å‰çš„工序未被隔离
        //检查上一个工序是否已报工
        Integer currentDragSort = productProcessRouteItem.getDragSort();
        if (currentDragSort != null && currentDragSort > 1) {
            ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
            boolean isPreviousReported = productionProductMainMapper.checkPreviousProcessReported(
                    productProcessRouteItem.getProductRouteId(),
                    currentDragSort
            );
            if (!isPreviousReported) {
                throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工");
            }
            // æŸ¥è¯¢æ‰€æœ‰ä¹‹å‰çš„工序(排序号小于当前工序)
            List<ProductProcessRouteItem> previousItems = productProcessRouteItemMapper.selectList(
                    Wrappers.<ProductProcessRouteItem>lambdaQuery()
                            .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())
                            .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                            .lt(ProductProcessRouteItem::getDragSort, currentDragSort)
            );
            if (CollectionUtils.isNotEmpty(previousItems)) {
                // æå–之前工序的名称列表
                List<String> previousProcessNames = new ArrayList<>();
                for (ProductProcessRouteItem item : previousItems) {
                    ProductProcess process = productProcessMapper.selectById(item.getProcessId());
                    if (process != null) {
                        previousProcessNames.add(process.getName());
                    }
                }
            if (previousItem != null) {
                //检查上一个工序是否有报工记录
                Long count = productionProductMainMapper.selectCount(
                        Wrappers.<ProductionProductMain>lambdaQuery()
                                .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                );
                if (count == 0) {
                    throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工");
                // æ£€æŸ¥ä¹‹å‰çš„工序是否有被隔离的不合格记录
                List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames);
                if (CollectionUtils.isNotEmpty(unqualifiedList)) {
                    throw new RuntimeException("之前的工序已被隔离,不能进行当前工序报工");
                }
            }
        }
@@ -170,7 +185,7 @@
            productStructureDtos.add(productStructureDto);
        }
        for (ProductStructureDto productStructureDto : productStructureDtos) {
            System.out.println(productStructureDto.getProductModelId());
            ProductionProductInput productionProductInput = new ProductionProductInput();
            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
@@ -193,18 +208,6 @@
        //合格数量=报工数量-报废数量
        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
        // åˆæ ¼çއ=合格数量/报工数量
        BigDecimal productQtyRate = productQty.divide(productionProductOutput.getQuantity(), 2, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("100"));
        // è¯¥å·¥åºçš„合格率 < åˆæ ¼çއ
        if (productQtyRate.compareTo(productProcess.getQualifiedRate()) < 0) {
            // å‘送通知给管理员
            sysNoticeService.simpleNoticeByUser("报工提示",
                    String.format("%s生产订单,%s工序合格率%.2f%%低于标准%.2f%%", productOrder.getNpsNo(), productProcess.getName(), productQtyRate, productProcess.getQualifiedRate()),
                    Arrays.asList(Long.valueOf(1L)),
                    "/productionManagement/productionReporting");
        }
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        //只有合格数量>0才能增加相应数据
        if (productQty.compareTo(BigDecimal.ZERO) > 0) {
@@ -228,7 +231,7 @@
                qualityInspect.setProcess(process);
                qualityInspect.setInspectState(0);
                qualityInspect.setInspectType(inspectType);
                qualityInspect.setDefectiveQuantity(productionProductOutput.getScrapQty());
                qualityInspect.setDefectiveQuantity(BigDecimal.ZERO);
                qualityInspect.setProductMainId(productionProductMain.getId());
                qualityInspect.setProductModelId(productModel.getId());
                qualityInspectMapper.insert(qualityInspect);
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -290,11 +290,13 @@
            Long productId = product.getProductId();
            if (productId != null && productMap.containsKey(productId)) {
                product.setProductCategory(productMap.get(productId));
                product.setProductId(productId);
            }
            Long productModelId = product.getProductModelId();
            if (productModelId != null && modelMap.containsKey(productModelId)) {
                product.setSpecificationModel(modelMap.get(productModelId));
                product.setProductModelId(productModelId);
            }
        }
src/main/java/com/ruoyi/quality/mapper/QualityUnqualifiedMapper.java
@@ -22,4 +22,7 @@
    //手动新增不合格的时候,根据产品名称和规格型号查出对应的规格型号id
    Long getModelId(@Param("productName") String productName, @Param("model") String model);
}
    //根据工序名称列表查询被隔离的不合格记录
    List<QualityUnqualified> selectUnqualifiedByProcessNames(@Param("processNames") List<String> processNames);
}
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -99,6 +99,10 @@
    @Excel(name = "数量")
    private BigDecimal quantity;
    @Excel(name = "合格数量")
    @TableField(exist = false)
    private BigDecimal qualifiedQuantity;
    /**
     * ä¸è‰¯æ•°é‡
     */
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.quality.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -13,6 +14,15 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.mapper.ProductProcessMapper;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
@@ -23,15 +33,20 @@
import com.ruoyi.quality.service.IQualityInspectParamService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.stock.pojo.StockUninventory;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -53,6 +68,16 @@
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProcurementRecordService procurementRecordService;
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProductWorkOrderMapper productWorkOrderMapper;
    @Autowired
    private ProductionProductMainMapper productionProductMainMapper;
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
    private ISysNoticeService sysNoticeService;
    @Override
    public int add(QualityInspectDto qualityInspectDto) {
@@ -85,6 +110,33 @@
        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
            throw new RuntimeException("请先判断是否合格");
        }
        // è´¨æ£€æ€»æ•°
        BigDecimal quantity = qualityInspect.getQuantity();
        // åˆæ ¼æ•°é‡ = è´¨æ£€æ€»æ•° - ä¸è‰¯æ•°é‡
        BigDecimal productQty = quantity.subtract(qualityInspect.getDefectiveQuantity());
        // åˆæ ¼çއ=合格数量/质检总数
        BigDecimal productQtyRate = productQty.divide(quantity, 2, RoundingMode.HALF_UP)
                .multiply(new BigDecimal("100"));
        // æŸ¥è¯¢å·¥åºçš„合格率
        ProductProcess productProcess = productProcessMapper.selectOne(new LambdaQueryWrapper<ProductProcess>().eq(ProductProcess::getName, qualityInspect.getProcess()));
        if (!ObjectUtils.isNull(productProcess)) {
            // åˆæ ¼çއ < è¯¥å·¥åºçš„合格率
            if (productQtyRate.compareTo(productProcess.getQualifiedRate()) < 0) {
                // æŸ¥è¯¢ç”Ÿäº§è®¢å•
                ProductionProductMain productionProductMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
                ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
                ProductOrder productOrder = productOrderMapper.selectOne(new LambdaQueryWrapper<ProductOrder>().eq(ProductOrder::getId, productWorkOrder.getProductOrderId()));
                if (!ObjectUtils.isNull(productOrder)) {
                    // å‘送通知给管理员
                    sysNoticeService.simpleNoticeByUser("质检提示",
                            String.format("%s生产订单,%s工序合格率%.2f%%低于标准%.2f%%", productOrder.getNpsNo(), productProcess.getName(), productQtyRate, productProcess.getQualifiedRate()),
                            Arrays.asList(Long.valueOf(1L)),
                            qualityInspect.getInspectType() == 2 ? "/qualityManagement/finalInspection" : "/qualityManagement/processInspection");
                }
            }
        }
        /*判断不合格*/
        if (qualityInspect.getCheckResult().equals("不合格")) {
            QualityUnqualified qualityUnqualified = new QualityUnqualified();
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -148,6 +148,9 @@
                        stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
                    }
                    break;
                case "隔离":
                    qualityUnqualified.setQuarantineLifted(false);
                    break;
                default:
                    break;
            }
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -147,5 +147,17 @@
    @TableField(exist = false)
    //是否可编辑
    private Boolean isEdit;
    /**
     * å®¢æˆ·åœ°å€
     */
    @TableField(exist = false)
    private String companyAddress;
    /**
     * å®¢æˆ·è”系电话
     */
    @TableField(exist = false)
    private String contactPhone;
}
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -49,6 +49,13 @@
    private String productCategory;
    /**
     * ç‰©æ–™ç¼–号
     */
    @Excel(name = "物料编号")
    @TableField(exist = false)
    private String materialCode;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -8,6 +8,10 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -58,6 +62,10 @@
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private ApproveProcessServiceImpl approveProcessService;
    @Autowired
    private ProductModelMapper productModelMapper;
    @Autowired
    private ProductMapper productMapper;
    @Override
    public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
@@ -198,7 +206,10 @@
            lockedQty = BigDecimal.ZERO;
        }
        if (stockInventoryDto.getQualitity().compareTo(oldStockInventory.getQualitity().subtract(lockedQty)) > 0) {
            throw new RuntimeException("库存不足无法出库");
            // æŸ¥è¯¢äº§å“è§„格名
            ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
            Product product = productMapper.selectById(productModel.getProductId());
            throw new RuntimeException(product.getProductName()+"/"+productModel.getModel() + "库存不足无法出库");
        }
        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -27,6 +27,7 @@
        pm.model,
        pm.unit,
        p.product_name AS productName,
        p.id AS productId,
        po.nps_no AS productOrderNpsNo,
        ppri.drag_sort,
        ppri.product_route_id,
@@ -55,7 +56,7 @@
            <if test="c.productOrderNpsNo != null and c.productOrderNpsNo != ''">
                and po.nps_no like concat('%',#{c.productOrderNpsNo},'%')
            </if>
        order by pwo.priority, pp.id
        order by pwo.priority, ppri.drag_sort
    </select>
    <select id="getByProductOrderId" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -150,4 +150,13 @@
            #{id}
        </foreach>
    </delete>
    <select id="checkPreviousProcessReported" resultType="java.lang.Boolean">
        SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END
        FROM production_product_main ppm
        JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
        JOIN product_process_route_item ppri ON pwo.product_process_route_item_id = ppri.id
        WHERE ppri.product_route_id = #{productRouteId}
        AND ppri.drag_sort = #{currentDragSort} - 1
    </select>
</mapper>
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -4,6 +4,7 @@
    <select id="qualityInspectListPage" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        qi.*,
        (qi.quantity - qi.defective_quantity) as qualifiedQuantity,
        <choose>
            <when test="qualityInspect.inspectType == 0">
                pl.purchase_contract_number as purchase_contract_no
@@ -48,7 +49,8 @@
    <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        *
        *,
        (quantity - defective_quantity) as qualifiedQuantity
        FROM quality_inspect
        where
        inspect_type=#{qualityInspect.inspectType}
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -99,4 +99,15 @@
        where pm.model=#{model}
          and  p.product_name=#{productName}
    </select>
    <select id="selectUnqualifiedByProcessNames" resultType="com.ruoyi.quality.pojo.QualityUnqualified">
        SELECT DISTINCT qu.*
        FROM quality_unqualified qu
        JOIN quality_inspect qi ON qu.inspect_id = qi.id
        WHERE qi.process IN
        <foreach collection="processNames" item="processName" open="(" separator="," close=")">
            #{processName}
        </foreach>
        AND qu.deal_result = '隔离'
        AND qu.quarantine_lifted = false
    </select>
</mapper>
src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -51,6 +51,8 @@
        T1.salesman,
        T1.customer_id,
        T1.customer_name,
        T3.company_address,
        T3.contact_phone,
        T1.entry_person,
        T1.remarks,
        T1.attachment_materials,
@@ -69,6 +71,7 @@
        END AS is_fh
        FROM sales_ledger T1
        LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id
        LEFT JOIN customer T3 ON T1.customer_id = T3.id
        LEFT JOIN (
        SELECT sales_ledger_id,
        COUNT(*) as total_count,
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -7,6 +7,7 @@
    <select id="selectSalesLedgerProductList" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
        SELECT
        T1.*,
        T3.material_code,
        CASE
        WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >= IFNULL(T1.quantity, 0) THEN 1
        ELSE 0
@@ -14,6 +15,7 @@
        FROM
        sales_ledger_product T1
        LEFT JOIN stock_inventory t2 ON T1.product_model_id = t2.product_model_id
        LEFT JOIN product_model T3 ON T1.product_model_id = T3.id
        <where>
            <if test="salesLedgerProduct.salesLedgerId != null">
                AND T1.sales_ledger_id = #{salesLedgerProduct.salesLedgerId}