gongchunyi
10 小时以前 6c95c2f6a3602fe6f92898dd322c20bbe955e69d
feat: 成品入库增加审批环节,原材质检后提交入库时增加一个审批环节
已修改20个文件
538 ■■■■■ 文件已修改
doc/河南鹤壁天沐钢化玻璃厂.sql 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesScanInboundDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInRecordMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -159,5 +159,12 @@
ALTER TABLE `product-inventory-management-hbtmblc`.`device_ledger`
    ADD COLUMN `product_process_id` bigint NULL COMMENT '工序ID' AFTER `type`;
ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_location` VARCHAR ( 255 ) CHARACTER
    SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备保养位置';
ALTER TABLE `device_maintenance` ADD COLUMN `maintenance_location` VARCHAR ( 255 ) CHARACTER
    SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备保养位置';
ALTER TABLE `quality_inspect`
    ADD COLUMN `approval_status` bigint DEFAULT '1' COMMENT '入库审批状态:1-待审核,2-审批中,3-审批通过,4-审批失败' AFTER `inspect_state`,
    ADD COLUMN `approve_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '入库审批人id,逗号分隔' AFTER `approval_status`;
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -31,6 +31,8 @@
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ShippingInfoService;
import com.ruoyi.sales.service.ISalesLedgerService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
@@ -91,6 +93,12 @@
    @Autowired
    @Lazy
    private ShippingInfoService shippingInfoService;
    @Autowired
    @Lazy
    private ISalesLedgerService salesLedgerService;
    @Autowired
    @Lazy
    private IQualityInspectService qualityInspectService;
    public ApproveProcess getApproveById(String id) {
@@ -280,6 +288,104 @@
            }
        }
        // é”€å”®è®¢å•成品入库审批
        if (approveProcess.getApproveType().equals(9)) {
            String reason = approveProcess.getApproveReason();
            // é”€å”®æ ¼å¼ï¼šå…¥åº“审批:合同号:salesLedgerId:productId1,productId2
            // è´¨æ£€æ ¼å¼ï¼šåŽŸææ–™è´¨æ£€å…¥åº“å®¡æ‰¹:inspectId:purchaseLedgerId
            if (org.springframework.util.StringUtils.hasText(reason)) {
                if (reason.startsWith("原材料质检入库审批:")) {
                    Integer inspectId = null;
                    String remark = approveProcess.getApproveRemark();
                    // æ–°é€»è¾‘:业务参数放在 approveRemark
                    if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith("qualityQualifiedInbound:")) {
                        String[] split = remark.split(":");
                        if (split.length >= 2) {
                            inspectId = Integer.valueOf(split[1]);
                        }
                    }
                    if (inspectId == null) {
                        String[] split = reason.split(":");
                        if (split.length >= 2) {
                            inspectId = Integer.valueOf(split[1]);
                        }
                    }
                    if (inspectId != null) {
                        if (status.equals(2)) {
                            qualityInspectService.executeQualifiedInboundApproval(inspectId);
                        } else if (status.equals(3)) {
                            qualityInspectService.markQualifiedInboundApprovalStatus(inspectId, 4);
                        } else if (status.equals(1)) {
                            qualityInspectService.markQualifiedInboundApprovalStatus(inspectId, 2);
                        }
                    }
                    // è´¨æ£€å®¡æ‰¹ä¸éœ€è¦ç»§ç»­èµ°é”€å”®è®¢å•入库
                    return;
                }
                if (reason.startsWith("销售扫码不合格入库审批:") || reason.startsWith("销售扫码合格入库审批:")) {
                    String remark = approveProcess.getApproveRemark();
                    boolean qualified = reason.startsWith("销售扫码合格入库审批:");
                    String prefix = qualified ? "scanQualified:" : "scanUnqualified:";
                    if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith(prefix)) {
                        String[] split = remark.split(":");
                        if (split.length >= 3) {
                            Long salesLedgerId = Long.valueOf(split[1]);
                            java.util.Map<Long, BigDecimal> inboundQtyByLineId = Arrays.stream(split[2].split(","))
                                    .filter(org.springframework.util.StringUtils::hasText)
                                    .map(s -> s.split("@"))
                                    .filter(arr -> arr.length == 2)
                                    .collect(java.util.stream.Collectors.toMap(
                                            arr -> Long.valueOf(arr[0]),
                                            arr -> new BigDecimal(arr[1]),
                                            BigDecimal::add,
                                            java.util.LinkedHashMap::new));
                            if (status.equals(2)) {
                                if (qualified) {
                                    salesLedgerService.executeSalesScanInboundApproved(salesLedgerId, inboundQtyByLineId);
                                } else {
                                    salesLedgerService.executeSalesScanInboundUnqualifiedApproved(salesLedgerId, inboundQtyByLineId);
                                }
                            }
                        }
                    }
                    return;
                }
                String[] split = reason.split(":");
                Long salesLedgerId = null;
                List<Long> productIds = null;
                //  å…¥åº“审批理由只展示合同号    å‚数放在 approveRemark
                if (reason.startsWith("入库审批:")) {
                    String remark = approveProcess.getApproveRemark();
                    if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith("salesStock:")) {
                        String[] r = remark.split(":");
                        if (r.length >= 3) {
                            salesLedgerId = Long.valueOf(r[1]);
                            productIds = Arrays.stream(r[2].split(","))
                                    .filter(org.springframework.util.StringUtils::hasText)
                                    .map(Long::valueOf)
                                    .collect(java.util.stream.Collectors.toList());
                        }
                    }
                }
                //  å…¥åº“审批:合同号:salesLedgerId:productId1,productId2
                if (salesLedgerId == null && split.length >= 4) {
                    salesLedgerId = Long.valueOf(split[2]);
                    productIds = Arrays.stream(split[3].split(","))
                            .filter(org.springframework.util.StringUtils::hasText)
                            .map(Long::valueOf)
                            .collect(java.util.stream.Collectors.toList());
                }
                if (salesLedgerId != null && productIds != null) {
                    if (status.equals(2)) {
                        // å®¡æ‰¹é€šè¿‡æ‰§è¡Œå…¥åº“
                        salesLedgerService.executeSalesStockApproved(salesLedgerId, productIds);
                    }
                }
            }
        }
        // ç»‘定附件
        if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
            tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
