From e240213b0118bd06d5da0732c52695271991f96d Mon Sep 17 00:00:00 2001 From: chenhao <852066789@qq.com> Date: Fri, 19 Sep 2025 15:19:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(sip):=20=E6=96=B0=E5=A2=9E=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=A8=8E=E7=8E=87=E4=B8=B4=E6=97=B6=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加项目税率临时表相关接口和服务 - 实现税率数据的保存、查询和应用逻辑 - 优化订单审批流程,支持税率修改 -调整产品信息表,增加税率字段 --- .../templates/layout/product-list.html | 7 + .../templates/project/order/add.html | 6 +- .../templates/project/order/approve.html | 143 ++++++++++-- .../templates/project/order/edit.html | 28 ++- .../templates/system/vendor/add.html | 16 +- .../templates/system/vendor/edit.html | 17 +- .../templates/system/vendor/vendor.html | 4 +- .../ProjectOrderInfoController.java | 8 + .../ruoyi/sip/domain/ProjectProductInfo.java | 1 + .../ruoyi/sip/domain/ProjectTaxRateTemp.java | 41 ++++ .../com/ruoyi/sip/flowable/domain/Todo.java | 3 + .../sip/mapper/ProjectTaxRateTempMapper.java | 85 ++++++++ .../service/IProjectTaxRateTempService.java | 98 +++++++++ .../impl/ProjectOrderInfoServiceImpl.java | 66 +++++- .../impl/ProjectProductInfoServiceImpl.java | 18 +- .../impl/ProjectTaxRateTempServiceImpl.java | 204 ++++++++++++++++++ .../mapper/sip/ProjectProductInfoMapper.xml | 14 +- .../mapper/sip/ProjectTaxRateTempMapper.xml | 97 +++++++++ 18 files changed, 801 insertions(+), 55 deletions(-) create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectTaxRateTemp.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/ProjectTaxRateTempMapper.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/service/IProjectTaxRateTempService.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectTaxRateTempServiceImpl.java create mode 100644 ruoyi-sip/src/main/resources/mapper/sip/ProjectTaxRateTempMapper.xml diff --git a/ruoyi-admin/src/main/resources/templates/layout/product-list.html b/ruoyi-admin/src/main/resources/templates/layout/product-list.html index 582d211a..11bc057b 100644 --- a/ruoyi-admin/src/main/resources/templates/layout/product-list.html +++ b/ruoyi-admin/src/main/resources/templates/layout/product-list.html @@ -29,6 +29,7 @@ 总价(¥) 折后总价(¥) 目录总价(¥) + 税率(%) 备注 操作 @@ -58,6 +59,7 @@ 总价(¥) 折后总价(¥) 目录总价(¥) + 税率(%) 备注 操作 @@ -87,6 +89,7 @@ 总价(¥) 折后总价(¥) 目录总价(¥) + 税率(%) 备注 操作 @@ -294,6 +297,7 @@ } function generatedTr(index,data,length){ + debugger let flag=true let productTypeParam=productType[index] let queryParam=productTypeParam.type @@ -346,6 +350,9 @@ + + + 删除 diff --git a/ruoyi-admin/src/main/resources/templates/project/order/add.html b/ruoyi-admin/src/main/resources/templates/project/order/add.html index 58547a8f..192f4b24 100644 --- a/ruoyi-admin/src/main/resources/templates/project/order/add.html +++ b/ruoyi-admin/src/main/resources/templates/project/order/add.html @@ -604,11 +604,11 @@ if (orderChannel == '1') { // 总代 $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); } else if (orderChannel == '2') { // 直签 $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); } // Clear description and ratio when channel changes $('#paymentDescription').val(''); diff --git a/ruoyi-admin/src/main/resources/templates/project/order/approve.html b/ruoyi-admin/src/main/resources/templates/project/order/approve.html index 11db72c0..dc5baffa 100644 --- a/ruoyi-admin/src/main/resources/templates/project/order/approve.html +++ b/ruoyi-admin/src/main/resources/templates/project/order/approve.html @@ -370,12 +370,18 @@ - + - - + + @@ -673,7 +679,7 @@ // } // } - let data = [[${todo}]] + let {taxRateData, ...data} = [[${todo}]] data.approveOpinion = value data.approveStatus = 3 data.variables = { @@ -684,6 +690,19 @@ if( $('#actualPurchaseAmount').length>0){ data.variables.actualPurchaseAmount=$('#actualPurchaseAmount').val() } + + // 如果是商务审批,收集税率数据 + const taskName = [[${todo.taskName}]]; + if (taskName && taskName.startsWith('商务')) { + const taxRateList = collectTaxRateData(); + if (taxRateList) { + for (let i = 0; i < taxRateList.length; i++) { + for (let key in taxRateList[i]) { + data['taxRateData[' + i + '].' + key] = taxRateList[i][key]; + } + } + } + } top.layer.close(index); // 关闭层 if ([[${todo.taskName == '公司领导'}]]) { exportPdf(true) @@ -724,6 +743,19 @@ approveBtn: 0 } + // 如果是商务审批,收集税率数据 + const taskName = [[${todo.taskName}]]; + if (taskName && taskName.startsWith('商务')) { + const taxRateList = collectTaxRateData(); + if (taxRateList) { + for (let i = 0; i < taxRateList.length; i++) { + for (let key in taxRateList[i]) { + data['taxRateData[' + i + '].' + key] = taxRateList[i][key]; + } + } + } + } + top.layer.close(index); // 关闭层 if ([[${todo.taskName == '公司领导'}]]) { exportPdf(true) @@ -1183,14 +1215,16 @@ ${ //判断是否总代 let flag = [[${projectOrderInfo.processTemplate == '1'}]] let discountFold = [[${projectOrderInfo.discountFold}]] - console.log(discountFold) let id = $('[name="projectId"]').val() window.localStorage.setItem('getDetail', 1) - $.operate.get(ctx + `sip/project/query/${id}`, function (res) { + $('#productTable tbody').html('') $('#productTable2 tbody').html('') $('#productTable3 tbody').html('') - res.data.softwareProjectProductInfoList ? res.data.softwareProjectProductInfoList.forEach((ele) => { + let softwareProjectProductInfoList = [[${projectOrderInfo.softwareProjectProductInfoList}]] + let hardwareProjectProductInfoList = [[${projectOrderInfo.hardwareProjectProductInfoList}]] + let maintenanceProjectProductInfoList = [[${projectOrderInfo.maintenanceProjectProductInfoList}]] + softwareProjectProductInfoList ? softwareProjectProductInfoList.forEach((ele) => { ele.allPriceDisCount = (ele.allPrice * discountFold).toFixed(2) ele.allPriceDisCountFormat = formatAmountNumber(ele.allPriceDisCount) @@ -1204,7 +1238,7 @@ ${ ele.guidanceDiscountFormat = ele.guidanceDiscount ? (ele.guidanceDiscount * 100).toFixed(2) : "" addProduct(ele) }) : ''; - res.data.hardwareProjectProductInfoList ? res.data.hardwareProjectProductInfoList.forEach((ele) => { + hardwareProjectProductInfoList ? hardwareProjectProductInfoList.forEach((ele) => { ele.allPriceDisCount = (ele.allPrice * discountFold).toFixed(2) ele.allPriceDisCountFormat = formatAmountNumber(ele.allPriceDisCount) @@ -1219,10 +1253,10 @@ ${ addProduct2(ele) }) : ''; - res.data.maintenanceProjectProductInfoList ? res.data.maintenanceProjectProductInfoList.forEach((ele) => { + maintenanceProjectProductInfoList ? maintenanceProjectProductInfoList.forEach((ele) => { - ele.allPriceDisCount = (ele.allPrice * discountFold).toFixed(2) - ele.allPriceDisCountFormat = formatAmountNumber(ele.allPriceDisCount) + ele.allPriceDisCount = (ele.allPrice * discountFold).toFixed(2) + ele.allPriceDisCountFormat = formatAmountNumber(ele.allPriceDisCount) ele.cataloguePriceFormmat = ele.cataloguePrice ? formatAmountNumber(ele.cataloguePrice) : "" ele.priceFormmat = ele.price ? formatAmountNumber(ele.price) : "" @@ -1255,7 +1289,9 @@ ${ }else{ $('.discount-text').text('现金折扣') } - }) + initTaxRateEditability(); + + // $.operate.get(ctx + `sip/project/query/${id}`, function (res) ) } function downFile(filePath, fileName) { @@ -1341,6 +1377,89 @@ ${ } } + // 控制税率列的可编辑性 + function initTaxRateEditability() { + const taskName = [[${todo.taskName}]]; + const isBusinessTask = taskName && taskName.startsWith('商务'); + + // 获取所有税率输入框 + const taxRateInputs = document.querySelectorAll('.tax-rate'); + + taxRateInputs.forEach(function (input) { + if (isBusinessTask) { + // 如果是商务任务,允许编辑 + input.removeAttribute('readonly'); + input.removeAttribute('disabled'); + input.style.backgroundColor = '#fff'; + input.style.cursor = 'text'; + } else { + // 否则保持只读 + input.setAttribute('readonly', 'readonly'); + } + }); + } + + // 收集税率数据 + function collectTaxRateData() { + const taxRateData = []; + + // 收集软件产品税率 + $('#productTable tbody tr').each(function (index) { + const taxRateInput = $(this).find('.tax-rate'); + if (taxRateInput.length > 0) { + const productId = $(this).find('input[name$=".id"]').val(); + const productCode = $(this).find('input[name$=".productBomCode"]').val(); + const taxRate = taxRateInput.val(); + if (productId || taxRate) { + taxRateData.push({ + productId: productId, + + projectId: $('#projectId').val(), + taxRate: taxRate || '13' + }); + } + } + }); + + // 收集终端产品税率 + $('#productTable2 tbody tr').each(function (index) { + const taxRateInput = $(this).find('.tax-rate'); + if (taxRateInput.length > 0) { + const productId = $(this).find('input[name$=".id"]').val(); + const productCode = $(this).find('input[name$=".productBomCode"]').val(); + const taxRate = taxRateInput.val(); + if (productId || taxRate) { + taxRateData.push({ + productId: productId, + + projectId: $('#projectId').val(), + taxRate: taxRate || '13' + }); + } + } + }); + + // 收集第三类产品税率 + $('#productTable3 tbody tr').each(function (index) { + const taxRateInput = $(this).find('.tax-rate'); + if (taxRateInput.length > 0) { + const productId = $(this).find('input[name$=".id"]').val(); + const productCode = $(this).find('input[name$=".productBomCode"]').val(); + const taxRate = taxRateInput.val(); + if (productId || taxRate) { + taxRateData.push({ + productId: productId, + projectId: $('#projectId').val(), + taxRate: taxRate || '13' + }); + } + } + }); + + return taxRateData; + } + + diff --git a/ruoyi-admin/src/main/resources/templates/project/order/edit.html b/ruoyi-admin/src/main/resources/templates/project/order/edit.html index 298b7323..08f561a7 100644 --- a/ruoyi-admin/src/main/resources/templates/project/order/edit.html +++ b/ruoyi-admin/src/main/resources/templates/project/order/edit.html @@ -382,7 +382,7 @@ 描述 - @@ -724,6 +724,10 @@ s:[{ n: '电子订单', v: '0' + }, { + n: '纸质合同', + v: '1' + }] }]:undefined) @@ -908,8 +912,16 @@ }) } - $('[name="orderChannel"]').on('change', updatePaymentOptions); - updatePaymentOptions(); + $('[name="orderChannel"]').on('change', function() { + // 清空付款相关字段 + $('#paymentMethod').val('').trigger('change'); + $('#paymentRatio').val('').prop('readonly', false); + $('#paymentDescription').val(''); + + // 调用原有的更新付款选项函数 + updatePaymentOptions(false); + }); + updatePaymentOptions(true); // Set payment method from database var initialPaymentMethod = /*[[${projectOrderInfo.paymentMethod}]]*/ null; if(initialPaymentMethod) { @@ -1363,7 +1375,7 @@ } - function updatePaymentOptions() { + function updatePaymentOptions(flag) { var orderChannel = $('[name="orderChannel"]').val(); var $paymentMethodSelect = $('#paymentMethod'); var paymentMethod = /*[[${projectOrderInfo.paymentMethod}]]*/ null; @@ -1372,14 +1384,14 @@ if (orderChannel == '1') { // 总代 $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); } else if (orderChannel == '2') { // 直签 $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); - $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); + $paymentMethodSelect.append(''); } - if (paymentMethod) { + if (paymentMethod &&flag) { $paymentMethodSelect.val(paymentMethod); } } diff --git a/ruoyi-admin/src/main/resources/templates/system/vendor/add.html b/ruoyi-admin/src/main/resources/templates/system/vendor/add.html index da55b147..534a9c91 100644 --- a/ruoyi-admin/src/main/resources/templates/system/vendor/add.html +++ b/ruoyi-admin/src/main/resources/templates/system/vendor/add.html @@ -24,6 +24,14 @@ +
+
+ +
+ +
+
+
@@ -72,14 +80,6 @@
-
-
- -
- -
-
-
diff --git a/ruoyi-admin/src/main/resources/templates/system/vendor/edit.html b/ruoyi-admin/src/main/resources/templates/system/vendor/edit.html index ae0401d2..33e5ea28 100644 --- a/ruoyi-admin/src/main/resources/templates/system/vendor/edit.html +++ b/ruoyi-admin/src/main/resources/templates/system/vendor/edit.html @@ -25,6 +25,14 @@ +
+
+ +
+ +
+
+
@@ -85,14 +93,7 @@
-
-
- -
- -
-
-
+ diff --git a/ruoyi-admin/src/main/resources/templates/system/vendor/vendor.html b/ruoyi-admin/src/main/resources/templates/system/vendor/vendor.html index 75bb2498..f558f326 100644 --- a/ruoyi-admin/src/main/resources/templates/system/vendor/vendor.html +++ b/ruoyi-admin/src/main/resources/templates/system/vendor/vendor.html @@ -25,7 +25,7 @@
  • - +
  • @@ -109,7 +109,7 @@ { width: '600', field: 'vendorAddress', - title: '生产地址' + title: '制造商全称' }, { width: '100', diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/ProjectOrderInfoController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/ProjectOrderInfoController.java index 9720b700..2ce36ba0 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/ProjectOrderInfoController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/ProjectOrderInfoController.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import cn.hutool.core.collection.CollUtil; import com.ruoyi.common.config.RuoYiConfig; @@ -22,10 +23,12 @@ import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.sip.domain.ProjectInfo; import com.ruoyi.sip.domain.ProjectOrderFileLog; +import com.ruoyi.sip.domain.ProjectTaxRateTemp; import com.ruoyi.sip.flowable.domain.Todo; import com.ruoyi.sip.flowable.service.TodoService; import com.ruoyi.sip.service.IProjectOrderConfigInfoService; import com.ruoyi.sip.service.IProjectOrderFileLogService; +import com.ruoyi.sip.service.IProjectTaxRateTempService; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -80,6 +83,9 @@ public class ProjectOrderInfoController extends BaseController @Autowired private IProjectOrderFileLogService projectOrderFileLogService; + @Autowired + private IProjectTaxRateTempService projectTaxRateTempService; + @RequiresPermissions("project:order:view") @GetMapping() public String order() @@ -91,6 +97,7 @@ public class ProjectOrderInfoController extends BaseController public String approve(@PathVariable("id") Long id, ModelMap mmap) { mmap.put("approve", true); ProjectOrderInfo projectOrderInfo = projectOrderInfoService.selectProjectOrderInfoById(id); + projectTaxRateTempService.updateTaxRate(projectOrderInfo); mmap.put("projectOrderInfo", projectOrderInfo); mmap.put("user", ShiroUtils.getSysUser()); Todo todo = new Todo(); @@ -105,6 +112,7 @@ public class ProjectOrderInfoController extends BaseController public AjaxResult approve(@PathVariable("id") Long id) { Map result=new HashMap<>(); ProjectOrderInfo projectOrderInfo = projectOrderInfoService.selectProjectOrderInfoById(id); + projectTaxRateTempService.updateTaxRate(projectOrderInfo); result.put("projectOrderInfo", projectOrderInfo); result.put("user", ShiroUtils.getSysUser()); Todo todo = new Todo(); diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectProductInfo.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectProductInfo.java index ec0daad2..c251a49e 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectProductInfo.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectProductInfo.java @@ -77,6 +77,7 @@ public class ProjectProductInfo extends BaseEntity private BigDecimal discount; private String type; private String value; + private BigDecimal taxRate; } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectTaxRateTemp.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectTaxRateTemp.java new file mode 100644 index 00000000..ab543ad5 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectTaxRateTemp.java @@ -0,0 +1,41 @@ +package com.ruoyi.sip.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.math.BigDecimal; + +/** + * 项目税率临时表 project_tax_rate_temp + * + * @author ruoyi + * @date 2024-01-01 + */ +@Data +public class ProjectTaxRateTemp extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 订单编号 */ + @Excel(name = "订单编号") + private String orderCode; + + /** 税率 */ + @Excel(name = "税率") + private BigDecimal taxRate; + + /** 项目ID */ + @Excel(name = "项目ID") + private Long projectId; + + /** 产品ID */ + @Excel(name = "产品Code") + private Long productId; + +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/flowable/domain/Todo.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/flowable/domain/Todo.java index 06dca94f..a4ade989 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/flowable/domain/Todo.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/flowable/domain/Todo.java @@ -4,11 +4,13 @@ package com.ruoyi.sip.flowable.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.sip.domain.ProjectTaxRateTemp; import lombok.Data; import lombok.ToString; import lombok.experimental.Accessors; import java.util.Date; +import java.util.List; import java.util.Map; /** @@ -93,4 +95,5 @@ public class Todo extends BaseEntity private Integer recoveryType; private Map variables; + private List taxRateData; } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/ProjectTaxRateTempMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/ProjectTaxRateTempMapper.java new file mode 100644 index 00000000..54569f07 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/ProjectTaxRateTempMapper.java @@ -0,0 +1,85 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.ProjectTaxRateTemp; + +/** + * 项目税率临时表Mapper接口 + * + * @author ruoyi + * @date 2024-01-01 + */ +public interface ProjectTaxRateTempMapper +{ + /** + * 查询项目税率临时表 + * + * @param id 项目税率临时表主键 + * @return 项目税率临时表 + */ + public ProjectTaxRateTemp selectProjectTaxRateTempById(Long id); + + /** + * 查询项目税率临时表列表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 项目税率临时表集合 + */ + public List selectProjectTaxRateTempList(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 根据订单编号查询税率临时数据 + * + * @param orderCode 订单编号 + * @return 项目税率临时表集合 + */ + public List selectProjectTaxRateTempByOrderCode(String orderCode); + + /** + * 新增项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + public int insertProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 修改项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + public int updateProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 删除项目税率临时表 + * + * @param id 项目税率临时表主键 + * @return 结果 + */ + public int deleteProjectTaxRateTempById(Long id); + + /** + * 批量删除项目税率临时表 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProjectTaxRateTempByIds(String[] ids); + + /** + * 根据订单编号删除税率临时数据 + * + * @param orderCode 订单编号 + * @return 结果 + */ + public int deleteProjectTaxRateTempByOrderCode(String orderCode); + + /** + * 批量插入税率临时数据 + * + * @param list 税率临时数据列表 + * @return 结果 + */ + public int batchInsertProjectTaxRateTemp(List list); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IProjectTaxRateTempService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IProjectTaxRateTempService.java new file mode 100644 index 00000000..44305ec1 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IProjectTaxRateTempService.java @@ -0,0 +1,98 @@ +package com.ruoyi.sip.service; + +import java.util.List; + +import com.ruoyi.sip.domain.ProjectOrderInfo; +import com.ruoyi.sip.domain.ProjectTaxRateTemp; + +/** + * 项目税率临时表Service接口 + * + * @author ruoyi + * @date 2024-01-01 + */ +public interface IProjectTaxRateTempService +{ + /** + * 查询项目税率临时表 + * + * @param id 项目税率临时表主键 + * @return 项目税率临时表 + */ + public ProjectTaxRateTemp selectProjectTaxRateTempById(Long id); + + /** + * 查询项目税率临时表列表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 项目税率临时表集合 + */ + public List selectProjectTaxRateTempList(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 根据订单编号查询税率临时数据 + * + * @param orderCode 订单编号 + * @return 项目税率临时表集合 + */ + public List selectProjectTaxRateTempByOrderCode(String orderCode); + + /** + * 新增项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + public int insertProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 修改项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + public int updateProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp); + + /** + * 批量删除项目税率临时表 + * + * @param ids 需要删除的项目税率临时表主键集合 + * @return 结果 + */ + public int deleteProjectTaxRateTempByIds(String ids); + + /** + * 删除项目税率临时表信息 + * + * @param id 项目税率临时表主键 + * @return 结果 + */ + public int deleteProjectTaxRateTempById(Long id); + + /** + * 根据订单编号删除税率临时数据 + * + * @param orderCode 订单编号 + * @return 结果 + */ + public int deleteProjectTaxRateTempByOrderCode(String orderCode); + + /** + * 批量保存税率临时数据 + * + * @param orderCode 订单编号 + * @param taxRateDataList 税率数据列表 + * @return 结果 + */ + public int saveTaxRateTemp(String orderCode, List taxRateDataList); + + /** + * 应用临时税率数据到正式表 + * + * @param orderCode 订单编号 + * @return 结果 + */ + public int applyTaxRateTemp(String orderCode); + + void updateTaxRate(ProjectOrderInfo projectOrderInfo); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java index f63074ae..31beacc4 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java @@ -29,6 +29,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.sip.domain.*; import com.ruoyi.sip.dto.ApiDataQueryDto; +import com.alibaba.fastjson.JSONArray; import com.ruoyi.sip.flowable.domain.Todo; import com.ruoyi.sip.dto.HomepageQueryDto; import com.ruoyi.sip.dto.OrderExcelNumStaticsDto; @@ -110,6 +111,8 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To @Autowired private IBuApproveConfigService approveConfigService; + @Autowired + private IProjectTaxRateTempService projectTaxRateTempService; @Value("${unis.order.endHour:96}") private Integer endHour; @Value("${unis.mail.businessRoleId:103}") @@ -557,6 +560,12 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To if (CollUtil.isNotEmpty(todo.getVariables())) { Map variables = todo.getVariables(); variables.put("approveBtn", Integer.parseInt((String) variables.get("approveBtn"))); + + // 处理税率数据 + if (CollUtil.isNotEmpty(todo.getTaxRateData())) { + handleTaxRateData(todo, variables); + } + if (variables.containsKey("allPriceCountValue") && "商务".equals(todo.getTaskName())) { BigDecimal allPriceCountValue = new BigDecimal((String) variables.get("allPriceCountValue")); ProjectOrderInfo projectOrderInfo = new ProjectOrderInfo(); @@ -1106,7 +1115,7 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To if ("公司领导".equals(taskName)) { projectOrderInfo.setVersionCode("add"); } - + handleRejectOrder(businessKey); projectOrderInfoMapper.updateProjectOrderInfoByCode(projectOrderInfo); } @@ -1162,6 +1171,7 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To if (dbProjectOrderInfo.getDiscountFold().compareTo(BigDecimal.ONE) != 0) { productInfoService.calcByDiscountFold(dbProjectOrderInfo.getDiscountFold(), dbProjectOrderInfo.getProjectId()); } + handleApproveOrder(businessKey); } @Override @@ -1208,4 +1218,58 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To } return projectOrderInfoMapper.listOrderInfoVo(queryParams); } + + /** + * 处理税率数据 + * + * @param businessKey 业务键(订单编号) + * @param variables 流程变量 + */ + private void handleTaxRateData(Todo todo, Map variables) { + try { + List taxRateDataList = todo.getTaxRateData(); + if (CollUtil.isNotEmpty(taxRateDataList)) { + // 保存临时税率数据 + projectTaxRateTempService.saveTaxRateTemp(todo.getBusinessKey(), taxRateDataList); + log.info("保存税率临时数据成功,订单编号:{}, 数据条数:{}", todo.getBusinessKey(), taxRateDataList.size()); + } + + } catch (Exception e) { + log.error("处理税率数据失败,订单编号:{}", todo.getBusinessKey(), e); + } + } + + + + /** + * 处理订单驳回 + * + * @param businessKey 订单编号 + */ + private void handleRejectOrder(String businessKey) { + try { + // 删除临时税率数据 + projectTaxRateTempService.deleteProjectTaxRateTempByOrderCode(businessKey); + log.info("订单驳回,删除临时税率数据成功,订单编号:{}", businessKey); + } catch (Exception e) { + log.error("处理订单驳回失败,订单编号:{}", businessKey, e); + } + } + + /** + * 处理订单审批通过 + * + * @param businessKey 订单编号 + */ + private void handleApproveOrder(String businessKey) { + try { + + // 没有待处理任务,说明审批全部通过,应用临时数据 + int updateCount = projectTaxRateTempService.applyTaxRateTemp(businessKey); + log.info("订单审批全部通过,应用临时税率数据成功,订单编号:{}, 更新产品数:{}", businessKey, updateCount); + + } catch (Exception e) { + log.error("处理订单审批通过失败,订单编号:{}", businessKey, e); + } + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java index 1016471a..8b63f110 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java @@ -2,10 +2,7 @@ package com.ruoyi.sip.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.StringJoiner; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -173,12 +170,17 @@ public class ProjectProductInfoServiceImpl implements IProjectProductInfoService @Override public void calcByDiscountFold(BigDecimal discountFold, Long projectId) { List projectProductInfos = projectProductInfoMapper.selectProjectProductInfoListByProjectId(Collections.singletonList(projectId)); + List updateList = new ArrayList<>(); for (ProjectProductInfo info : projectProductInfos) { + ProjectProductInfo dto = new ProjectProductInfo(); BigDecimal price = info.getPrice().multiply(discountFold).setScale(2,RoundingMode.HALF_UP); - info.setPrice(price); - info.setAllPrice(price.multiply(new BigDecimal(info.getQuantity())).setScale(2,RoundingMode.HALF_UP)); - info.setDiscount(price.divide(info.getCataloguePrice(),4,RoundingMode.HALF_UP)); + dto.setPrice(price); + dto.setAllPrice(price.multiply(new BigDecimal(info.getQuantity())).setScale(2, RoundingMode.HALF_UP)); + BigDecimal divide = price.divide(info.getCataloguePrice(), 4, RoundingMode.HALF_UP); + dto.setDiscount(divide.compareTo(BigDecimal.ONE) > 0 ? info.getDiscount() : divide); + dto.setId(info.getId()); + updateList.add(dto); } - projectProductInfoMapper.updateBatch(projectProductInfos); + projectProductInfoMapper.updateBatch(updateList); } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectTaxRateTempServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectTaxRateTempServiceImpl.java new file mode 100644 index 00000000..0ff859e5 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectTaxRateTempServiceImpl.java @@ -0,0 +1,204 @@ +package com.ruoyi.sip.service.impl; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.sip.domain.ProjectOrderInfo; +import com.ruoyi.sip.domain.ProjectProductInfo; +import com.ruoyi.sip.service.IProjectProductInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.sip.mapper.ProjectTaxRateTempMapper; +import com.ruoyi.sip.domain.ProjectTaxRateTemp; +import com.ruoyi.sip.service.IProjectTaxRateTempService; +import com.ruoyi.common.core.text.Convert; +import org.springframework.transaction.annotation.Transactional; +import cn.hutool.core.collection.CollUtil; + +/** + * 项目税率临时表Service业务层处理 + * + * @author ruoyi + * @date 2024-01-01 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class ProjectTaxRateTempServiceImpl implements IProjectTaxRateTempService { + @Autowired + private ProjectTaxRateTempMapper projectTaxRateTempMapper; + + @Autowired + private IProjectProductInfoService projectProductInfoService; + + /** + * 查询项目税率临时表 + * + * @param id 项目税率临时表主键 + * @return 项目税率临时表 + */ + @Override + public ProjectTaxRateTemp selectProjectTaxRateTempById(Long id) { + return projectTaxRateTempMapper.selectProjectTaxRateTempById(id); + } + + /** + * 查询项目税率临时表列表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 项目税率临时表 + */ + @Override + public List selectProjectTaxRateTempList(ProjectTaxRateTemp projectTaxRateTemp) { + return projectTaxRateTempMapper.selectProjectTaxRateTempList(projectTaxRateTemp); + } + + /** + * 根据订单编号查询税率临时数据 + * + * @param orderCode 订单编号 + * @return 项目税率临时表集合 + */ + @Override + public List selectProjectTaxRateTempByOrderCode(String orderCode) { + return projectTaxRateTempMapper.selectProjectTaxRateTempByOrderCode(orderCode); + } + + /** + * 新增项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + @Override + public int insertProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp) { + projectTaxRateTemp.setCreateTime(DateUtils.getNowDate()); + projectTaxRateTemp.setCreateBy(ShiroUtils.getUserId().toString()); + return projectTaxRateTempMapper.insertProjectTaxRateTemp(projectTaxRateTemp); + } + + /** + * 修改项目税率临时表 + * + * @param projectTaxRateTemp 项目税率临时表 + * @return 结果 + */ + @Override + public int updateProjectTaxRateTemp(ProjectTaxRateTemp projectTaxRateTemp) { + return projectTaxRateTempMapper.updateProjectTaxRateTemp(projectTaxRateTemp); + } + + /** + * 批量删除项目税率临时表 + * + * @param ids 需要删除的项目税率临时表主键 + * @return 结果 + */ + @Override + public int deleteProjectTaxRateTempByIds(String ids) { + return projectTaxRateTempMapper.deleteProjectTaxRateTempByIds(Convert.toStrArray(ids)); + } + + /** + * 删除项目税率临时表信息 + * + * @param id 项目税率临时表主键 + * @return 结果 + */ + @Override + public int deleteProjectTaxRateTempById(Long id) { + return projectTaxRateTempMapper.deleteProjectTaxRateTempById(id); + } + + /** + * 根据订单编号删除税率临时数据 + * + * @param orderCode 订单编号 + * @return 结果 + */ + @Override + public int deleteProjectTaxRateTempByOrderCode(String orderCode) { + return projectTaxRateTempMapper.deleteProjectTaxRateTempByOrderCode(orderCode); + } + + /** + * 批量保存税率临时数据 + * + * @param orderCode 订单编号 + * @param taxRateDataList 税率数据列表 + * @return 结果 + */ + @Override + public int saveTaxRateTemp(String orderCode, List taxRateDataList) { + // 先删除该订单的旧临时数据 + deleteProjectTaxRateTempByOrderCode(orderCode); + + if (CollUtil.isNotEmpty(taxRateDataList)) { + // 设置订单编号和创建信息 + for (ProjectTaxRateTemp temp : taxRateDataList) { + temp.setOrderCode(orderCode); + temp.setCreateTime(DateUtils.getNowDate()); + temp.setCreateBy(ShiroUtils.getUserId().toString()); + } + // 批量插入新的临时数据 + return projectTaxRateTempMapper.batchInsertProjectTaxRateTemp(taxRateDataList); + } + return 0; + } + + /** + * 应用临时税率数据到正式表 + * + * @param orderCode 订单编号 + * @return 结果 + */ + @Override + public int applyTaxRateTemp(String orderCode) { + // 获取临时税率数据 + List tempList = selectProjectTaxRateTempByOrderCode(orderCode); + + if (CollUtil.isNotEmpty(tempList)) { + int updateCount = 0; + for (ProjectTaxRateTemp temp : tempList) { + // 更新项目产品信息表中的税率数据 + if (temp.getProductId() != null) { + ProjectProductInfo productInfo = new ProjectProductInfo(); + productInfo.setId(temp.getProductId()); + productInfo.setTaxRate(temp.getTaxRate()); + updateCount += projectProductInfoService.updateProjectProductInfo(productInfo); + } + } + + // 应用完成后删除临时数据 + deleteProjectTaxRateTempByOrderCode(orderCode); + + return updateCount; + } + return 0; + } + + @Override + public void updateTaxRate(ProjectOrderInfo projectOrderInfo) { + List projectTaxRateTemps = projectTaxRateTempMapper.selectProjectTaxRateTempByOrderCode(projectOrderInfo.getOrderCode()); + if (CollUtil.isEmpty(projectTaxRateTemps)) { + return; + } + Map tempMap = projectTaxRateTemps.stream().collect(Collectors.toMap(ProjectTaxRateTemp::getProductId, ProjectTaxRateTemp::getTaxRate, (a, b) -> a)); + if (CollUtil.isNotEmpty(projectOrderInfo.getSoftwareProjectProductInfoList())) { + projectOrderInfo.getSoftwareProjectProductInfoList().forEach(productInfo -> + productInfo.setTaxRate(tempMap.get(productInfo.getId()) == null ? productInfo.getTaxRate() : tempMap.get(productInfo.getId()))); + } + if (CollUtil.isNotEmpty(projectOrderInfo.getHardwareProjectProductInfoList())) { + projectOrderInfo.getHardwareProjectProductInfoList().forEach(productInfo -> + productInfo.setTaxRate(tempMap.get(productInfo.getId()) == null ? productInfo.getTaxRate() : tempMap.get(productInfo.getId()))); + } + if (CollUtil.isNotEmpty(projectOrderInfo.getMaintenanceProjectProductInfoList())) { + projectOrderInfo.getMaintenanceProjectProductInfoList().forEach(productInfo -> + productInfo.setTaxRate(tempMap.get(productInfo.getId()) == null ? productInfo.getTaxRate() : tempMap.get(productInfo.getId()))); + } + + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/ProjectProductInfoMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/ProjectProductInfoMapper.xml index 568f91d7..350a9a60 100644 --- a/ruoyi-sip/src/main/resources/mapper/sip/ProjectProductInfoMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/sip/ProjectProductInfoMapper.xml @@ -23,11 +23,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select t1.id, t1.project_id, t1.product_bom_code, t1.model, t1.product_code, t1.product_desc, t1.quantity, t1.catalogue_price, - t1.catalogue_all_price, t1.price, t1.all_price, t1.guidance_discount, t1.discount, t1.remark from project_product_info t1 + t1.catalogue_all_price, t1.price, t1.all_price, t1.guidance_discount, t1.discount, t1.remark,t1.tax_rate from project_product_info t1 select t1.id, t1.project_id, t1.product_bom_code, t1.model, t1.product_code, t1.product_desc, t1.quantity, t1.catalogue_price, - t1.catalogue_all_price, t1.price, t1.all_price, t1.guidance_discount, t1.discount, t1.remark,t2.type,t2.product_name,t2.vendor_code,t2.value + t1.catalogue_all_price, t1.price, t1.all_price, t1.guidance_discount, t1.discount, t1.remark,t1.tax_rate,t2.type,t2.product_name,t2.vendor_code,t2.value from project_product_info t1 left join product_info t2 on t1.product_bom_code = t2.product_code @@ -90,6 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" guidance_discount, discount, remark, + tax_rate , #{projectId}, @@ -105,20 +106,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{guidanceDiscount}, #{discount}, #{remark}, + #{taxRate}, insert into project_product_info (project_id, product_bom_code, model, product_code, product_desc, quantity, - catalogue_price, catalogue_all_price, price, all_price, guidance_discount, discount, remark) values + catalogue_price, catalogue_all_price, price, all_price, guidance_discount, discount, remark,tax_rate) values (#{item.projectId}, #{item.productBomCode}, #{item.model}, #{item.productCode}, #{item.productDesc}, #{item.quantity}, #{item.cataloguePrice}, #{item.catalogueAllPrice}, #{item.price}, #{item.allPrice}, - #{item.guidanceDiscount}, #{item.discount}, #{item.remark}) + #{item.guidanceDiscount}, #{item.discount}, #{item.remark},#{item.taxRate}) ON DUPLICATE KEY UPDATE product_bom_code = values(product_bom_code), model = values(model), product_code = values(product_code), product_desc = values(product_desc), quantity = values(quantity), catalogue_price = values(catalogue_price), catalogue_all_price = values(catalogue_all_price), price = values(price), all_price = values(all_price), guidance_discount = values(guidance_discount), - discount = values(discount), remark = values(remark) + discount = values(discount), remark = values(remark),tax_rate=values(tax_rate) @@ -130,6 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_code = #{productCode}, product_desc = #{productDesc}, quantity = #{quantity}, + tax_rate = #{taxRate}, catalogue_price = #{cataloguePrice}, catalogue_all_price = #{catalogueAllPrice}, price = #{price}, @@ -158,6 +161,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" guidance_discount = #{item.guidanceDiscount}, discount = #{item.discount}, remark = #{item.remark}, + tax_rate = #{item.taxRate}, where id = #{item.id} diff --git a/ruoyi-sip/src/main/resources/mapper/sip/ProjectTaxRateTempMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/ProjectTaxRateTempMapper.xml new file mode 100644 index 00000000..e68220bb --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/ProjectTaxRateTempMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + select id, order_code, tax_rate, project_id, product_id, create_time, create_by from project_tax_rate_temp + + + + + + + + + + insert into project_tax_rate_temp + + order_code, + tax_rate, + project_id, + product_id, + create_time, + create_by, + + + #{orderCode}, + #{taxRate}, + #{projectId}, + #{productId}, + #{createTime}, + #{createBy}, + + + + + update project_tax_rate_temp + + order_code = #{orderCode}, + tax_rate = #{taxRate}, + project_id = #{projectId}, + product_id = #{productId}, + create_time = #{createTime}, + create_by = #{createBy}, + + where id = #{id} + + + + delete from project_tax_rate_temp where id = #{id} + + + + delete from project_tax_rate_temp where id in + + #{id} + + + + + delete from project_tax_rate_temp where order_code = #{orderCode} + + + + insert into project_tax_rate_temp (order_code, tax_rate, project_id, product_id, create_time, create_by) + values + + (#{item.orderCode}, #{item.taxRate}, #{item.projectId}, #{item.productId}, #{item.createTime}, #{item.createBy}) + + + + \ No newline at end of file