From dac03b5ff8efb1b733d37dce7553ed0aff32c780 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期五, 09 五月 2025 17:47:02 +0800 Subject: [PATCH] 1.销售台账合同金额(所有产品含税总价) --- src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java index 793722e..c397b9f 100644 --- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java +++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java @@ -1,15 +1,25 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; +import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.lang.reflect.Field; +import java.math.BigDecimal; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 浜у搧淇℃伅Service涓氬姟灞傚鐞� @@ -18,9 +28,12 @@ * @date 2025-05-08 */ @Service +@AllArgsConstructor public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { - @Autowired + private SalesLedgerProductMapper salesLedgerProductMapper; + + private SalesLedgerMapper salesLedgerMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -35,16 +48,109 @@ } @Override + @Transactional(rollbackFor = Exception.class) public int deleteSalesLedgerProductByIds(Long[] ids) { - return salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids)); + if (ids == null || ids.length == 0) { + return 0; + } + + // 1. 鍏堟煡璇㈣鍒犻櫎鐨勫瓙琛ㄨ褰曪紝鑾峰彇瀵瑰簲鐨� salesLedgerId + List<SalesLedgerProduct> deletedProducts = salesLedgerProductMapper.selectBatchIds(Arrays.asList(ids)); + if (deletedProducts.isEmpty()) { + return 0; // 娌℃湁鍙垹闄ょ殑鏁版嵁 + } + + // 鍙兘灞炰簬澶氫釜涓昏〃锛堜絾閫氬父涓�涓帴鍙e彧澶勭悊涓�涓富琛級 + Set<Long> mainIds = deletedProducts.stream() + .map(SalesLedgerProduct::getSalesLedgerId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 2. 鎵ц鍒犻櫎鎿嶄綔 + int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids)); + + // 3. 瀵规瘡涓富琛↖D杩涜閲戦鏇存柊 + for (Long salesLedgerId : mainIds) { + LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId); + List<SalesLedgerProduct> remainingProducts = salesLedgerProductMapper.selectList(wrapper); + + // 璋冪敤閫氱敤鏂规硶鏇存柊涓昏〃閲戦 + updateMainContractAmount( + salesLedgerId, + remainingProducts, + SalesLedgerProduct::getTaxInclusiveTotalPrice, + salesLedgerMapper, + SalesLedger.class + ); + } + return result; } @Override + @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { - if (salesLedgerProduct.getId() == null){ - return salesLedgerProductMapper.insert(salesLedgerProduct); - }else { - return salesLedgerProductMapper.updateById(salesLedgerProduct); + int result; + Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); + + if (salesLedgerProduct.getId() == null) { + result = salesLedgerProductMapper.insert(salesLedgerProduct); + } else { + result = salesLedgerProductMapper.updateById(salesLedgerProduct); + } + + // 濡傛灉鎻掑叆鎴栨洿鏂版垚鍔燂紝骞朵笖鏈� salesLedgerId锛屾墠缁х画鏇存柊涓昏〃閲戦 + if (result > 0 && salesLedgerId != null) { + // 鏌ヨ璇ヤ富琛ㄤ笅鐨勬墍鏈夊瓙琛ㄦ暟鎹� + LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId); + List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); + + // 璋冪敤閫氱敤鏂规硶鏇存柊涓昏〃閲戦 + updateMainContractAmount( + salesLedgerId, + productList, + SalesLedgerProduct::getTaxInclusiveTotalPrice, + salesLedgerMapper, + SalesLedger.class + ); + } + + return result; + } + + /** + * 閫氱敤鏂规硶锛氭牴鎹富琛↖D鍜屽瓙琛ㄥ垪琛紝鏇存柊涓昏〃鐨勫悎鍚岄噾棰� + */ + public <T, S> void updateMainContractAmount( + Long mainId, + List<T> subList, + Function<T, BigDecimal> amountGetter, + BaseMapper<S> mainMapper, + Class<S> mainEntityClass) { + + if (mainId == null || subList == null || subList.isEmpty()) { + return; + } + + BigDecimal totalAmount = subList.stream() + .map(amountGetter) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + try { + S entity = mainEntityClass.getDeclaredConstructor().newInstance(); + Field idField = mainEntityClass.getDeclaredField("id"); + idField.setAccessible(true); + idField.set(entity, mainId); + + Field amountField = mainEntityClass.getDeclaredField("contractAmount"); + amountField.setAccessible(true); + amountField.set(entity, totalAmount); + + mainMapper.updateById(entity); + } catch (Exception e) { + throw new RuntimeException("鍔ㄦ�佹洿鏂颁富琛ㄩ噾棰濆け璐�", e); } } } -- Gitblit v1.9.3