@@ -371,6 +477,8 @@
                return "发货审批";
            case 8:
                return "危险作业审批";
            case 9:
                return "入库审批";
        }
        return null;
    }
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -112,6 +112,7 @@
        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
        approveProcess.setApproveRemark(approveProcessVO.getApproveRemark());
        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
        approveProcess.setPrice(approveProcessVO.getPrice());
@@ -455,6 +456,8 @@
                return "发货审批";
            case 8:
                return "危险作业审批";
            case 9:
                return "入库审批";
        }
        return null;
    }
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -47,6 +47,11 @@
     */
    private String approveReason;
    /**
     * å®¡æ‰¹å¤‡æ³¨
     */
    private String approveRemark;
    @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd",width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "开始时间")
src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java
@@ -22,7 +22,8 @@
    REIMBURSEMENT(4, "报销管理"),
    PURCHASE(5, "采购审批"),
    QUOTATION(6, "报价审批"),
    DELIVERY(7, "发货审批");
    DELIVERY(7, "发货审批"),
    STOCK_IN(9, "入库审批");
    private final Integer code;
    private final String name;
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -23,6 +23,9 @@
    @ApiModelProperty("规格型号")
    private String deviceModel;
    @ApiModelProperty("设备保养位置")
    private String maintenanceLocation;
    @ApiModelProperty("计划保养日期")
    private String maintenancePlanTimeReq;
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -84,4 +84,7 @@
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("设备保养位置")
    private String maintenanceLocation;
}
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -106,7 +106,4 @@
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("设备保养位置")
    private String maintenanceLocation;
}
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -47,9 +47,6 @@
            if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) {
                queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName());
            }
            if (StringUtils.isNotEmpty(maintenanceTask.getMaintenanceLocation())) {
                queryWrapper.like(MaintenanceTask::getMaintenanceLocation, maintenanceTask.getMaintenanceLocation());
            }
            if (StringUtils.isNotEmpty(maintenanceTask.getStatus())) {
                queryWrapper.eq(MaintenanceTask::getStatus, maintenanceTask.getStatus());
            }
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -219,6 +219,12 @@
        if (purchaseLedger.getId() == null) {
            purchaseLedgerMapper.insert(purchaseLedger);
        } else {
            PurchaseLedger dbLedger = purchaseLedgerMapper.selectById(purchaseLedger.getId());
            if (dbLedger != null
                    && Objects.equals(dbLedger.getApprovalStatus(), 3)
                    && Objects.equals(dbLedger.getStockStatus(), 2)) {
                throw new ServiceException("该采购订单已审批通过且已全部入库,不能再次发起入库审批;如需重提请先走审批不通过流程");
            }
            // åˆ é™¤é‡‡è´­å®¡æ ¸ï¼Œé‡æ–°æäº¤
            ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                    .eq(ApproveProcess::getApproveType, 5)
@@ -856,6 +862,11 @@
    }
    public void addApproveByPurchase(LoginUser loginUser, PurchaseLedger purchaseLedger) throws Exception {
        if (purchaseLedger != null
                && Objects.equals(purchaseLedger.getApprovalStatus(), 3)
                && Objects.equals(purchaseLedger.getStockStatus(), 2)) {
            throw new ServiceException("该采购订单入库数量已满足,不能重复发起审批");
        }
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(5);
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -151,6 +151,12 @@
    @ApiModelProperty("关联检测标准主表id")
    private Long testStandardId;
    @ApiModelProperty("入库审批状态:1-待审核,2-审批中,3-审批通过,4-审批失败")
    private Integer approvalStatus;
    @ApiModelProperty("入库审批人id")
    private String approveUserIds;
    @TableField(exist = false)
    private String workOrderNo;
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -15,7 +15,7 @@
    int updateQualityInspect(QualityInspectDto qualityInspectDto);
    IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect);
    IPage<QualityInspect> qualityInspectListPage(Page<?> page, QualityInspect qualityInspect);
    void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect);
