浏览代码

Merge branch 'master' into 外协收回按炉结算判断

ezhizao_zx 10 月之前
父节点
当前提交
255eddcc3d

+ 157 - 4
src/main/java/cn/ezhizao/project/business/controller/BizBeforeCheckoutVerifyController.java

@@ -54,6 +54,10 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
     private IBizOutsourceBalanceAccountService bizOutsourceBalanceAccountService;
     @Resource
     private IBizLotService bizLotService;
+    @Resource
+    private IBizLotTechnologicalProcessService bizLotTechnologicalProcessService;
+    @Resource
+    private IBizLotTechnologicalProcessDetailService bizLotTechnologicalProcessDetailService;
 
     /**
      * 查询报工列表
@@ -136,6 +140,8 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
         List<BizLot> bizLotList = bizLotService.query().in("id", dayworks.isEmpty() ? Collections.singletonList(0L) : dayworks.stream().map(BizDaywork::getLotId).collect(Collectors.toList())).list();
         List<BizTechnologicalProcess> bizTechnologicalProcesses = bizTechnologicalProcessService.query().in("id", dayworks.isEmpty() ? Collections.singletonList(0L) : dayworks.stream().map(BizDaywork::getTechnologicalProcessId).collect(Collectors.toList())).list();
         List<BizTechnologicalProcessDetail> bizTechnologicalProcessDetails = bizTechnologicalProcessDetailService.query().in("technological_process_id", bizTechnologicalProcesses.isEmpty() ? Collections.singletonList(0L) : bizTechnologicalProcesses.stream().map(BizTechnologicalProcess::getId).collect(Collectors.toList())).list();
+        List<BizLotTechnologicalProcess> bizLotTechnologicalProcesses = bizLotTechnologicalProcessService.query().in("id", dayworks.isEmpty() ? Collections.singletonList(0L) : dayworks.stream().map(BizDaywork::getTechnologicalProcessId).collect(Collectors.toList())).list();
+        List<BizLotTechnologicalProcessDetail> bizLotTechnologicalProcessDetails = bizLotTechnologicalProcessDetailService.query().in("lot_technological_process_id", bizLotTechnologicalProcesses.isEmpty() ? Collections.singletonList(0L) : bizLotTechnologicalProcesses.stream().map(BizLotTechnologicalProcess::getId).collect(Collectors.toList())).list();
         List<BizFurnaceNoInfo> furnaceNoInfos = bizFurnaceNoInfoService.query().in("daywork_id", dayworks.isEmpty() ? Collections.singletonList(0L) : dayworks.stream().map(BizDaywork::getId).collect(Collectors.toList())).list();
         List<BizProduct> bizProducts = bizProductService.query().in("id", inspections.isEmpty() ? Collections.singletonList(0L) : inspections.stream().map(BizProcessInspecion::getProductId).collect(Collectors.toList())).list();
         List<BizReturnReceiptDetail> bizReturnReceiptDetails = bizReturnReceiptDetailService.query().in("outsource_detail_id", bizOutsourcedOrderDetails.isEmpty() ? Collections.singletonList(0L) : bizOutsourcedOrderDetails.stream().map(BizOutsourcedOrderDetail::getId).collect(Collectors.toList())).list();
@@ -177,9 +183,11 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
                 List<BizReturnReceiptDetail> receiptDetails = bizReturnReceiptDetails.stream().filter(b -> b.getOutsourceDetailId().equals(bizOutsourcedOrderDetail.getId())).collect(Collectors.toList());
                 BizTechnologicalProcess process = bizTechnologicalProcesses.stream().filter(b -> b.getId().equals(bizDaywork.getTechnologicalProcessId())).findFirst().orElse(new BizTechnologicalProcess());
                 List<BizTechnologicalProcessDetail> processDetails = bizTechnologicalProcessDetails.stream().filter(b -> b.getTechnologicalProcessId().equals(process.getId())).sorted(Comparator.comparing(BizTechnologicalProcessDetail::getProcessStepNumber)).collect(Collectors.toList());
+                BizLotTechnologicalProcess lotProcess = bizLotTechnologicalProcesses.stream().filter(b -> b.getId().equals(bizDaywork.getTechnologicalProcessId())).findFirst().orElse(new BizLotTechnologicalProcess());
+                List<BizLotTechnologicalProcessDetail> lotProcessDetails = bizLotTechnologicalProcessDetails.stream().filter(b -> b.getLotTechnologicalProcessId().equals(lotProcess.getId())).sorted(Comparator.comparing(BizLotTechnologicalProcessDetail::getProcessStepNumber)).collect(Collectors.toList());
                 List<BizDayworkItem> items = bizDayworkItems.stream().filter(b -> b.getOutsourceDetailId().equals(bizOutsourcedOrderDetail.getId())).collect(Collectors.toList());
                 List<BizSupplierProductProcess> supplierProductProcesses = bizSupplierProductProcesses.stream().filter(b -> b.getSupplierId().equals(bizSupplier.getId()) && b.getProductId().equals(bizProduct.getId())).collect(Collectors.toList());
-                addList.addAll(getBalanceAccounts(l, bizOutsourcedOrder, bizSupplier, bizOutsourcedOrderDetail, detailProcesses, bizDaywork, bizProduct, furnaceNoInfo, receiptDetails, bizProcessInspecion, process, processDetails, items, lot, supplierProductProcesses));
+                addList.addAll(bizDaywork.getIsAmend().equals(1) || bizDaywork.getIsWasteRecycling().equals(1L) ? getBalanceAccounts(l, bizOutsourcedOrder, bizSupplier, bizOutsourcedOrderDetail, detailProcesses, bizDaywork, bizProduct, furnaceNoInfo, receiptDetails, bizProcessInspecion, lotProcess, lotProcessDetails, items, lot, supplierProductProcesses) : getBalanceAccounts(l, bizOutsourcedOrder, bizSupplier, bizOutsourcedOrderDetail, detailProcesses, bizDaywork, bizProduct, furnaceNoInfo, receiptDetails, bizProcessInspecion, process, processDetails, items, lot, supplierProductProcesses));
             });
 //            System.out.println("184: " + addList.size());
             List<Long> outsourceOrderIds = addList.stream().map(BizOutsourceBalanceAccount::getOutsourceOrderId).collect(Collectors.toList());
@@ -298,9 +306,9 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
         detailProcesses.forEach(v -> {
             BizReturnReceiptDetail receiptDetail = receiptDetails.stream().filter(b -> b.getOutsourceDetailId().equals(v.getDetailId()) && b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizReturnReceiptDetail());
             BizDayworkItem item = items.stream().filter(b -> b.getOutsourceDetailId().equals(v.getDetailId()) && b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizDayworkItem());
-            System.out.println("301 daywork_item_id" + item.getId());
-            System.out.println("302 outsource_detail_id" + v.getDetailId());
-            System.out.println("303 process_id" + v.getProcessId());
+//            System.out.println("301 daywork_item_id" + item.getId());
+//            System.out.println("302 outsource_detail_id" + v.getDetailId());
+//            System.out.println("303 process_id" + v.getProcessId());
             BizTechnologicalProcessDetail bizTechnologicalProcessDetail = technologicalProcessDetails.stream().filter(b -> b.getProcessStepNumber().equals(v.getProcessStepNumber())).findFirst().orElse(new BizTechnologicalProcessDetail());
             BizSupplierProductProcess supplierProductProcess = supplierProductProcesses.stream().filter(b -> b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizSupplierProductProcess());
             BizOutsourceBalanceAccount balanceAccount = new BizOutsourceBalanceAccount();
@@ -440,7 +448,152 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
         return addList;
     }
 
+    private List<BizOutsourceBalanceAccount> getBalanceAccounts(BizOutsourceBalanceAccount l, BizOutsourcedOrder bizOutsourcedOrder, BizSupplier bizSupplier, BizOutsourcedOrderDetail bizOutsourcedOrderDetail, List<BizOutsourcedOrderDetailProcess> detailProcesses, BizDaywork bizDaywork, BizProduct bizProduct, BizFurnaceNoInfo furnaceNoInfo, List<BizReturnReceiptDetail> receiptDetails, BizProcessInspecion bizProcessInspecion, BizLotTechnologicalProcess bizTechnologicalProcess, List<BizLotTechnologicalProcessDetail> technologicalProcessDetails, List<BizDayworkItem> items, BizLot lot, List<BizSupplierProductProcess> supplierProductProcesses) {
+        List<BizOutsourceBalanceAccount> addList = new ArrayList<>();
+        detailProcesses.forEach(v -> {
+            BizReturnReceiptDetail receiptDetail = receiptDetails.stream().filter(b -> b.getOutsourceDetailId().equals(v.getDetailId()) && b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizReturnReceiptDetail());
+            BizDayworkItem item = items.stream().filter(b -> b.getOutsourceDetailId().equals(v.getDetailId()) && b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizDayworkItem());
+//            System.out.println("301 daywork_item_id" + item.getId());
+//            System.out.println("302 outsource_detail_id" + v.getDetailId());
+//            System.out.println("303 process_id" + v.getProcessId());
+            BizLotTechnologicalProcessDetail bizTechnologicalProcessDetail = technologicalProcessDetails.stream().filter(b -> b.getProcessStepNumber().equals(v.getProcessStepNumber())).findFirst().orElse(new BizLotTechnologicalProcessDetail());
+            BizSupplierProductProcess supplierProductProcess = supplierProductProcesses.stream().filter(b -> b.getProcessId().equals(v.getProcessId())).findFirst().orElse(new BizSupplierProductProcess());
+            BizOutsourceBalanceAccount balanceAccount = new BizOutsourceBalanceAccount();
+            balanceAccount.setProcessInspectionId(l.getProcessInspectionId());
+            balanceAccount.setRawMaterialCode(furnaceNoInfo.getRawMaterialCode());
+            balanceAccount.setSupplierCode(bizSupplier.getCode());
+            balanceAccount.setSupplierName(bizSupplier.getName());
+            balanceAccount.setOutsourceOrderDetailId(bizOutsourcedOrderDetail.getId());
+            balanceAccount.setTenantId(getLoginUser().getTenantId());
+            balanceAccount.setSupplierId(bizSupplier.getId());
+            balanceAccount.setCurrency("RMB");
+            balanceAccount.setType(l.getBizMaterialBase().getType());
+            balanceAccount.setAuditDate(new Date());
+            balanceAccount.setReturnReceiptId(receiptDetail.getMasterId());
+            balanceAccount.setReturnReceiptDetailId(receiptDetail.getId());
+            balanceAccount.setDayworkId(bizDaywork.getId());
+            balanceAccount.setDayworkItemId(item.getId());
+            balanceAccount.setSettlementType(bizOutsourcedOrder.getSettlementType());
+            balanceAccount.setLotId(bizDaywork.getLotId());
+            balanceAccount.setLotCode(bizDaywork.getLotCode());
+            balanceAccount.setProductId(bizProduct.getId());
+            balanceAccount.setProductDescription(bizProduct.getDescription());
+            balanceAccount.setProductCode(bizProduct.getProductCode());
+            balanceAccount.setTechnologicalProcessId(bizTechnologicalProcess.getId());
+            balanceAccount.setTechnologyVersion(bizTechnologicalProcess.getTechnologyVersion());
+            balanceAccount.setTechnologicalProcessDetailId(bizTechnologicalProcessDetail.getId());
+            balanceAccount.setProcessId(v.getProcessId());
+            balanceAccount.setProcessStepNumber(v.getProcessStepNumber());
+            balanceAccount.setProcessAlias(v.getProcessAlias());
+            balanceAccount.setProcessCode(v.getProcessCode());
+            balanceAccount.setOutsourceOrderDetailProcessId(v.getId());
+            balanceAccount.setOutsourceOrderId(bizOutsourcedOrder.getId());
+            // 产品数量
+            balanceAccount.setProductNum(lot.getProductionQuantity());
+            // 批次投产数量
+            balanceAccount.setProductionNum(lot.getProductionQuantity());
+            // 外协发出数量
+            balanceAccount.setOutputNum(bizOutsourcedOrderDetail.getProductNum());
+            // 收回审核数量
+            balanceAccount.setReceiptNum(receiptDetail.getAuditNum());
+            // 工序单价
+            balanceAccount.setProcessPrice(supplierProductProcess.getPrice());
+            // 材料单价 inv10100.zjunprc
+            balanceAccount.setMaterialPrice(l.getBizMaterialBase().getZjunprc());
+            // 销售单价 inc10100.unprc
+            balanceAccount.setSalePrice(l.getProduct().getUnprc());
+            // 实投料量 假设为直条料或圆盘料或半成品料
+            if (l.getBizMaterialBase().getXzcode().equals("11") || l.getBizMaterialBase().getXzcode().equals("12") || l.getBizMaterialBase().getType().equals("2")) {
+                // 计算公式 实际投料直径 / 2 * 实际投料直径 / 2 * 3.14 * 原料密度 / 1000 * (产品长度  + 公差长度【bom30101.gccd(材料基本信息表)按cpart产品编码取,生产计划随时变动结算时实时获取】) / 原材料利用率 / 10000
+                BigDecimal length = bizProduct.getLenght();
+                BigDecimal gccd = l.getBizMaterialBaseInfo().getGccd();
+                BigDecimal stll = l.getBizMaterialBase().getYzj().divide(BigDecimal.valueOf(2), 6, RoundingMode.HALF_UP).pow(2).multiply(BigDecimal.valueOf(3.14)).multiply(l.getBizMaterialBase().getDensity().divide(BigDecimal.valueOf(1000), 6, RoundingMode.HALF_UP)).multiply(length.add(gccd)).divide(l.getBizMaterialBaseInfo().getUtrate() == null || l.getBizMaterialBaseInfo().getUtrate().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : l.getBizMaterialBaseInfo().getUtrate(), 6, RoundingMode.HALF_UP).divide(BigDecimal.valueOf(10000), 6, RoundingMode.HALF_UP).setScale(4, RoundingMode.HALF_UP);
+                l.setActualInventory(stll);
+            } else {
+                // 其他 inc10100.stqty
+                balanceAccount.setActualInventory(l.getProduct().getStqty());
+            }
+            // 料损数量 99984与99024无料损数量
+            if (bizSupplier.getCode().equals("99984") || bizSupplier.getCode().equals("99024")) {
+                balanceAccount.setMaterialLoss(0);
+            } else {
+                // 其他外协厂[料损数量]计算公式=发出数量 * (1 - 料损率 / 1000) - 合格数量,结果取整 【料损率从外协厂基础配置表中读】
+                Integer materialLoss = BigDecimal.valueOf(bizOutsourcedOrderDetail.getProductNum()).multiply(BigDecimal.ONE.subtract(bizSupplier.getLossLimit().divide(BigDecimal.valueOf(1000), 6, RoundingMode.HALF_UP))).subtract(BigDecimal.valueOf(receiptDetail.getAuditNum())).setScale(0, RoundingMode.HALF_UP).intValue();
+                balanceAccount.setMaterialLoss(materialLoss);
+            }
 
+//            System.out.println("263 getMaterialLoss: " + l.getMaterialLoss());
+            balanceAccount.setMaterialLoss(balanceAccount.getMaterialLoss() == null || balanceAccount.getMaterialLoss() < 0 ? 0 : balanceAccount.getMaterialLoss());
+//            System.out.println("265 getMaterialLoss: " + l.getMaterialLoss());
+
+            // 表面表示是否有表面处理
+            balanceAccount.setSurfaceTreatment(l.getSupplier().getSurfaceTreatment());
+            balanceAccount.setCarrierNum(bizOutsourcedOrderDetail.getNewCarrierCount());
+            int sort = technologicalProcessDetails.indexOf(technologicalProcessDetails.stream().filter(t -> t.getProcessStepNumber().equals(v.getProcessStepNumber())).findFirst().orElse(new BizLotTechnologicalProcessDetail()));
+            balanceAccount.setProcessSort(sort);
+            balanceAccount.setReturnDate(receiptDetail.getFormDate());
+            balanceAccount.setReturnNo(receiptDetail.getFormCode());
+            balanceAccount.setOutsourceNo(bizOutsourcedOrder.getFormCode());
+            balanceAccount.setFurnaceNum(1);
+            balanceAccount.setCheckDate(bizProcessInspecion.getEndTime());
+            balanceAccount.setMaterialLossRatio(bizSupplier.getLossLimit());
+            balanceAccount.setShape(l.getBizMaterialBase().getXzcode());
+            balanceAccount.setDensity(l.getBizMaterialBase().getDensity());
+            balanceAccount.setWastePriceCategory(l.getSupplier().getWastePriceCategory());
+            balanceAccount.setTaxRate(BigDecimal.valueOf(l.getSupplier().getTaxRatio()));
+            balanceAccount.setTolerance(l.getBizMaterialBase().getGccd());
+            balanceAccount.setMaterialDiameter(l.getBizMaterialBase().getYzj());
+            balanceAccount.setInspectionNo(bizProcessInspecion.getOutsourcedInspectionNo());
+
+            // 废品单价
+            if (l.getSupplier().getSurfaceTreatment().equals("N")){
+                // 没表面处理时
+                if (l.getSupplier().getWastePriceCategory().equals("11")) {
+                    // 废品价计算类别='11' round(实际投料量 * 原料最近采购单价[inv10100.zjunprc实时变更],4)
+                    balanceAccount.setWastePrice(l.getActualInventory().multiply(l.getBizMaterialBase().getZjunprc()).setScale(4, RoundingMode.HALF_UP));
+                } else if (l.getSupplier().getWastePriceCategory().equals("12") && l.getSupplier().getCode().equals("99997") && bizProduct.getProductCode().equals("911110028")) {
+                    // 废品价计算类别='12' 外协厂编码='99997' ls_cpart(产品编码)='911110028' 废品加工单价=round(原料最近采购单价 ,4)
+                    balanceAccount.setWastePrice(l.getBizMaterialBase().getZjunprc().setScale(4, RoundingMode.HALF_UP));
+                } else if (l.getSupplier().getWastePriceCategory().equals("12") && l.getSupplier().getCode().equals("99980") && bizProduct.getProductCode().equals("911100538")) {
+                    // 废品价计算类别='12' 外协厂编码='99980' ls_cpart(产品编码)='911100538' 废品加工单价=round(原料最近采购单价 ,4)
+                    balanceAccount.setWastePrice(l.getBizMaterialBase().getZjunprc().setScale(4, RoundingMode.HALF_UP));
+                } else if (l.getSupplier().getWastePriceCategory().equals("24")) {
+                    //  废品价计算类别='24' then 废品加工单价=round(加工单价[外协厂结算员填写的],4)
+                    balanceAccount.setWastePrice(l.getProcessPrice().setScale(4, RoundingMode.HALF_UP));
+                }
+//                System.out.println(l.getSupplier().getWastePriceCategory());
+//                System.out.println("303 getMaterialLossl: "+ balanceAccount.getMaterialLoss());
+//                System.out.println(l.getWastePrice());
+//                System.out.println(l.getSupplier().getTaxRatio());
+                BigDecimal wastePrice = balanceAccount.getWastePrice() == null ? BigDecimal.ZERO : balanceAccount.getWastePrice();
+//                System.out.println(wastePrice);
+                // 扣料金额 round(料损数量 * 废品加工单价 * 120/100.00 * 1.13【*税率】,4)//(1 + 税率(取自sfc10100.taxsl) /100.00 ),2)
+                balanceAccount.setMaterialLossAmount(BigDecimal.valueOf(balanceAccount.getMaterialLoss()).multiply(wastePrice.multiply(BigDecimal.valueOf(120).divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).multiply(BigDecimal.ONE.add(BigDecimal.valueOf(l.getSupplier().getTaxRatio()).divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(2, RoundingMode.HALF_UP));
+            } else {
+                // 有时
+                if(l.getSupplier().getWastePriceCategory().equals("21")) {
+                    //  废品价计算类别='21' 废品加工单价=round(产品单价(inc10100.unprc) -  加工单价 ,4)
+                    balanceAccount.setWastePrice(l.getProduct().getUnprc().subtract(l.getProcessPrice()).setScale(4, RoundingMode.HALF_UP));
+                } else if (l.getSupplier().getWastePriceCategory().equals("22")) {
+                    //  废品价计算类别='22' round(加工单价  * 2 ,4)
+                    balanceAccount.setWastePrice(l.getProcessPrice().multiply(BigDecimal.valueOf(2)).setScale(4, RoundingMode.HALF_UP));
+                } else if (l.getSupplier().getWastePriceCategory().equals("23")) {
+                    //  废品价计算类别='23' round(加工单价  * 3 ,4)
+                    balanceAccount.setWastePrice(l.getProcessPrice().multiply(BigDecimal.valueOf(3)).setScale(4, RoundingMode.HALF_UP));
+                }
+                // 扣料金额 round(料损数量 * 废品加工单价 * 1.13【*税率】 ,4) // (1 + 税率 /100.00 ),2)
+                balanceAccount.setMaterialLossAmount(BigDecimal.valueOf(l.getMaterialLoss()).multiply(l.getWastePrice().multiply(BigDecimal.ONE.add(BigDecimal.valueOf(l.getSupplier().getTaxRatio()).divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP)))).setScale(2, RoundingMode.HALF_UP));
+            }
+            // 利用率
+            balanceAccount.setUtilizationRatio(l.getBizMaterialBaseInfo().getUtrate());
+            // 长度是产品长度
+            balanceAccount.setLength(l.getProduct().getLenght());
+            balanceAccount.setSupplier(l.getSupplier());
+
+            addList.add(balanceAccount);
+        });
+        return addList;
+    }
     private void delBalanceCheckout(List<BizProcessInspecion> inspections) {
         // 删除结算记录
         List<BizOutsourceBalanceAccount> balanceAccounts = bizOutsourceBalanceAccountService.query().in("process_inspection_id", inspections.isEmpty()? Collections.singletonList(0L): inspections.stream().map(BizProcessInspecion::getId).collect(Collectors.toList())).list();