gongchunyi
22 小时以前 126a634f94d8918c18a10a2996fc82c6b668f456
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -27,10 +27,14 @@
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
@@ -52,8 +56,12 @@
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@@ -112,6 +120,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());
@@ -171,6 +180,12 @@
    @Autowired
    private ShippingInfoMapper shippingInfoMapper;
    @Autowired
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private QualityInspectMapper qualityInspectMapper;
    @Override
    public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) {
@@ -318,6 +333,228 @@
        return one;
    }
    @Override
    public Map<String, Object> getStockInOrderInfo(String approveId) {
        ApproveProcess approveProcess = getStockInApproveProcess(approveId);
        StockInBusinessContext context = parseStockInContext(approveProcess);
        if (context == null) {
            throw new RuntimeException("当前审批单未绑定入库业务数据");
        }
        Map<String, Object> result = new HashMap<>();
        result.put("approveId", approveProcess.getApproveId());
        result.put("approveType", approveProcess.getApproveType());
        result.put("businessType", context.businessType);
        if (context.purchaseLedgerId != null) {
            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(context.purchaseLedgerId);
            if (purchaseLedger == null) {
                throw new RuntimeException("关联采购订单不存在");
            }
            result.put("orderInfo", purchaseLedger);
            return result;
        }
        if (context.salesLedgerId != null) {
            SalesLedger salesLedger = salesLedgerMapper.selectById(context.salesLedgerId);
            if (salesLedger == null) {
                throw new RuntimeException("关联销售订单不存在");
            }
            result.put("orderInfo", salesLedger);
            return result;
        }
        throw new RuntimeException("未解析到订单信息");
    }
    @Override
    public List<?> getStockInProductList(String approveId) {
        ApproveProcess approveProcess = getStockInApproveProcess(approveId);
        StockInBusinessContext context = parseStockInContext(approveProcess);
        if (context == null) {
            throw new RuntimeException("当前审批单未绑定入库产品数据");
        }
        List<SalesLedgerProduct> matchedProducts;
        if (context.purchaseLedgerId != null) {
            matchedProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                    .eq(SalesLedgerProduct::getSalesLedgerId, context.purchaseLedgerId)
                    .eq(SalesLedgerProduct::getType, 2)
                    .orderByAsc(SalesLedgerProduct::getId));
            return matchedProducts;
        }
        if (context.salesLedgerId != null) {
            LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<SalesLedgerProduct>()
                    .eq(SalesLedgerProduct::getSalesLedgerId, context.salesLedgerId)
                    .eq(SalesLedgerProduct::getType, 1)
                    .orderByAsc(SalesLedgerProduct::getId);
            if (!context.productIds.isEmpty()) {
                wrapper.in(SalesLedgerProduct::getId, context.productIds);
            }
            matchedProducts = salesLedgerProductMapper.selectList(wrapper);
            attachRequestedQty(matchedProducts, context);
            return matchedProducts;
        }
        if (!context.productIds.isEmpty()) {
            matchedProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                    .in(SalesLedgerProduct::getId, context.productIds)
                    .orderByAsc(SalesLedgerProduct::getId));
            attachRequestedQty(matchedProducts, context);
            return matchedProducts;
        }
        return Collections.emptyList();
    }
    private ApproveProcess getStockInApproveProcess(String approveId) {
        if (!StringUtils.hasText(approveId)) {
            throw new RuntimeException("审批编号不能为空");
        }
        ApproveProcess approveProcess = approveProcessMapper.selectOne(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveId, approveId)
                .eq(ApproveProcess::getApproveDelete, 0)
                .orderByDesc(ApproveProcess::getCreateTime)
                .last("limit 1"));
        if (approveProcess == null) {
            throw new RuntimeException("审批单不存在");
        }
        if (!Objects.equals(approveProcess.getApproveType(), 9)) {
            throw new RuntimeException("当前审批单不是入库审批");
        }
        return approveProcess;
    }
    private StockInBusinessContext parseStockInContext(ApproveProcess approveProcess) {
        if (approveProcess == null) {
            return null;
        }
        String remark = approveProcess.getApproveRemark();
        if (StringUtils.hasText(remark) && remark.startsWith("qualityQualifiedInbound:")) {
            String[] split = remark.split(":");
            if (split.length >= 3) {
                StockInBusinessContext context = new StockInBusinessContext();
                context.businessType = "PURCHASE_QUALITY";
                context.purchaseLedgerId = parseLongSafely(split[2]);
                return context;
            }
        }
        if (StringUtils.hasText(remark) && remark.startsWith("salesStock:")) {
            String[] split = remark.split(":");
            if (split.length >= 3) {
                StockInBusinessContext context = new StockInBusinessContext();
                context.businessType = "SALES_STOCK";
                context.salesLedgerId = parseLongSafely(split[1]);
                context.productIds = Arrays.stream(split[2].split(","))
                        .filter(StringUtils::hasText)
                        .map(this::parseLongSafely)
                        .filter(Objects::nonNull)
                        .collect(Collectors.toList());
                return context;
            }
        }
        if (StringUtils.hasText(remark) && (remark.startsWith("scanQualified:") || remark.startsWith("scanUnqualified:"))) {
            String[] split = remark.split(":");
            if (split.length >= 3) {
                StockInBusinessContext context = new StockInBusinessContext();
                context.businessType = remark.startsWith("scanQualified:") ? "SALES_SCAN_QUALIFIED" : "SALES_SCAN_UNQUALIFIED";
                context.salesLedgerId = parseLongSafely(split[1]);
                parseProductLineQty(split[2], context);
                return context;
            }
        }
        String reason = approveProcess.getApproveReason();
        if (!StringUtils.hasText(reason)) {
            return null;
        }
        if (reason.startsWith("原材料质检入库审批:")) {
            String[] split = reason.split(":");
            if (split.length >= 3) {
                StockInBusinessContext context = new StockInBusinessContext();
                context.businessType = "PURCHASE_QUALITY";
                context.purchaseLedgerId = parseLongSafely(split[2]);
                return context;
            }
            if (split.length >= 2) {
                Long inspectId = parseLongSafely(split[1]);
                if (inspectId != null) {
                    QualityInspect inspect = qualityInspectMapper.selectById(inspectId);
                    if (inspect != null) {
                        StockInBusinessContext context = new StockInBusinessContext();
                        context.businessType = "PURCHASE_QUALITY";
                        context.purchaseLedgerId = inspect.getPurchaseLedgerId();
                        return context;
                    }
                }
            }
        }
        if (reason.startsWith("入库审批:")) {
            String[] split = reason.split(":");
            if (split.length >= 4) {
                StockInBusinessContext context = new StockInBusinessContext();
                context.businessType = "SALES_STOCK";
                context.salesLedgerId = parseLongSafely(split[2]);
                context.productIds = Arrays.stream(split[3].split(","))
                        .filter(StringUtils::hasText)
                        .map(this::parseLongSafely)
                        .filter(Objects::nonNull)
                        .collect(Collectors.toList());
                return context;
            }
        }
        return null;
    }
    private void parseProductLineQty(String lines, StockInBusinessContext context) {
        if (!StringUtils.hasText(lines) || context == null) {
            return;
        }
        String[] items = lines.split(",");
        for (String item : items) {
            if (!StringUtils.hasText(item)) {
                continue;
            }
            String[] pair = item.split("@");
            Long lineId = parseLongSafely(pair[0]);
            if (lineId == null) {
                continue;
            }
            context.productIds.add(lineId);
            if (pair.length >= 2 && StringUtils.hasText(pair[1])) {
                context.requestedQtyByProductId.put(lineId, pair[1]);
            }
        }
    }
    private void attachRequestedQty(List<SalesLedgerProduct> products, StockInBusinessContext context) {
        if (products == null || products.isEmpty() || context == null || context.requestedQtyByProductId.isEmpty()) {
            return;
        }
        for (SalesLedgerProduct product : products) {
            if (product == null || product.getId() == null) {
                continue;
            }
            String requestedQty = context.requestedQtyByProductId.get(product.getId());
            if (requestedQty != null) {
                product.setRemark(StringUtils.hasText(product.getRemark())
                        ? product.getRemark() + ";审批申请数量:" + requestedQty
                        : "审批申请数量:" + requestedQty);
            }
        }
    }
    private Long parseLongSafely(String value) {
        if (!StringUtils.hasText(value)) {
            return null;
        }
        try {
            return Long.valueOf(value);
        } catch (Exception ignored) {
            return null;
        }
    }
    private static class StockInBusinessContext {
        private String businessType;
        private Long purchaseLedgerId;
        private Long salesLedgerId;
        private List<Long> productIds = new ArrayList<>();
        private final Map<Long, String> requestedQtyByProductId = new HashMap<>();
    }
    @Autowired
    private ApproveNodeMapper approveNodeMapper;
@@ -455,6 +692,8 @@
                return "发货审批";
            case 8:
                return "危险作业审批";
            case 9:
                return "入库审批";
        }
        return null;
    }