@@ -24,4 +24,8 @@
    int submit(QualityInspect qualityInspect);
    void down(HttpServletResponse response, QualityInspect qualityInspect);
    void executeQualifiedInboundApproval(Integer inspectId);
    void markQualifiedInboundApprovalStatus(Integer inspectId, Integer approvalStatus);
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -11,7 +11,12 @@
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.ApproveTypeEnum;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.quality.dto.QualityInspectDto;
@@ -27,6 +32,7 @@
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.framework.security.LoginUser;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -61,6 +67,7 @@
    private PurchaseLedgerMapper purchaseLedgerMapper;
    private ProcurementRecordService procurementRecordService;
    private IApproveProcessService approveProcessService;
    @Override
    public int add(QualityInspectDto qualityInspectDto) {
@@ -104,15 +111,111 @@
            qualityUnqualified.setInspectId(qualityInspect.getId());
            qualityUnqualifiedMapper.insert(qualityUnqualified);
        } else {
            //合格直接入库
            stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId());
            // é‡‡è´­åŽŸææ–™æ£€éªŒï¼šåˆæ ¼å…¥åº“åŽåŒæ­¥åˆ°é‡‡è´­äº§å“â€œå·²å…¥åº“æ•°é‡â€ï¼Œä¸Žæ‰«ç å…¥åº“å…±ç”¨ä¸€ä»½æ•°æ®å£å¾„
            syncQualifiedInboundToPurchaseProducts(qualityInspect);
            // åŽŸææ–™æ£€éªŒåˆæ ¼åŽï¼Œå…ˆå‘èµ·â€œå…¥åº“å®¡æ‰¹â€ï¼Œå®¡æ‰¹é€šè¿‡åŽå†å…¥åº“
            if (Objects.equals(qualityInspect.getInspectType(), 0)) {
                submitQualifiedInboundApprove(qualityInspect);
            } else {
                //  ç›´æŽ¥å…¥åº“
                stockUtils.addStock(
                        qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(),
                        null,
                        qualityInspect.getProductModelId(),
                        qualityInspect.getQuantity(),
                        StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(),
                        qualityInspect.getId()
                );
                syncQualifiedInboundToPurchaseProducts(qualityInspect);
            }
        }
        qualityInspect.setInspectState(1);//已提交
        int updated = qualityInspectMapper.updateById(qualityInspect);
        refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId());
        return updated;
    }
    private void submitQualifiedInboundApprove(QualityInspect qualityInspect) {
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(qualityInspect.getPurchaseLedgerId());
        if (purchaseLedger == null) {
            throw new RuntimeException("提交失败,采购台账不存在");
        }
        String approveUserIds = ObjectUtils.isNotEmpty(qualityInspect.getApproveUserIds())
                ? qualityInspect.getApproveUserIds()
                : purchaseLedger.getApproveUserIds();
        if (ObjectUtils.isEmpty(approveUserIds)) {
            throw new RuntimeException("提交失败,请先维护质检单审批人(或采购台账审批人)");
        }
        String approveReason = "原材料质检入库审批:" + purchaseLedger.getPurchaseContractNumber();
        String approveRemark = "qualityQualifiedInbound:" + qualityInspect.getId() + ":" + purchaseLedger.getId();
        ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode())
                .eq(ApproveProcess::getApproveRemark, approveRemark)
                .eq(ApproveProcess::getApproveDelete, 0)
                .orderByDesc(ApproveProcess::getCreateTime)
                .last("limit 1"));
        if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) {
            throw new RuntimeException("提交失败,该质检单已发起入库审批,审批完成前不能重复提交");
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode());
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason(approveReason);
        approveProcessVO.setApproveRemark(approveRemark);
        approveProcessVO.setApproveUserIds(approveUserIds);
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(java.time.LocalDate.now().toString());
        try {
            approveProcessService.addApprove(approveProcessVO);
        } catch (Exception e) {
            throw new RuntimeException("提交失败,入库审批发起异常:" + e.getMessage());
        }
        qualityInspect.setApprovalStatus(2);
        qualityInspect.setApproveUserIds(approveUserIds);
        qualityInspectMapper.updateById(qualityInspect);
    }
    @Override
    public void executeQualifiedInboundApproval(Integer inspectId) {
        if (inspectId == null) {
            throw new RuntimeException("审批失败,质检单ID不能为空");
        }
        QualityInspect qualityInspect = qualityInspectMapper.selectById(inspectId);
        if (qualityInspect == null) {
            throw new RuntimeException("审批失败,质检单不存在");
        }
        if (!Objects.equals(qualityInspect.getInspectType(), 0)) {
            throw new RuntimeException("审批失败,仅原材料检验支持入库审批");
        }
        if (!Objects.equals(qualityInspect.getInspectState(), 1) || !"合格".equals(qualityInspect.getCheckResult())) {
            throw new RuntimeException("审批失败,当前质检单状态不允许入库");
        }
        stockUtils.addStock(
                qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(),
                null,
                qualityInspect.getProductModelId(),
                qualityInspect.getQuantity(),
                StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(),
                qualityInspect.getId()
        );
        syncQualifiedInboundToPurchaseProducts(qualityInspect);
        refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId());
        qualityInspect.setApprovalStatus(3);
        qualityInspectMapper.updateById(qualityInspect);
    }
    @Override
    public void markQualifiedInboundApprovalStatus(Integer inspectId, Integer approvalStatus) {
        if (inspectId == null || approvalStatus == null) {
            return;
        }
        QualityInspect qualityInspect = qualityInspectMapper.selectById(inspectId);
        if (qualityInspect == null) {
            return;
        }
        qualityInspect.setApprovalStatus(approvalStatus);
        qualityInspectMapper.updateById(qualityInspect);
    }
    /*生成检验报告*/
