From 2f3cd0975b753d535054a9ffb19e61c4031032a4 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期三, 18 三月 2026 15:32:34 +0800
Subject: [PATCH] feat(sales): 新增加工承揽合同导出功能
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 342 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 229 insertions(+), 113 deletions(-)
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index c11684d..eca1a1e 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,5 +1,11 @@
package com.ruoyi.sales.service.impl;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -8,35 +14,37 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.SaleEnum;
import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.*;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.production.mapper.*;
-import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.sales.dto.*;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
-import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerService;
+import com.ruoyi.sales.vo.ExportProcessContractVo;
import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.BeanUtils;
@@ -46,8 +54,12 @@
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
@@ -76,69 +88,41 @@
@RequiredArgsConstructor
@Slf4j
public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService {
- private final AccountIncomeService accountIncomeService;
-
- private final SalesLedgerMapper salesLedgerMapper;
-
- private final CustomerMapper customerMapper;
-
- private final SalesLedgerProductMapper salesLedgerProductMapper;
- private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
-
- private final CommonFileMapper commonFileMapper;
-
- private final TempFileMapper tempFileMapper;
-
- private final ReceiptPaymentMapper receiptPaymentMapper;
-
- private final ShippingInfoServiceImpl shippingInfoServiceImpl;
-
- private final CommonFileServiceImpl commonFileService;
-
- private final ShippingInfoMapper shippingInfoMapper;
-
- private final InvoiceLedgerMapper invoiceLedgerMapper;
-
- private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
-
- private final SalesLedgerWorkMapper salesLedgerWorkMapper;
-
- private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-
- private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
-
- private final InvoiceRegistrationMapper invoiceRegistrationMapper;
-
- private final ProductOrderMapper productOrderMapper;
-
- private final ProcessRouteMapper processRouteMapper;
- private final ProductProcessRouteMapper productProcessRouteMapper;
-
- private final ProcessRouteItemMapper processRouteItemMapper;
-
- private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
-
- private final ProductWorkOrderMapper productWorkOrderMapper;
-
- private final ProductionProductMainMapper productionProductMainMapper;
-
- private final ProductionProductOutputMapper productionProductOutputMapper;
-
- private final ProductionProductInputMapper productionProductInputMapper;
-
- private final QualityInspectMapper qualityInspectMapper;
-
- @Autowired
- private SysDeptMapper sysDeptMapper;
-
- @Value("${file.upload-dir}")
- private String uploadDir;
-
private static final String LOCK_PREFIX = "contract_no_lock:";
private static final long LOCK_WAIT_TIMEOUT = 10; // 閿佺瓑寰呰秴鏃舵椂闂达紙绉掞級
private static final long LOCK_EXPIRE_TIME = 30; // 閿佽嚜鍔ㄨ繃鏈熸椂闂达紙绉掞級
-
+ private final AccountIncomeService accountIncomeService;
+ private final SalesLedgerMapper salesLedgerMapper;
+ private final CustomerMapper customerMapper;
+ private final SalesLedgerProductMapper salesLedgerProductMapper;
+ private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
+ private final CommonFileMapper commonFileMapper;
+ private final TempFileMapper tempFileMapper;
+ private final ReceiptPaymentMapper receiptPaymentMapper;
+ private final ShippingInfoServiceImpl shippingInfoServiceImpl;
+ private final CommonFileServiceImpl commonFileService;
+ private final ShippingInfoMapper shippingInfoMapper;
+ private final InvoiceLedgerMapper invoiceLedgerMapper;
+ private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
+ private final SalesLedgerWorkMapper salesLedgerWorkMapper;
+ private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+ private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+ private final InvoiceRegistrationMapper invoiceRegistrationMapper;
+ private final ProductOrderMapper productOrderMapper;
+ private final ProcessRouteMapper processRouteMapper;
+ private final ProductProcessRouteMapper productProcessRouteMapper;
+ private final ProcessRouteItemMapper processRouteItemMapper;
+ private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
+ private final ProductWorkOrderMapper productWorkOrderMapper;
+ private final ProductionProductMainMapper productionProductMainMapper;
+ private final ProductionProductOutputMapper productionProductOutputMapper;
+ private final ProductionProductInputMapper productionProductInputMapper;
+ private final QualityInspectMapper qualityInspectMapper;
private final RedisTemplate<String, String> redisTemplate;
+ @Autowired
+ private SysDeptMapper sysDeptMapper;
+ @Value("${file.upload-dir}")
+ private String uploadDir;
@Autowired
private ProductModelMapper productModelMapper;
@@ -146,11 +130,22 @@
private ProductMapper productMapper;
@Autowired
private ProductStructureMapper productStructureMapper;
-;
+ @Autowired
+ private ProductionProductMainService productionProductMainService;
+ ;
+ @Autowired
+ private SysUserMapper sysUserMapper;
@Override
public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
return salesLedgerMapper.selectSalesLedgerList(salesLedgerDto);
+ }
+
+ public List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(Long relateId, SaleEnum type) {
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, relateId);
+ productWrapper.eq(SalesLedgerProduct::getType, type.getCode());
+ return salesLedgerProductMapper.selectList(productWrapper);
}
@Override
@@ -173,6 +168,14 @@
product.setTempNoInvoiceNum(product.getNoInvoiceNum());
product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
product.setRegisterDate(LocalDateTime.now());
+ // 鍙戣揣淇℃伅
+ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
+ .orderByDesc(ShippingInfo::getCreateTime)
+ .last("limit 1"));
+ if (shippingInfo != null) {
+ product.setShippingStatus(shippingInfo.getStatus());
+ }
}
// 3.鏌ヨ涓婁紶鏂囦欢
@@ -316,9 +319,6 @@
return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
}
- @Autowired
- private SysUserMapper sysUserMapper;
-
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult importData(MultipartFile file) {
@@ -342,7 +342,7 @@
// // 浜у搧澶х被鏁版嵁
// List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getProductName,
// salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getProductCategory).collect(Collectors.toList())));
- List<Map<String,Object>> list = productModelMapper.getProductAndModelList();
+ List<Map<String, Object>> list = productModelMapper.getProductAndModelList();
// 褰曞叆浜烘暟鎹�
List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().in(SysUser::getNickName,
salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList())));
@@ -350,7 +350,7 @@
SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
.eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo())
.last("LIMIT 1"));
- if(salesLedger1 != null){
+ if (salesLedger1 != null) {
continue;
}
SalesLedger salesLedger = new SalesLedger();
@@ -383,7 +383,7 @@
throw new RuntimeException("閿�鍞崟鍙�:" + salesLedgerImportDto.getSalesContractNo() + ",鏃犲搴斾骇鍝佹暟鎹紒");
salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
.map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice)
- .reduce(BigDecimal.ZERO,BigDecimal::add));
+ .reduce(BigDecimal.ZERO, BigDecimal::add));
salesLedgerMapper.insert(salesLedger);
@@ -418,6 +418,8 @@
salesLedgerProduct.setApproveStatus(0);
salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
salesLedgerProductMapper.insert(salesLedgerProduct);
+ // 娣诲姞鐢熶骇鏁版嵁
+ salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
}
}
@@ -438,35 +440,124 @@
return lossProductModelDtos;
}
+ @Override
+ public IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page) {
+ IPage<SalesLedgerDto> salesLedgerDtoIPage = salesLedgerMapper.listSalesLedger(page, salesLedgerDto);
+ for (SalesLedgerDto salesLedger : salesLedgerDtoIPage.getRecords()) {
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
+ productWrapper.eq(SalesLedgerProduct::getType, 1);
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+ for (SalesLedgerProduct product : products) {
+ product.setOriginalNoInvoiceNum(product.getNoInvoiceNum());
+ // 鎻愪緵涓存椂鏈紑绁ㄦ暟锛屾湭寮�绁ㄩ噾棰濅緵鍓嶆璁$畻
+ product.setTempnoInvoiceAmount(product.getNoInvoiceAmount());
+ product.setTempNoInvoiceNum(product.getNoInvoiceNum());
+ product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
+ product.setRegisterDate(LocalDateTime.now());
+ // 鍙戣揣淇℃伅
+ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
+ .orderByDesc(ShippingInfo::getCreateTime)
+ .last("limit 1"));
+ if (shippingInfo != null) {
+ product.setShippingStatus(shippingInfo.getStatus());
- // 鍐呴儴绫荤敤浜庡瓨鍌ㄨ仛鍚堢粨鏋�
- private static class GroupedCustomer {
- private final Long customerId;
- private final String customerName;
- private BigDecimal totalAmount = BigDecimal.ZERO;
-
- public GroupedCustomer(Long customerId, String customerName) {
- this.customerId = customerId;
- this.customerName = customerName;
- }
-
- public void addAmount(BigDecimal amount) {
- if (amount != null) {
- this.totalAmount = this.totalAmount.add(amount);
+ }
+ }
+ if (!products.isEmpty()) {
+ salesLedger.setHasChildren(true);
+ salesLedger.setProductData(products);
}
}
- public Long getCustomerId() {
- return customerId;
+ return salesLedgerDtoIPage;
+ }
+
+ @Override
+ public void exportProcessContract(Long id) {
+ //鍔犲伐鎵挎徑鍚堝悓
+ ExportProcessContractVo exportProcessContract = new ExportProcessContractVo();
+ exportProcessContract.setId(id);
+ SalesLedger salesLedger = salesLedgerMapper.selectById(id);
+ // 鏌ヨ瀹㈡埛鍏徃淇℃伅
+ Customer customer = customerMapper.selectById(salesLedger.getCustomerId());
+ exportProcessContract.setCreateTime(LocalDateTimeUtil.format(Optional.ofNullable(salesLedger.getExecutionDate()).orElse(LocalDate.now()), "yyyy骞碝M鏈坉d鏃�"));
+ exportProcessContract.setRemark(Optional.ofNullable(salesLedger.getRemarks()).orElse("鏃�")); // 澶囨敞
+ exportProcessContract.setPlaceOfSinging(Optional.ofNullable(salesLedger.getPlaceOfSinging()).orElse(""));
+
+ // 濉啓鐢叉柟淇℃伅
+ ExportProcessContractVo.Customer partyA = ExportProcessContractVo.Customer.getCustomer(customer);
+ exportProcessContract.setPartyAClientName(customer.getCustomerName());
+ exportProcessContract.setPartyA(partyA);
+
+ // 濉啓涔欐柟淇℃伅
+ ExportProcessContractVo.Customer partyB = new ExportProcessContractVo.Customer();
+ exportProcessContract.setPartyBClientName("");//todo@ 涔欐柟鍏徃鍚嶇О
+ exportProcessContract.setPartyB(partyB);
+
+ // 濉啓鍟嗗搧淇℃伅
+ final BigDecimal[] totalAmount = {BigDecimal.ZERO}; // 鎬婚噾棰�
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
+ productWrapper.eq(SalesLedgerProduct::getType, 1);
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+ List<ExportProcessContractVo.SaleProduct> productList = products.stream().map(it -> {
+ ExportProcessContractVo.SaleProduct saleProduct = BeanUtil.copyProperties(it, ExportProcessContractVo.SaleProduct.class);
+ // 璁$畻鎬讳环鏍�
+ totalAmount[0] = totalAmount[0].add(Optional.ofNullable(saleProduct.getTaxInclusiveTotalPrice()).orElse(BigDecimal.ZERO));
+ return saleProduct;
+ }).collect(Collectors.toList());
+ // 绗竴涓缃� 鍚堝悓缂栧彿
+ if (!productList.isEmpty()) {
+ productList.get(0).setSalesContractNo(salesLedger.getSalesContractNo());
+ }
+ // 鏌ョ湅绋庣巼 鐞嗚涓婄◣鐜囧崟涓�锛屽鏋滃绋庣巼涓虹┖
+ Map<BigDecimal, Long> rateMap = productList.stream().map(product -> product.getTaxRate()).filter(Objects::nonNull)
+ .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
+ String taxRateStr = rateMap.size() == 1 ? rateMap.keySet().iterator().next().toString() + " %" : "";
+ exportProcessContract.setTaxRate(taxRateStr);
+ exportProcessContract.setSaleProducts(productList);// 鍟嗗搧淇℃伅
+ // 璁剧疆澶у啓鐨勬�讳环鏍�
+ exportProcessContract.setTotalAmountZh(Convert.digitToChinese(totalAmount[0].doubleValue()));
+
+ exportProcessContractToWord(exportProcessContract);
+ }
+
+ @SneakyThrows
+ private void exportProcessContractToWord(@NotNull ExportProcessContractVo exportProcessContract){
+ // 纭繚 saleProducts 涓嶄负 null
+ if (exportProcessContract.getSaleProducts() == null) {
+ exportProcessContract.setSaleProducts(new ArrayList<>());
}
- public String getCustomerName() {
- return customerName;
- }
+ // 妯℃澘杈撳叆娴�
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/contract_tmp.docx");
+ Assert.isTrue(inputStream != null, "妯℃澘涓嶅瓨鍦�");
- public BigDecimal getTotalAmount() {
- return totalAmount;
- }
+ // 杞� Map
+ Map<String, Object> dataMap = BeanUtil.beanToMap(exportProcessContract);
+
+ // 缁戝畾寰幆绛栫暐
+ Configure configure = Configure.builder()
+ .bind("saleProducts", new LoopRowTableRenderPolicy())
+ .build();
+
+ // 娓叉煋妯℃澘
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure)
+ .render(dataMap);
+// template.write(FileUtil.getOutputStream("/Users/ONEX/Downloads/a.docx"));
+
+ // 杈撳嚭鍒版祻瑙堝櫒
+ HttpServletResponse response =
+ ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))
+ .getResponse();
+ response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+ response.setHeader("Content-Disposition", "attachment;filename="+ StrUtil.format("{}-{}",exportProcessContract.getPartyAClientName(),exportProcessContract.getCreateTime()) +"鍚堝悓.docx");
+
+ template.write(response.getOutputStream());
+ template.close();
+ response.flushBuffer();
}
/**
@@ -543,25 +634,20 @@
// 鍒犻櫎鍙戣揣鍙拌处璁板綍
List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
.in(ShippingInfo::getSalesLedgerId, idList));
- if(CollectionUtils.isNotEmpty(shippingInfos)){
+ if (CollectionUtils.isNotEmpty(shippingInfos)) {
shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
}
// 鍒犻櫎闄勪欢琛�
commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue());
// 鍒犻櫎鐢熶骇绠℃帶鏁版嵁
- // 鍒犻櫎鐢熶骇璁㈠崟鏁版嵁
- LambdaQueryWrapper<SalesLedgerScheduling> in = new LambdaQueryWrapper<SalesLedgerScheduling>()
- .in(SalesLedgerScheduling::getSalesLedgerId, idList);
- salesLedgerSchedulingMapper.delete(in);
- // 鍒犻櫎鐢熶骇娲惧伐鏁版嵁
- LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>();
- workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList);
- salesLedgerWorkMapper.delete(workOrderWrapper);
- // 鍒犻櫎鐢熶骇鏍哥畻鏁版嵁
- LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
- reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList);
- salesLedgerProductionAccountingMapper.delete(reportWrapper);
+ //鏌ヨ鐢熶骇鎶ュ伐id
+ ArrayList<Long> mainIdList = productionProductMainService.listMain(idList);
+ if (CollectionUtils.isNotEmpty(mainIdList)) {
+ mainIdList.stream().forEach(mainId -> {
+ productionProductMainService.removeProductMain(mainId);
+ });
+ }
// 2. 鍐嶅垹闄や富琛ㄦ暟鎹�
return salesLedgerMapper.deleteBatchIds(idList);
}
@@ -592,7 +678,7 @@
// 4. 澶勭悊瀛愯〃鏁版嵁
List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
if (productList != null && !productList.isEmpty()) {
- handleSalesLedgerProducts(salesLedger.getId(), productList, salesLedgerDto.getType());
+ handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()));
updateMainContractAmount(
salesLedger.getId(),
productList,
@@ -611,8 +697,6 @@
throw new BaseException("鏂囦欢杩佺Щ澶辫触: " + e.getMessage());
}
}
-
- // 鏂囦欢杩佺Щ鏂规硶
/**
* 灏嗕复鏃舵枃浠惰縼绉诲埌姝e紡鐩綍
@@ -689,8 +773,10 @@
}
}
+ // 鏂囦欢杩佺Щ鏂规硶
- private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+ @Override
+ public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) {
// 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰�
Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
.peek(p -> p.setSalesLedgerId(salesLedgerId))
@@ -702,14 +788,14 @@
// 鎵ц鏇存柊鎿嶄綔
if (!updateList.isEmpty()) {
for (SalesLedgerProduct product : updateList) {
- product.setType(type);
+ product.setType(type.getCode());
salesLedgerProductMapper.updateById(product);
}
}
// 鎵ц鎻掑叆鎿嶄綔
if (!insertList.isEmpty()) {
for (SalesLedgerProduct salesLedgerProduct : insertList) {
- salesLedgerProduct.setType(type);
+ salesLedgerProduct.setType(type.getCode());
salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
@@ -829,4 +915,34 @@
throw new RuntimeException("鍔ㄦ�佹洿鏂颁富琛ㄩ噾棰濆け璐�", e);
}
}
+
+ // 鍐呴儴绫荤敤浜庡瓨鍌ㄨ仛鍚堢粨鏋�
+ private static class GroupedCustomer {
+ private final Long customerId;
+ private final String customerName;
+ private BigDecimal totalAmount = BigDecimal.ZERO;
+
+ public GroupedCustomer(Long customerId, String customerName) {
+ this.customerId = customerId;
+ this.customerName = customerName;
+ }
+
+ public void addAmount(BigDecimal amount) {
+ if (amount != null) {
+ this.totalAmount = this.totalAmount.add(amount);
+ }
+ }
+
+ public Long getCustomerId() {
+ return customerId;
+ }
+
+ public String getCustomerName() {
+ return customerName;
+ }
+
+ public BigDecimal getTotalAmount() {
+ return totalAmount;
+ }
+ }
}
--
Gitblit v1.9.3