gongchunyi
5 小时以前 dfe6c610fe4a6b2c99dc9ee66ef8f6fe1c89ceda
feat: 入库审批添加关联订单信息和产品明细
已修改3个文件
253 ■■■■■ 文件已修改
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -82,6 +82,18 @@
        return AjaxResult.success(approveProcessService.getApproveById(approveGetAndUpdateVo.getId()));
    }
    @GetMapping("/stockIn/orderInfo")
    @ApiOperation(value = "入库审批-关联订单信息")
    public AjaxResult getStockInOrderInfo(@RequestParam("approveId") String approveId) {
        return AjaxResult.success(approveProcessService.getStockInOrderInfo(approveId));
    }
    @GetMapping("/stockIn/productList")
    @ApiOperation(value = "入库审批-关联产品明细")
    public AjaxResult getStockInProductList(@RequestParam("approveId") String approveId) {
        return AjaxResult.success(approveProcessService.getStockInProductList(approveId));
    }
    /**
     * 更新审批
     * @param approveGetAndUpdateVo
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -12,6 +12,7 @@
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
public interface IApproveProcessService extends IService<ApproveProcess> {
    /**
@@ -33,4 +34,8 @@
    ApproveProcess getApproveById(String id);
    Map<String, Object> getStockInOrderInfo(String approveId);
    List<?> getStockInProductList(String approveId);
}
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
@@ -172,6 +180,12 @@
    @Autowired
    private ShippingInfoMapper shippingInfoMapper;
    @Autowired
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private QualityInspectMapper qualityInspectMapper;
    @Override
    public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) {
@@ -319,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;