@@ -182,7 +285,7 @@
    }
    @Override
    public IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect) {
    public IPage<QualityInspect> qualityInspectListPage(Page<?> page, QualityInspect qualityInspect) {
        return qualityInspectMapper.qualityInspectListPage(page, qualityInspect);
    }
src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java
@@ -25,4 +25,7 @@
    @ApiModelProperty("销售订单产品Id")
    private List<Long> salesLedgerProducts;
    @ApiModelProperty("审批人ID,逗号分隔")
    private String approveUserIds;
}
src/main/java/com/ruoyi/sales/dto/SalesScanInboundDto.java
@@ -20,4 +20,7 @@
    @ApiModelProperty("销售产品行数据")
    private List<SalesLedgerProduct> salesLedgerProductList;
    @ApiModelProperty("审批人ID,逗号分隔")
    private String approveUserIds;
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -15,6 +15,7 @@
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
 * é”€å”®å°è´¦Service接口
@@ -68,6 +69,12 @@
    void salesStock(SalesProductStockDto dto);
    void executeSalesStockApproved(Long salesLedgerId, List<Long> salesLedgerProductIds);
    void executeSalesScanInboundApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId);
    void executeSalesScanInboundUnqualifiedApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId);
    List<Customer> shippedCustomers();
    void scanInbound(SalesScanInboundDto dto);
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,6 +9,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.common.enums.ApproveTypeEnum;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
@@ -103,6 +107,9 @@
    private static final String LOCK_PREFIX = "contract_no_lock:";
    private static final long LOCK_WAIT_TIMEOUT = 10; // é”ç­‰å¾…超时时间(秒)
    private static final long LOCK_EXPIRE_TIME = 30;  // é”è‡ªåŠ¨è¿‡æœŸæ—¶é—´ï¼ˆç§’ï¼‰
    private static final int INBOUND_BIZ_TYPE_WEB = 1;
    private static final int INBOUND_BIZ_TYPE_SCAN_QUALIFIED = 2;
    private static final int INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED = 3;
    private final AccountIncomeService accountIncomeService;
    private final SalesLedgerMapper salesLedgerMapper;
    private final CustomerMapper customerMapper;
