diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java index 6f17d25e..1146e450 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java @@ -170,7 +170,6 @@ public class SalesEstimateController extends BaseController - /** * 加载新增销售估价-工程 子表物料选择弹窗 */ @@ -197,10 +196,8 @@ public class SalesEstimateController extends BaseController - - /** - * 新增Bom销售估价-采购 + * 新增采购成本 销售估价-采购 */ @GetMapping("/purchaseAdd/{salesEstimateId}") public String purchaseAdd(@PathVariable("salesEstimateId") Long salesEstimateId, ModelMap map) @@ -227,6 +224,33 @@ public class SalesEstimateController extends BaseController } + /** + * 新增经营成本 销售估价-总经理 + */ + @GetMapping("/ceoAdd/{salesEstimateId}") + public String ceoAdd(@PathVariable("salesEstimateId") Long salesEstimateId, ModelMap map) + { + SalesEstimate salesEstimate = salesEstimateService.selectSalesEstimateById(salesEstimateId); + map.put("salesEstimate", salesEstimate); + SalesEstimateDetailVo salesEstimateDetailVo = salesEstimateService.getSalesEstimateDetailVo(); + map.put("salesEstimateDetailVo",salesEstimateDetailVo); + return prefix + "/ceoAdd"; + } + + + + /** + * 修改保存销售估价-总经理 + */ + @RequiresPermissions("sales:estimate:ceoAdd") + @Log(title = "销售估价", businessType = BusinessType.UPDATE) + @PostMapping("/ceoAdd") + @ResponseBody + public AjaxResult ceoAddSave(@RequestBody SalesEstimate salesEstimate) + { + return toAjax(salesEstimateService.ceoAddSalesEstimate(salesEstimate)); + } + /** * 加载新增销售估价 物料选择弹窗 @@ -238,7 +262,6 @@ public class SalesEstimateController extends BaseController } - /** * 新增销售估价 物料选择 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/SalesEstimateDetailMaterialVo.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/SalesEstimateDetailMaterialVo.java index b3786444..0c6030f8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/SalesEstimateDetailMaterialVo.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/domain/VO/SalesEstimateDetailMaterialVo.java @@ -37,4 +37,26 @@ public class SalesEstimateDetailMaterialVo extends SalesEstimateDetailMaterial { /** 含税经营成本(RMB) */ private BigDecimal taxOperatingCosts; + + /** 利润率 */ + private BigDecimal profitRate; + + /** A挡利润率 */ + private BigDecimal aProfitRate; + + /** B挡利润率 */ + private BigDecimal bProfitRate; + + /** C挡利润率 */ + private BigDecimal cProfitRate; + + /** D挡利润率 */ + private BigDecimal dProfitRate; + + /** E挡利润率 */ + private BigDecimal eProfitRate; + + /** F挡利润率 */ + private BigDecimal fProfitRate; + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java index 51c46d8e..ff6ae112 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java @@ -93,4 +93,11 @@ public interface ISalesEstimateService * @return */ int purchaseAddSalesEstimate(SalesEstimate salesEstimate); + + /** + * 总经理添加销售估价 + * @param salesEstimate + * @return + */ + int ceoAddSalesEstimate(SalesEstimate salesEstimate); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java index 0d377576..506cd440 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateDetailMaterialServiceImpl.java @@ -95,9 +95,12 @@ public class SalesEstimateDetailMaterialServiceImpl implements ISalesEstimateDet vo.setNoTaxLaborCosts(salesEstimateDetail.getNoTaxLaborCosts()); vo.setNoTaxManagesCosts(salesEstimateDetail.getNoTaxManagesCosts()); vo.setNoTaxOperatingCosts(salesEstimateDetail.getNoTaxOperatingCosts()); + vo.setTaxOperatingCosts(salesEstimateDetail.getTaxOperatingCosts()); vo.setNoTaxPromotionalCosts(salesEstimateDetail.getNoTaxPromotionalCosts()); vo.setNoTaxServiceCosts(salesEstimateDetail.getNoTaxServiceCosts()); vo.setNoTaxShippingCosts(salesEstimateDetail.getNoTaxShippingCosts()); + vo.setProfitRate(salesEstimateDetail.getProfitRate()); + } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java index cfc59d34..63257e2b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java @@ -1,5 +1,7 @@ package com.ruoyi.sales.service.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Date; import java.util.List; @@ -272,4 +274,229 @@ public class SalesEstimateServiceImpl implements ISalesEstimateService return salesEstimateMapper.updateSalesEstimate(salesEstimate); } + + /** + * 总经理添加销售估价 + * + * @param salesEstimate 销售估价 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int ceoAddSalesEstimate(SalesEstimate salesEstimate) { + String loginName = ShiroUtils.getLoginName(); // 获取当前登录用户的名称 + salesEstimate.setUpdateBy(loginName); // 设置更新人的信息 + salesEstimate.setUpdateTime(new Date()); // 设置更新时间 + salesEstimate.setEstimateStatus("3"); // 设置销售估价的状态 + + BigDecimal usdRate = salesEstimate.getUsdRate(); // 获取美元汇率 + List salesEstimateDetailList = salesEstimate.getSalesEstimateDetailList(); // 获取销售估价详情列表 + + for (SalesEstimateDetail salesEstimateDetail : salesEstimateDetailList) { // 遍历销售估价详情列表 + BigDecimal noTaxLaborCosts = salesEstimateDetail.getNoTaxLaborCosts(); // 获取不含税的人工成本 + BigDecimal noTaxPromotionalCosts = salesEstimateDetail.getNoTaxPromotionalCosts(); // 获取不含税的推广成本 + BigDecimal noTaxBusinessCosts = salesEstimateDetail.getNoTaxBusinessCosts(); // 获取不含税的业务成本 + BigDecimal noTaxManagesCosts = salesEstimateDetail.getNoTaxManagesCosts(); // 获取不含税的管理成本 + BigDecimal noTaxMaterialCosts = salesEstimateDetail.getNoTaxMaterialCosts(); // 获取不含税的物料成本 + BigDecimal profitRate = salesEstimateDetail.getProfitRate().divide(BigDecimal.valueOf(100)); // 获取利润率并转换为小数形式 + Long materialNum = salesEstimateDetail.getMaterialNum(); // 获取物料数量 + + // 计算不含税总经营成本 + BigDecimal noAllTaxOperatingCosts = calculateNoTaxOperatingCosts( + noTaxLaborCosts, noTaxPromotionalCosts, noTaxBusinessCosts, noTaxManagesCosts); + + // 计算含税总经营成本 + BigDecimal allTaxOperatingCosts = calculateTaxOperatingCosts(noAllTaxOperatingCosts); + + // 计算总含税物料成本 + BigDecimal taxMaterialCosts = calculateTaxMaterialCosts(noTaxMaterialCosts); + + List estimateDetailMaterialList = salesEstimate.getEstimateDetailMaterialList(); // 获取物料详情列表 + // 计算物料总不含税采购成本 + BigDecimal totalNoTaxPurchaseRmb = calculateTotalNoTaxPurchaseRmb(estimateDetailMaterialList); + // 计算物料总含税采购成本 + BigDecimal totalTaxPurchaseRmb = calculateTotalTaxPurchaseRmb(estimateDetailMaterialList); + + // 计算不含税经营成本(RMB),并保留两位小数 + BigDecimal noTaxOperatingCost = calculateNoTaxOperatingCost(totalNoTaxPurchaseRmb, noTaxMaterialCosts, noAllTaxOperatingCosts) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税经营成本(RMB),并保留两位小数 + BigDecimal taxOperatingCost = calculateTaxOperatingCost(totalTaxPurchaseRmb, taxMaterialCosts, allTaxOperatingCosts) + .setScale(2, RoundingMode.HALF_UP); + + // 计算不含税料号估价成本,并保留两位小数 + BigDecimal noTaxEstimateCost = calculateNoTaxEstimateCost(totalNoTaxPurchaseRmb, noAllTaxOperatingCosts, noTaxMaterialCosts) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税料号估价成本,并保留两位小数 + BigDecimal taxEstimateCost = calculateTaxEstimateCost(totalTaxPurchaseRmb, allTaxOperatingCosts, taxMaterialCosts) + .setScale(2, RoundingMode.HALF_UP); + + // 计算不含税单价(RMB),并保留两位小数 + BigDecimal noTaxUnitPriceRmb = calculateNoTaxUnitPriceRmb(noTaxEstimateCost, profitRate) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税单价(RMB),并保留两位小数 + BigDecimal taxUnitPriceRmb = calculateTaxUnitPriceRmb(taxEstimateCost, profitRate) + .setScale(2, RoundingMode.HALF_UP); + + // 计算不含税总价(RMB),并保留两位小数 + BigDecimal allNoTaxRmb = calculateAllNoTaxRmb(noTaxUnitPriceRmb, materialNum) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税总价(RMB),并保留两位小数 + BigDecimal allTaxRmb = calculateAllTaxRmb(taxUnitPriceRmb, materialNum) + .setScale(2, RoundingMode.HALF_UP); + + // 计算不含税单价(美元),并保留两位小数 + BigDecimal noTaxUnitPriceDollar = calculateNoTaxUnitPriceDollar(noTaxUnitPriceRmb, usdRate) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税单价(美元),并保留两位小数 + BigDecimal taxUnitPriceDollar = calculateTaxUnitPriceDollar(taxUnitPriceRmb, usdRate) + .setScale(2, RoundingMode.HALF_UP); + + // 计算不含税总价(美元),并保留两位小数 + BigDecimal allNoTaxDollar = calculateAllNoTaxDollar(noTaxUnitPriceDollar, materialNum) + .setScale(2, RoundingMode.HALF_UP); + // 计算含税总价(美元),并保留两位小数 + BigDecimal allTaxDollar = calculateAllTaxDollar(taxUnitPriceDollar, materialNum) + .setScale(2, RoundingMode.HALF_UP); + + // 更新 SalesEstimateDetail 对象中的值 + updateSalesEstimateDetail(salesEstimateDetail, + noTaxOperatingCost, taxOperatingCost, + noTaxUnitPriceRmb, taxUnitPriceRmb, + allNoTaxRmb, allTaxRmb, + noTaxUnitPriceDollar, taxUnitPriceDollar, + allNoTaxDollar, allTaxDollar); + + // 更新销售估价详情数据 + int updateSalesEstimateDetailResult = salesEstimateDetailMapper.updateSalesEstimateDetail(salesEstimateDetail); + if (updateSalesEstimateDetailResult <= 0) { + throw new BusinessException("更新销售估价详情数据失败"); + } + } + + // 更新销售估价数据 + return salesEstimateMapper.updateSalesEstimate(salesEstimate); + } + + // 计算不含税总经营成本 + private BigDecimal calculateNoTaxOperatingCosts(BigDecimal noTaxLaborCosts, BigDecimal noTaxPromotionalCosts, BigDecimal noTaxBusinessCosts, BigDecimal noTaxManagesCosts) { + return noTaxLaborCosts.add(noTaxPromotionalCosts).add(noTaxBusinessCosts).add(noTaxManagesCosts); + } + + // 计算含税总经营成本 + private BigDecimal calculateTaxOperatingCosts(BigDecimal noAllTaxOperatingCosts) { + return noAllTaxOperatingCosts.multiply(BigDecimal.valueOf(1.13)); + } + + // 计算总含税物料成本 + private BigDecimal calculateTaxMaterialCosts(BigDecimal noTaxMaterialCosts) { + return noTaxMaterialCosts.multiply(BigDecimal.valueOf(1.13)); + } + + // 计算物料总不含税采购成本 + private BigDecimal calculateTotalNoTaxPurchaseRmb(List estimateDetailMaterialList) { + BigDecimal totalNoTaxPurchaseRmb = BigDecimal.ZERO; + for (SalesEstimateDetailMaterial detailMaterial : estimateDetailMaterialList) { + BigDecimal noTaxPurchaseRmb = detailMaterial.getNoTaxPurchaseRmb(); // 获取不含税采购单价 + Long useNum = detailMaterial.getUseNum(); // 获取用量 + totalNoTaxPurchaseRmb = totalNoTaxPurchaseRmb.add(noTaxPurchaseRmb.multiply(new BigDecimal(useNum))); // 计算总不含税采购成本 + } + return totalNoTaxPurchaseRmb; + } + + // 计算物料总含税采购成本 + private BigDecimal calculateTotalTaxPurchaseRmb(List estimateDetailMaterialList) { + BigDecimal totalTaxPurchaseRmb = BigDecimal.ZERO; + for (SalesEstimateDetailMaterial detailMaterial : estimateDetailMaterialList) { + BigDecimal taxPurchaseRmb = detailMaterial.getTaxPurchaseRmb(); // 获取含税采购单价 + Long useNum = detailMaterial.getUseNum(); // 获取用量 + totalTaxPurchaseRmb = totalTaxPurchaseRmb.add(taxPurchaseRmb.multiply(new BigDecimal(useNum))); // 计算总含税采购成本 + } + return totalTaxPurchaseRmb; + } + + // 计算不含税经营成本(RMB) + private BigDecimal calculateNoTaxOperatingCost(BigDecimal totalNoTaxPurchaseRmb, BigDecimal noTaxMaterialCosts, BigDecimal noAllTaxOperatingCosts) { + return totalNoTaxPurchaseRmb.divide(noTaxMaterialCosts, 2, RoundingMode.HALF_UP) + .multiply(noAllTaxOperatingCosts); + } + + // 计算含税经营成本(RMB) + private BigDecimal calculateTaxOperatingCost(BigDecimal totalTaxPurchaseRmb, BigDecimal taxMaterialCosts, BigDecimal allTaxOperatingCosts) { + return totalTaxPurchaseRmb.divide(taxMaterialCosts, 2, RoundingMode.HALF_UP) + .multiply(allTaxOperatingCosts); + } + + // 计算不含税料号估价成本 + private BigDecimal calculateNoTaxEstimateCost(BigDecimal totalNoTaxPurchaseRmb, BigDecimal noAllTaxOperatingCosts, BigDecimal noTaxMaterialCosts) { + return totalNoTaxPurchaseRmb.add(noAllTaxOperatingCosts) + .add(totalNoTaxPurchaseRmb.divide(noTaxMaterialCosts, 2, RoundingMode.HALF_UP) + .multiply(noAllTaxOperatingCosts)); + } + + // 计算含税料号估价成本 + private BigDecimal calculateTaxEstimateCost(BigDecimal totalTaxPurchaseRmb, BigDecimal allTaxOperatingCosts, BigDecimal taxMaterialCosts) { + return totalTaxPurchaseRmb.add(allTaxOperatingCosts) + .add(totalTaxPurchaseRmb.divide(taxMaterialCosts, 2, RoundingMode.HALF_UP) + .multiply(allTaxOperatingCosts)); + } + + // 计算不含税单价(RMB) + private BigDecimal calculateNoTaxUnitPriceRmb(BigDecimal noTaxEstimateCost, BigDecimal profitRate) { + return noTaxEstimateCost.divide(BigDecimal.ONE.subtract(profitRate), 2, RoundingMode.HALF_UP); + } + + // 计算含税单价(RMB) + private BigDecimal calculateTaxUnitPriceRmb(BigDecimal taxEstimateCost, BigDecimal profitRate) { + return taxEstimateCost.divide(BigDecimal.ONE.subtract(profitRate), 2, RoundingMode.HALF_UP); + } + + // 计算不含税总价(RMB) + private BigDecimal calculateAllNoTaxRmb(BigDecimal noTaxUnitPriceRmb, Long materialNum) { + return noTaxUnitPriceRmb.multiply(new BigDecimal(materialNum)); + } + + // 计算含税总价(RMB) + private BigDecimal calculateAllTaxRmb(BigDecimal taxUnitPriceRmb, Long materialNum) { + return taxUnitPriceRmb.multiply(new BigDecimal(materialNum)); + } + + // 计算不含税单价(美元) + private BigDecimal calculateNoTaxUnitPriceDollar(BigDecimal noTaxUnitPriceRmb, BigDecimal usdRate) { + return noTaxUnitPriceRmb.divide(usdRate, 2, RoundingMode.HALF_UP); + } + + // 计算含税单价(美元) + private BigDecimal calculateTaxUnitPriceDollar(BigDecimal taxUnitPriceRmb, BigDecimal usdRate) { + return taxUnitPriceRmb.divide(usdRate, 2, RoundingMode.HALF_UP); + } + + // 计算不含税总价(美元) + private BigDecimal calculateAllNoTaxDollar(BigDecimal noTaxUnitPriceDollar, Long materialNum) { + return noTaxUnitPriceDollar.multiply(new BigDecimal(materialNum)); + } + + // 计算含税总价(美元) + private BigDecimal calculateAllTaxDollar(BigDecimal taxUnitPriceDollar, Long materialNum) { + return taxUnitPriceDollar.multiply(new BigDecimal(materialNum)); + } + + // 更新 SalesEstimateDetail 对象中的值 + private void updateSalesEstimateDetail(SalesEstimateDetail salesEstimateDetail, + BigDecimal noTaxOperatingCost, BigDecimal taxOperatingCost, + BigDecimal noTaxUnitPriceRmb, BigDecimal taxUnitPriceRmb, + BigDecimal allNoTaxRmb, BigDecimal allTaxRmb, + BigDecimal noTaxUnitPriceDollar, BigDecimal taxUnitPriceDollar, + BigDecimal allNoTaxDollar, BigDecimal allTaxDollar) { + salesEstimateDetail.setNoTaxOperatingCosts(noTaxOperatingCost); + salesEstimateDetail.setTaxOperatingCosts(taxOperatingCost); + salesEstimateDetail.setNoTaxRmb(noTaxUnitPriceRmb); + salesEstimateDetail.setTaxRmb(taxUnitPriceRmb); + salesEstimateDetail.setAllNoTaxRmb(allNoTaxRmb); + salesEstimateDetail.setAllTaxRmb(allTaxRmb); + salesEstimateDetail.setNoTaxDollar(noTaxUnitPriceDollar); + salesEstimateDetail.setTaxDollar(taxUnitPriceDollar); + salesEstimateDetail.setAllNoTaxDollar(allNoTaxDollar); + salesEstimateDetail.setAllTaxDollar(allTaxDollar); + } } diff --git a/ruoyi-admin/src/main/resources/templates/sales/estimate/ceoAdd.html b/ruoyi-admin/src/main/resources/templates/sales/estimate/ceoAdd.html new file mode 100644 index 00000000..77dbf266 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sales/estimate/ceoAdd.html @@ -0,0 +1,884 @@ + + + + + + + +
+
+ +
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
+ + % +
+
+
+ +
+ +
+ +
+
+ +
+

计算

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html b/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html index bcd3e09a..f073a98c 100644 --- a/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html +++ b/ruoyi-admin/src/main/resources/templates/sales/estimate/engineeringAdd.html @@ -64,8 +64,8 @@

计算

- - + +
diff --git a/ruoyi-admin/src/main/resources/templates/sales/estimate/estimate.html b/ruoyi-admin/src/main/resources/templates/sales/estimate/estimate.html index 305d8e03..15eed8d3 100644 --- a/ruoyi-admin/src/main/resources/templates/sales/estimate/estimate.html +++ b/ruoyi-admin/src/main/resources/templates/sales/estimate/estimate.html @@ -69,6 +69,8 @@ var restoreFlag = [[${@permission.hasPermi('sales:estimate:restore')}]]; var engineeringAddFlag = [[${@permission.hasPermi('sales:estimate:engineeringAdd')}]]; var purchaseAddFlag = [[${@permission.hasPermi('sales:estimate:purchaseAdd')}]]; + var ceoAddFlag = [[${@permission.hasPermi('sales:estimate:ceoAdd')}]]; + var estimateStatusDatas = [[${@dict.getType('estimate_status')}]]; var commonCurrencyDatas = [[${@dict.getType('sys_common_currency')}]]; @@ -174,7 +176,9 @@ if(row.estimateStatus == '1'){ actions.push('采购成本 '); } - + if(row.estimateStatus == '2'){ + actions.push('经营成本 '); + } return actions.join(''); } }] @@ -195,11 +199,18 @@ $.modal.open("添加BOM", url); } - //采购 添加BOM + //采购 添加采购成本 function purchaseAdd(salesEstimateId){ var url = prefix + "/purchaseAdd/" + salesEstimateId; $.modal.open("采购成本", url); } + + //总经理 添加成本 + function ceoAdd(salesEstimateId){ + var url = prefix + "/ceoAdd/" + salesEstimateId; + $.modal.open("经营成本", url); + } + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sales/estimate/purchaseAdd.html b/ruoyi-admin/src/main/resources/templates/sales/estimate/purchaseAdd.html index c93c7ff7..c30a1668 100644 --- a/ruoyi-admin/src/main/resources/templates/sales/estimate/purchaseAdd.html +++ b/ruoyi-admin/src/main/resources/templates/sales/estimate/purchaseAdd.html @@ -64,8 +64,8 @@

计算

- - + +