ezhizao_zx 10 달 전
부모
커밋
956e037ba2

+ 100 - 12
src/main/java/cn/ezhizao/project/business/controller/BizBeforeCheckoutVerifyController.java

@@ -181,7 +181,92 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
                 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));
             });
-            System.out.println("184: " + addList.size());
+//            System.out.println("184: " + addList.size());
+            List<Long> outsourceOrderIds = addList.stream().map(BizOutsourceBalanceAccount::getOutsourceOrderId).collect(Collectors.toList());
+
+            // 判断假设是按支结算则直接算,假设是按炉结算
+            // 应得金额
+            // 实得金额 = round((应得金额-其他扣款+差补额-运费-料扣金额/(1+税率/100), 4)
+            // 含税金额 = round((应得金额-其他扣款+差补额-运费-料扣金额, 4)
+            // 运费 round(运费单价【sfc10100.yfprc】 * 发出箱数 , 4)
+            if (outsourceOrderIds.size() == 1) {
+                BizOutsourcedOrder bizOutsourcedOrder = outsourcedOrder.get(0);
+                if (bizOutsourcedOrder.getSettlementType().equals("1")) {
+                    // 按支结算
+                    addList.forEach(l -> {
+                        // 是否有表面处理
+                        if (l.getSupplier().getSurfaceTreatment().equals("N")) {
+                            if (l.getSupplierCode().equals("99024")) {
+                                if (l.getProcessCode().equals("99000")) {
+                                    l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                } else {
+                                    l.setPlanAmount(BigDecimal.valueOf(l.getOutputNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                }
+                            } else {
+                                l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                            }
+                        } else {
+                            if (l.getSupplierCode().equals("99024")) {
+                                l.setPlanAmount(BigDecimal.valueOf(l.getOutputNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                            } else {
+                                l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                            }
+                        }
+                    });
+                } else {
+                    // 按炉结算 炉数*加工单价* (1.00 + 税率 /100.00 )
+                    BizOutsourceBalanceAccount item = addList.get(0);
+                    item.setPlanAmount(BigDecimal.ONE.multiply(item.getSupplier().getFreightPrice()).multiply(BigDecimal.ONE.add(item.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                }
+                bizOutsourcedOrderDetails.forEach(l -> {
+                   BizOutsourceBalanceAccount item = addList.stream().filter(e -> e.getOutsourceOrderDetailId().equals(l.getId())).collect(Collectors.toList()).get(0);
+                   item.setFreightAmount(item.getSupplier().getFreightDeductUnitPrice().multiply(BigDecimal.valueOf(item.getCarrierNum())));
+                });
+            } else {
+                // 八成用不上,但是假设出现多选审核就可能用得上了。
+                outsourcedOrder.forEach(t -> {
+                    if (t.getSettlementType().equals("1")) {
+                        // 按支结算
+                        addList.stream().filter(e -> e.getOutsourceOrderId().equals(t.getId())).forEach(l -> {
+                            if (l.getSupplier().getSurfaceTreatment().equals("N")) {
+                                if (l.getSupplierCode().equals("99024")) {
+                                    if (l.getProcessCode().equals("99000")) {
+                                        l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                    } else {
+                                        l.setPlanAmount(BigDecimal.valueOf(l.getOutputNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                    }
+                                } else {
+                                    l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                }
+                            } else {
+                                if (l.getSupplierCode().equals("99024")) {
+                                    l.setPlanAmount(BigDecimal.valueOf(l.getOutputNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                } else {
+                                    l.setPlanAmount(BigDecimal.valueOf(l.getReceiptNum()).multiply(l.getProcessPrice()).multiply(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                                }
+                            }
+                        });
+                    } else {
+                        // 按炉结算 round(炉数 * 加工单价 * (1.00 + 税率 /100.00 ),4)
+                        BizOutsourceBalanceAccount item = addList.stream().filter(e -> e.getOutsourceOrderId().equals(t.getId())).collect(Collectors.toList()).get(0);
+                        item.setPlanAmount(BigDecimal.ONE.multiply(item.getSupplier().getFreightPrice()).multiply(BigDecimal.ONE.add(item.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP))).setScale(4, RoundingMode.HALF_UP));
+                    }
+                });
+                bizOutsourcedOrderDetails.forEach(l -> {
+                    BizOutsourceBalanceAccount item = addList.stream().filter(e -> e.getOutsourceOrderDetailId().equals(l.getId())).collect(Collectors.toList()).get(0);
+                    item.setFreightAmount(item.getSupplier().getFreightDeductUnitPrice().multiply(BigDecimal.valueOf(item.getCarrierNum())));
+                });
+            }
+            addList.forEach(l -> {
+                BigDecimal planAmount = l.getPlanAmount() == null ? BigDecimal.ZERO : l.getPlanAmount();
+                BigDecimal otherCost = l.getOtherCost() == null ? BigDecimal.ZERO : l.getOtherCost();
+                BigDecimal fillDifferencePrice = l.getFillDifferencePrice() == null ? BigDecimal.ZERO : l.getFillDifferencePrice();
+                BigDecimal freightAmount = l.getFreightAmount() == null ? BigDecimal.ZERO : l.getFreightAmount();
+                BigDecimal materialLossAmount = l.getMaterialLossAmount() == null ? BigDecimal.ZERO : l.getMaterialLossAmount();
+                BigDecimal taxAmount = planAmount.subtract(otherCost).add(fillDifferencePrice).subtract(freightAmount).subtract(materialLossAmount);
+                l.setAcutalAmount(taxAmount.divide(BigDecimal.ONE.add(l.getTaxRate().divide(BigDecimal.valueOf(100), 6, RoundingMode.HALF_UP)), 4, RoundingMode.HALF_UP));
+                l.setTaxAmount(taxAmount.setScale(4, RoundingMode.HALF_UP));
+            });
             bizOutsourceBalanceAccountService.saveBatch(addList);
         } else {
             throw new RuntimeException(jsonObject.getStr("msg"));
@@ -233,6 +318,7 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
             balanceAccount.setProcessAlias(v.getProcessAlias());
             balanceAccount.setProcessCode(v.getProcessCode());
             balanceAccount.setOutsourceOrderDetailProcessId(v.getId());
+            balanceAccount.setOutsourceOrderId(bizOutsourcedOrder.getId());
             // 产品数量
             balanceAccount.setProductNum(lot.getProductionQuantity());
             // 批次投产数量
@@ -243,7 +329,10 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
             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
@@ -264,9 +353,9 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
                 balanceAccount.setMaterialLoss(materialLoss);
             }
 
-            System.out.println("263 getMaterialLoss: " + l.getMaterialLoss());
+//            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());
+//            System.out.println("265 getMaterialLoss: " + l.getMaterialLoss());
 
             // 表面表示是否有表面处理
             balanceAccount.setSurfaceTreatment(l.getSupplier().getSurfaceTreatment());
@@ -304,7 +393,7 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
                     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("303 getMaterialLossl: "+ balanceAccount.getMaterialLoss());
 //                System.out.println(l.getWastePrice());
 //                System.out.println(l.getSupplier().getTaxRatio());
                 BigDecimal wastePrice = balanceAccount.getWastePrice() == null ? BigDecimal.ZERO : balanceAccount.getWastePrice();
@@ -326,13 +415,12 @@ public class BizBeforeCheckoutVerifyController extends BaseController {
                 // 扣料金额 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;

+ 5 - 1
src/main/java/cn/ezhizao/project/business/domain/BizOutsourceBalanceAccount.java

@@ -43,7 +43,11 @@ public class BizOutsourceBalanceAccount extends BaseEntity
     private String supplierCode;
 
     /** 外协单明细外键 */
-    @ApiModelProperty(value = "外协商code")
+    @ApiModelProperty(value = "外协单外键")
+    private Long outsourceOrderId;
+
+    /** 外协单明细外键 */
+    @ApiModelProperty(value = "外协单明细外键")
     private Long outsourceOrderDetailId;
 
     /** 外协明细工序外键 */

+ 5 - 0
src/main/java/cn/ezhizao/project/business/domain/BizSupplier.java

@@ -79,4 +79,9 @@ public class BizSupplier extends BaseEntity {
     @Excel(name = "Y有表面处理按售价-工序单价计算N无表面处理工序")
     @ApiModelProperty(value = "Y有表面处理按售价-工序单价计算N无表面处理工序")
     private String surfaceTreatment;
+
+    /** 运费扣款单价 */
+    @Excel(name = "运费扣款单价")
+    @ApiModelProperty(value = "运费扣款单价")
+    private BigDecimal freightDeductUnitPrice;
 }