@@ -144,6 +151,8 @@
    private final StockInRecordService stockInRecordService;
    private final StockOutRecordService stockOutRecordService;
    private final StockUtils stockUtils;
    @Autowired
    private IApproveProcessService approveProcessService;
    @Autowired
    private SysDeptMapper sysDeptMapper;
@@ -1857,6 +1866,9 @@
        if (ledger.getStockStatus() == null) {
            throw new ServiceException("入库失败,销售订单入库状态异常");
        }
        if (ledger.getStockStatus() == 3) {
            throw new ServiceException("入库失败,该销售订单正在入库审批中,请勿重复提交");
        }
        if (ledger.getStockStatus() == 2) {
            throw new ServiceException("入库失败,该销售订单已入库,请勿重复入库");
        }
@@ -1869,6 +1881,42 @@
        if (salesLedgerProducts == null || salesLedgerProducts.isEmpty()) {
            throw new ServiceException("入库失败,未查询到该销售订单的销售产品");
        }
        String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), ledger.getId(), INBOUND_BIZ_TYPE_WEB);
        if (StringUtils.isEmpty(approveUserIds)) {
            throw new ServiceException("入库失败,请选择审批人");
        }
        String productIds = products.stream().map(String::valueOf).collect(Collectors.joining(","));
        LoginUser loginUser = SecurityUtils.getLoginUser();
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode());
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason("入库审批:" + ledger.getSalesContractNo());
        approveProcessVO.setApproveRemark("salesStock:" + ledger.getId() + ":" + productIds);
        approveProcessVO.setApproveUserIds(approveUserIds);
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        try {
            approveProcessService.addApprove(approveProcessVO);
        } catch (Exception e) {
            throw new ServiceException("入库审批发起失败:" + e.getMessage());
        }
        // å®¡æ‰¹ä¸­
        ledger.setStockStatus(3);
        baseMapper.updateById(ledger);
    }
    @Override
    public void executeSalesStockApproved(Long salesLedgerId, List<Long> products) {
        SalesProductStockDto dto = new SalesProductStockDto();
        dto.setSalesLedgerId(salesLedgerId);
        dto.setSalesLedgerProducts(products);
        SalesLedger ledger = baseMapper.selectById(dto.getSalesLedgerId());
        if (ledger == null) {
            throw new ServiceException("入库失败,销售订单不存在");
        }
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().in(SalesLedgerProduct::getId, products));
        for (SalesLedgerProduct product : salesLedgerProducts) {
            if (!Objects.equals(product.getSalesLedgerId(), ledger.getId())) {
                throw new ServiceException("入库失败,存在不属于当前销售订单的产品");
@@ -1978,11 +2026,71 @@
            }
            inboundQtyByLineId.merge(inbound.getId(), inboundQty, BigDecimal::add);
        }
        List<SalesLedgerProduct> selectedProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery()
                .in(SalesLedgerProduct::getId, inboundQtyByLineId.keySet()));
        if (CollectionUtils.isEmpty(selectedProducts)) {
            throw new ServiceException("入库失败,未查询到入库产品");
        }
        if (selectedProducts.size() != inboundQtyByLineId.size()) {
            throw new ServiceException("入库失败,部分产品不存在");
        }
        for (SalesLedgerProduct selectedProduct : selectedProducts) {
            if (!Objects.equals(selectedProduct.getSalesLedgerId(), salesLedger.getId())) {
                throw new ServiceException("入库失败,销售产品与订单不匹配");
            }
            if (!Objects.equals(selectedProduct.getType(), SaleEnum.SALE.getCode())) {
                throw new ServiceException("入库失败,仅支持销售订单产品行");
            }
            if (selectedProduct.getProductModelId() == null) {
                throw new ServiceException("入库失败,产品规格未维护,无法入库");
            }
        }
        String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), salesLedger.getId(), INBOUND_BIZ_TYPE_SCAN_QUALIFIED);
        if (StringUtils.isEmpty(approveUserIds)) {
            throw new ServiceException("入库失败,请选择审批人");
        }
        String lines = inboundQtyByLineId.entrySet().stream()
                .map(e -> e.getKey() + "@" + e.getValue().stripTrailingZeros().toPlainString())
                .collect(Collectors.joining(","));
        String reason = "销售扫码合格入库审批:" + salesLedger.getSalesContractNo();
        String remark = "scanQualified:" + salesLedger.getId() + ":" + lines;
        ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode())
                .eq(ApproveProcess::getApproveRemark, remark)
                .eq(ApproveProcess::getApproveDelete, 0)
                .orderByDesc(ApproveProcess::getCreateTime)
                .last("limit 1"));
        if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) {
            throw new ServiceException("入库失败,该申请已提交审批");
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode());
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason(reason);
        approveProcessVO.setApproveRemark(remark);
        approveProcessVO.setApproveUserIds(approveUserIds);
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        try {
            approveProcessService.addApprove(approveProcessVO);
        } catch (Exception e) {
            throw new ServiceException("入库审批发起失败:" + e.getMessage());
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void executeSalesScanInboundApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId) {
        SalesLedger salesLedger = baseMapper.selectById(salesLedgerId);
        if (salesLedger == null) {
            throw new ServiceException("入库失败,销售订单不存在");
        }
        Long ledgerId = salesLedger.getId();
        for (Map.Entry<Long, BigDecimal> entry : inboundQtyByLineId.entrySet()) {
            Long salesLedgerProductId = entry.getKey();
            BigDecimal inboundThisLine = entry.getValue();
            if (inboundThisLine.compareTo(BigDecimal.ZERO) == 0) {
            if (inboundThisLine == null || inboundThisLine.compareTo(BigDecimal.ZERO) <= 0) {
                continue;
            }
            SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectById(salesLedgerProductId);
@@ -2065,11 +2173,71 @@
            }
            inboundQtyByLineId.merge(inbound.getId(), inboundQty, BigDecimal::add);
        }
        List<SalesLedgerProduct> selectedProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery()
                .in(SalesLedgerProduct::getId, inboundQtyByLineId.keySet()));
        if (CollectionUtils.isEmpty(selectedProducts)) {
            throw new ServiceException("不合格入库失败,未查询到入库产品");
        }
        if (selectedProducts.size() != inboundQtyByLineId.size()) {
            throw new ServiceException("不合格入库失败,部分产品不存在");
        }
        for (SalesLedgerProduct selectedProduct : selectedProducts) {
            if (!Objects.equals(selectedProduct.getSalesLedgerId(), salesLedger.getId())) {
                throw new ServiceException("不合格入库失败,销售产品与订单不匹配");
            }
            if (!Objects.equals(selectedProduct.getType(), SaleEnum.SALE.getCode())) {
                throw new ServiceException("不合格入库失败,仅支持销售订单产品行");
            }
            if (selectedProduct.getProductModelId() == null) {
                throw new ServiceException("不合格入库失败,产品规格未维护,无法入库");
            }
        }
        String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), salesLedger.getId(), INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED);
        if (StringUtils.isEmpty(approveUserIds)) {
            throw new ServiceException("不合格入库失败,请选择审批人");
        }
        String lines = inboundQtyByLineId.entrySet().stream()
                .map(e -> e.getKey() + "@" + e.getValue().stripTrailingZeros().toPlainString())
                .collect(Collectors.joining(","));
        String reason = "销售扫码不合格入库审批:" + salesLedger.getSalesContractNo();
        String remark = "scanUnqualified:" + salesLedger.getId() + ":" + lines;
        ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode())
                .eq(ApproveProcess::getApproveRemark, remark)
                .eq(ApproveProcess::getApproveDelete, 0)
                .orderByDesc(ApproveProcess::getCreateTime)
                .last("limit 1"));
        if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) {
            throw new ServiceException("不合格入库失败,该申请已提交审批");
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode());
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason(reason);
        approveProcessVO.setApproveRemark(remark);
        approveProcessVO.setApproveUserIds(approveUserIds);
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        try {
            approveProcessService.addApprove(approveProcessVO);
        } catch (Exception e) {
            throw new ServiceException("不合格入库审批发起失败:" + e.getMessage());
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void executeSalesScanInboundUnqualifiedApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId) {
        SalesLedger salesLedger = baseMapper.selectById(salesLedgerId);
        if (salesLedger == null) {
            throw new ServiceException("不合格入库失败,销售订单不存在");
        }
        Long ledgerId = salesLedger.getId();
        for (Map.Entry<Long, BigDecimal> entry : inboundQtyByLineId.entrySet()) {
            Long salesLedgerProductId = entry.getKey();
            BigDecimal inboundThisLine = entry.getValue();
            if (inboundThisLine.compareTo(BigDecimal.ZERO) == 0) {
            if (inboundThisLine == null || inboundThisLine.compareTo(BigDecimal.ZERO) <= 0) {
                continue;
            }
            SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectById(salesLedgerProductId);
@@ -2087,7 +2255,6 @@
            }
            stockUtils.addUnStock(ledgerId, dbProduct.getId(), dbProduct.getProductModelId(), inboundThisLine,
                    StockInUnQualifiedRecordTypeEnum.SALES_SCAN_UNSTOCK_IN.getCode(), dbProduct.getId());
            BigDecimal oldUnStocked = dbProduct.getUnqualifiedStockedQuantity() == null ? BigDecimal.ZERO : dbProduct.getUnqualifiedStockedQuantity();
            dbProduct.setUnqualifiedStockedQuantity(oldUnStocked.add(inboundThisLine));
            dbProduct.fillRemainingQuantity();
@@ -2095,6 +2262,31 @@
        }
    }
    private String resolveApproveUserIds(String approveUserIds, Long salesLedgerId, Integer bizType) {
        if (StringUtils.isNotEmpty(approveUserIds)) {
            return approveUserIds;
        }
        LambdaQueryWrapper<ApproveProcess> wrapper = new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode())
                .eq(ApproveProcess::getApproveDelete, 0)
                .orderByDesc(ApproveProcess::getCreateTime)
                .last("limit 1");
        if (Objects.equals(bizType, INBOUND_BIZ_TYPE_WEB)) {
            wrapper.likeRight(ApproveProcess::getApproveReason, "入库审批:")
                    .likeRight(ApproveProcess::getApproveRemark, "salesStock:" + salesLedgerId + ":");
        } else if (Objects.equals(bizType, INBOUND_BIZ_TYPE_SCAN_QUALIFIED)) {
            wrapper.likeRight(ApproveProcess::getApproveReason, "销售扫码合格入库审批:")
                    .likeRight(ApproveProcess::getApproveRemark, "scanQualified:" + salesLedgerId + ":");
        } else if (Objects.equals(bizType, INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED)) {
            wrapper.likeRight(ApproveProcess::getApproveReason, "销售扫码不合格入库审批:")
                    .likeRight(ApproveProcess::getApproveRemark, "scanUnqualified:" + salesLedgerId + ":");
        } else {
            return null;
        }
        ApproveProcess latest = approveProcessService.getOne(wrapper);
        return latest == null ? null : latest.getApproveUserIds();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void scanOutbound(SalesScanInboundDto dto) {
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -18,6 +18,7 @@
        dm.update_user,
        dm.tenant_id,
        dm.maintenance_actually_name,
        dm.maintenance_location,
        dl.device_name,
        dl.device_model,
        su.nick_name as create_user_name
@@ -37,6 +38,9 @@
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyName != null">
                and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenanceLocation != null and deviceMaintenanceDto.maintenanceLocation != ''">
                and dm.maintenance_location like concat('%',#{deviceMaintenanceDto.maintenanceLocation},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenancePlanTime != null">
                and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%')
@@ -63,6 +67,7 @@
               dm.update_user,
               dm.tenant_id,
               dm.maintenance_actually_name,
               dm.maintenance_location,
               dl.device_name,
               dl.device_model,
               su.user_name as create_user_name
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -47,6 +47,12 @@
        <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
            AND qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
        </if>
        <if test="qualityInspect.approvalStatus != null">
            AND qi.approval_status = #{qualityInspect.approvalStatus}
        </if>
        <if test="qualityInspect.approveUserIds != null and qualityInspect.approveUserIds != '' ">
            AND qi.approve_user_ids like concat('%',#{qualityInspect.approveUserIds},'%')
        </if>
        ORDER BY qi.id DESC
    </select>
@@ -68,6 +74,12 @@
        <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
            AND product_name = #{qualityInspect.productName}
        </if>
        <if test="qualityInspect.approvalStatus != null">
            AND approval_status = #{qualityInspect.approvalStatus}
        </if>
        <if test="qualityInspect.approveUserIds != null and qualityInspect.approveUserIds != '' ">
            AND approve_user_ids like concat('%',#{qualityInspect.approveUserIds},'%')
        </if>
    </select>
    <delete id="deleteByProductMainIds">
src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -11,18 +11,22 @@
        pm.thickness,
        u.nick_name as createBy,
        CASE
            WHEN sir.record_type IN ('7', '18', '19', '20') THEN pl.purchase_contract_number
            WHEN sir.record_type IN ('6', '7', '18', '19', '20') THEN pl.purchase_contract_number
            ELSE sl.sales_contract_no
        END as salesContractNo
        FROM stock_in_record as sir
        LEFT JOIN product_model as pm on sir.product_model_id = pm.id
        LEFT JOIN product as p on pm.product_id = p.id
        LEFT JOIN sys_user as u on sir.create_user = u.user_id
        LEFT JOIN quality_inspect as qi on qi.id = sir.record_id and sir.record_type = '6'
        LEFT JOIN sales_ledger_product as slp_link on slp_link.id = COALESCE(sir.sales_ledger_product_id, sir.record_id)
        LEFT JOIN sales_ledger as sl on sl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
            and sir.record_type NOT IN ('7', '18', '19', '20')
        LEFT JOIN purchase_ledger as pl on pl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
            and sir.record_type IN ('7', '18', '19', '20')
            and sir.record_type NOT IN ('6', '7', '18', '19', '20')
        LEFT JOIN purchase_ledger as pl on pl.id = CASE
            WHEN sir.record_type = '6' THEN qi.purchase_ledger_id
            ELSE COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
        END
            and sir.record_type IN ('6', '7', '18', '19', '20')
        <where>
            <if test="params.timeStr != null and params.timeStr != ''">
                and sir.create_time like concat('%',#{params.timeStr},'%')
@@ -32,9 +36,9 @@
            </if>
            <if test="params.salesContractNo != null and params.salesContractNo != ''">
                and (
                    (sir.record_type IN ('7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%'))
                    (sir.record_type IN ('6', '7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%'))
                    or
                    (sir.record_type NOT IN ('7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%'))
                    (sir.record_type NOT IN ('6', '7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%'))
                )
            </if>
            <if test="params.type != null and params.type != ''">
@@ -54,18 +58,22 @@
        pm.unit,
        u.nick_name as createBy,
        CASE
            WHEN sir.record_type IN ('7', '18', '19', '20') THEN pl.purchase_contract_number
            WHEN sir.record_type IN ('6', '7', '18', '19', '20') THEN pl.purchase_contract_number
            ELSE sl.sales_contract_no
        END as salesContractNo
        FROM stock_in_record as sir
        LEFT JOIN product_model as pm on sir.product_model_id = pm.id
        LEFT JOIN product as p on pm.product_id = p.id
        LEFT JOIN sys_user as u on sir.create_user = u.user_id
        LEFT JOIN quality_inspect as qi on qi.id = sir.record_id and sir.record_type = '6'
        LEFT JOIN sales_ledger_product as slp_link on slp_link.id = COALESCE(sir.sales_ledger_product_id, sir.record_id)
        LEFT JOIN sales_ledger as sl on sl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
            and sir.record_type NOT IN ('7', '18', '19', '20')
        LEFT JOIN purchase_ledger as pl on pl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
            and sir.record_type IN ('7', '18', '19', '20')
            and sir.record_type NOT IN ('6', '7', '18', '19', '20')
        LEFT JOIN purchase_ledger as pl on pl.id = CASE
            WHEN sir.record_type = '6' THEN qi.purchase_ledger_id
            ELSE COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id)
        END
            and sir.record_type IN ('6', '7', '18', '19', '20')
        <where>
            <if test="params.timeStr != null and params.timeStr != ''">
                and sir.create_time like concat('%',#{params.timeStr},'%')
@@ -75,9 +83,9 @@
            </if>
            <if test="params.salesContractNo != null and params.salesContractNo != ''">
                and (
                    (sir.record_type IN ('7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%'))
                    (sir.record_type IN ('6', '7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%'))
                    or
                    (sir.record_type NOT IN ('7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%'))
                    (sir.record_type NOT IN ('6', '7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%'))
                )
            </if>
            <if test="params.type != null and params.type != ''">