| | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | 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()); |
| | |
| | | |
| | | @Autowired |
| | | private ShippingInfoMapper shippingInfoMapper; |
| | | |
| | | @Autowired |
| | | private SalesLedgerProductMapper salesLedgerProductMapper; |
| | | |
| | | @Autowired |
| | | private QualityInspectMapper qualityInspectMapper; |
| | | |
| | | @Override |
| | | public IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess) { |
| | |
| | | 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; |
| | | |
| | |
| | | return "发货审批"; |
| | | case 8: |
| | | return "危险作业审批"; |
| | | case 9: |
| | | return "入库审批"; |
| | | } |
| | | return null; |
| | | } |