From 727405950dd5be7d8f99cb7c8a7a18ccb26f9b5a Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 17 四月 2026 17:55:15 +0800
Subject: [PATCH] fix: 销售台账导入模板下载,导入数据验证
---
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | 3
src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java | 2
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 358 +++++++++++++++++++++++++++++++++-----------------
src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java | 2
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java | 2
src/main/resources/static/销售台账导入模板.xlsx | 0
6 files changed, 239 insertions(+), 128 deletions(-)
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 58c3234..2bddc2b 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -71,7 +71,8 @@
public AjaxResult importData(@RequestParam("file")
@ApiParam(value = "Excel鏂囦欢", required = true)
MultipartFile file) {
- return salesLedgerService.importData(file);
+ salesLedgerService.importData(file);
+ return AjaxResult.success();
}
@ApiOperation("瀵煎嚭閿�鍞彴璐︽ā鏉�")
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
index 1aad365..2f2b385 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
@@ -52,7 +52,7 @@
private Date entryDate;
@ApiModelProperty(value = "浠樻鏂瑰紡")
- @Excel(name = "浠樻鏂瑰紡")
+// @Excel(name = "浠樻鏂瑰紡")
private String paymentMethod;
@Excel(name = "澶囨敞")
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
index 11f2f387..0a7b79f 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -39,7 +39,7 @@
@Excel(name = "鏁伴噺")
private BigDecimal quantity;
- @Excel(name = "鍚◣鎬讳环")
+ @Excel(name = "鍚◣鎬讳环", type = Excel.Type.EXPORT)
private BigDecimal taxInclusiveTotalPrice;
@Excel(name = "鍙戠エ绫诲瀷")
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 2e9d5b4..2e36906 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -49,7 +49,7 @@
IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto);
- AjaxResult importData(MultipartFile file);
+ void importData(MultipartFile file);
List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId);
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 4847c22..c270773 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -27,7 +27,6 @@
import com.ruoyi.common.utils.StringUtils;
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.*;
@@ -418,147 +417,258 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public AjaxResult importData(MultipartFile file) {
+ public void importData(MultipartFile file) {
LoginUser loginUser = SecurityUtils.getLoginUser();
- try {
- InputStream inputStream = file.getInputStream();
- ExcelUtil<SalesLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(SalesLedgerImportDto.class);
- Map<String, List<SalesLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("閿�鍞彴璐︽暟鎹�", "閿�鍞骇鍝佹暟鎹�"), inputStream, 0);
- if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("閿�鍞〃鏍间负绌猴紒");
- // 涓氬姟灞傚悎骞�
- List<SalesLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閿�鍞彴璐︽暟鎹�");
- if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閿�鍞彴璐︽暟鎹负绌猴紒");
- List<SalesLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閿�鍞骇鍝佹暟鎹�");
- if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閿�鍞骇鍝佹暟鎹负绌猴紒");
- // 瀹㈡埛鏁版嵁
- List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName,
- salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList())));
- 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())));
- for (SalesLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
- SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
- .eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo())
- .last("LIMIT 1"));
- if (salesLedger1 != null) {
- throw new ServiceException("瀵煎叆澶辫触锛氬悎鍚屽彿 [" + salesLedgerImportDto.getSalesContractNo() + "] 宸插瓨鍦紝璇锋鏌ュ悗閲嶆柊瀵煎叆");
+
+ Map<String, List<SalesLedgerImportDto>> stringListMap;
+ try (InputStream inputStream = file.getInputStream()) {
+ ExcelUtil<SalesLedgerImportDto> excelUtil = new ExcelUtil<>(SalesLedgerImportDto.class);
+ stringListMap = excelUtil.importExcelMultiSheet(Arrays.asList("閿�鍞彴璐︽暟鎹�", "閿�鍞骇鍝佹暟鎹�"), inputStream, 0);
+ } catch (IOException e) {
+ log.error("閿�鍞彴璐﹀鍏ュけ璐ワ細璇诲彇/瑙f瀽Excel寮傚父", e);
+ throw new ServiceException("瀵煎叆澶辫触锛氳鍙�/瑙f瀽Excel寮傚父");
+ } catch (Exception e) {
+ log.error("閿�鍞彴璐﹀鍏ュけ璐ワ細瑙f瀽Excel寮傚父", e);
+ throw new ServiceException("瀵煎叆澶辫触锛氳В鏋怑xcel寮傚父");
+ }
+
+ if (CollectionUtils.isEmpty(stringListMap)) {
+ throw new ServiceException("瀵煎叆澶辫触,閿�鍞〃鏍间负绌�");
+ }
+ // 涓氬姟灞傚悎骞�
+ List<SalesLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閿�鍞彴璐︽暟鎹�");
+ if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) {
+ throw new ServiceException("瀵煎叆澶辫触,閿�鍞彴璐︽暟鎹负绌�");
+ }
+ List<SalesLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閿�鍞骇鍝佹暟鎹�");
+ if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) {
+ throw new ServiceException("瀵煎叆澶辫触,閿�鍞骇鍝佹暟鎹负绌�");
+ }
+ // 瀹㈡埛鏁版嵁
+ List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName,
+ salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList())));
+ 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())));
+ for (SalesLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
+ SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+ .eq(SalesLedger::getSalesContractNo, salesLedgerImportDto.getSalesContractNo())
+ .last("LIMIT 1"));
+ if (salesLedger1 != null) {
+ throw new ServiceException("瀵煎叆澶辫触锛氬悎鍚屽彿 [" + salesLedgerImportDto.getSalesContractNo() + "] 宸插瓨鍦紝璇锋鏌ュ悗閲嶆柊瀵煎叆");
+ }
+ SalesLedger salesLedger = new SalesLedger();
+ BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
+ // 鏍¢獙锛氱璁㈡棩鏈熴�佸綍鍏ユ棩鏈熶笉鑳戒负绌�
+ if (salesLedgerImportDto.getExecutionDate() == null) {
+ throw new ServiceException("瀵煎叆澶辫触锛氬悎鍚屽彿[" + salesLedgerImportDto.getSalesContractNo() + "] 绛捐鏃ユ湡涓嶈兘涓虹┖");
+ }
+ if (salesLedgerImportDto.getEntryDate() == null) {
+ throw new ServiceException("瀵煎叆澶辫触锛氬悎鍚屽彿[" + salesLedgerImportDto.getSalesContractNo() + "] 褰曞叆鏃ユ湡涓嶈兘涓虹┖");
+ }
+ salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate()));
+
+ LocalDate expectedDeliveryDate = DateUtils.toLocalDate(salesLedgerImportDto.getEntryDate()).plusDays(7);
+ LocalDate importDeliveryDate = salesLedgerImportDto.getDeliveryDate() == null
+ ? null
+ : DateUtils.toLocalDate(salesLedgerImportDto.getDeliveryDate());
+ // 浜や粯鏃ユ湡涓虹┖鍒欓粯璁ゅ彇褰曞叆鏃ユ湡鍚�7澶�
+ salesLedger.setDeliveryDate(importDeliveryDate == null ? expectedDeliveryDate : importDeliveryDate);
+ // 閫氳繃瀹㈡埛鍚嶇О鏌ヨ瀹㈡埛ID锛屽鎴峰悎鍚屽彿
+ salesLedger.setCustomerId(customers.stream()
+ .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
+ .findFirst()
+ .map(Customer::getId)
+ .orElse(null));
+ salesLedger.setCustomerContractNo(customers.stream()
+ .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
+ .findFirst()
+ .map(Customer::getTaxpayerIdentificationNumber)
+ .orElse(null));
+ Long aLong = sysUsers.stream()
+ .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson()))
+ .findFirst()
+ .map(SysUser::getUserId)
+ .orElse(null);
+ if (aLong == null) {
+ throw new ServiceException("褰曞叆浜�:" + salesLedger.getEntryPerson() + ",鏃犲搴旂敤鎴凤紒");
+ }
+ salesLedger.setEntryPerson(aLong.toString());
+ // 閿�鍞骇鍝佹暟鎹粦瀹氾紝閫氳繃閿�鍞崟鍙疯幏鍙栧搴旈攢鍞骇鍝佹暟鎹�
+ List<SalesLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
+ .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getSalesContractNo().equals(salesLedger.getSalesContractNo()))
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(salesLedgerProductImportDtos)) {
+ throw new ServiceException("閿�鍞崟鍙�:" + salesLedgerImportDto.getSalesContractNo() + ",鏃犲搴斾骇鍝佹暟鎹紒");
+ }
+ // 鍙戣揣鐘舵��
+ salesLedger.setDeliveryStatus(1);
+ salesLedger.setContractAmount(BigDecimal.ZERO);
+ salesLedgerMapper.insert(salesLedger);
+ BigDecimal contractAmount = BigDecimal.ZERO;
+
+ for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
+ SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
+ BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
+ salesLedgerProduct.setFloorCode(salesLedgerProductImportDto.getFloorNo());
+ salesLedgerProduct.setProcessRequirement(salesLedgerProductImportDto.getProcessingRequirements());
+ salesLedgerProduct.setRemark(salesLedgerProductImportDto.getRemarks());
+ salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
+ salesLedgerProduct.setType(1);
+
+ BigDecimal quantity = defaultDecimal(salesLedgerProduct.getQuantity());
+ BigDecimal width = defaultDecimal(salesLedgerProduct.getWidth());
+ BigDecimal height = defaultDecimal(salesLedgerProduct.getHeight());
+ BigDecimal taxRateRaw = salesLedgerProduct.getTaxRate();
+ BigDecimal taxRate = defaultDecimal(taxRateRaw);
+ BigDecimal unitPrice = defaultDecimal(salesLedgerProduct.getTaxInclusiveUnitPrice());
+
+ // 瀵煎叆闄愬埗锛氬/楂�/鏁伴噺/閲戦(鍗曚环)/绋庣巼 涓嶈兘涓�0鎴栬礋鏁�
+ String locate = buildImportLocate(salesLedger.getSalesContractNo(), salesLedgerProductImportDto);
+ assertPositive(quantity, "鏁伴噺", locate);
+ assertPositive(width, "瀹�(mm)", locate);
+ assertPositive(height, "楂�(mm)", locate);
+ assertPositive(unitPrice, "鍚◣鍗曚环", locate);
+ assertNonNegative(taxRateRaw, "绋庣巼", locate);
+
+ BigDecimal actualPieceArea = BigDecimal.ZERO;
+ if (width.compareTo(BigDecimal.ZERO) > 0 && height.compareTo(BigDecimal.ZERO) > 0) {
+ actualPieceArea = width.multiply(height).divide(new BigDecimal("1000000"), 4, RoundingMode.HALF_UP);
}
- SalesLedger salesLedger = new SalesLedger();
- BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
- salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate()));
- // 閫氳繃瀹㈡埛鍚嶇О鏌ヨ瀹㈡埛ID锛屽鎴峰悎鍚屽彿
- salesLedger.setCustomerId(customers.stream()
- .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
- .findFirst()
- .map(Customer::getId)
- .orElse(null));
- salesLedger.setCustomerContractNo(customers.stream()
- .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
- .findFirst()
- .map(Customer::getTaxpayerIdentificationNumber)
- .orElse(null));
- Long aLong = sysUsers.stream()
- .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson()))
- .findFirst()
- .map(SysUser::getUserId)
- .orElse(null);
- if (aLong == null)
- throw new ServiceException("褰曞叆浜�:" + salesLedger.getEntryPerson() + ",鏃犲搴旂敤鎴凤紒");
- salesLedger.setEntryPerson(aLong.toString());
- // 閿�鍞骇鍝佹暟鎹粦瀹氾紝閫氳繃閿�鍞崟鍙疯幏鍙栧搴旈攢鍞骇鍝佹暟鎹�
- List<SalesLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
- .filter(salesLedgerProductImportDto -> salesLedgerProductImportDto.getSalesContractNo().equals(salesLedger.getSalesContractNo()))
- .collect(Collectors.toList());
- if (CollectionUtils.isEmpty(salesLedgerProductImportDtos))
- throw new RuntimeException("閿�鍞崟鍙�:" + salesLedgerImportDto.getSalesContractNo() + ",鏃犲搴斾骇鍝佹暟鎹紒");
- salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
- .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice)
- .reduce(BigDecimal.ZERO, BigDecimal::add));
- // 鍙戣揣鐘舵��
- salesLedger.setDeliveryStatus(1);
- salesLedgerMapper.insert(salesLedger);
+ salesLedgerProduct.setActualPieceArea(actualPieceArea);
+ salesLedgerProduct.setActualTotalArea(actualPieceArea.multiply(quantity).setScale(4, RoundingMode.HALF_UP));
- for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
- SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
- BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
- salesLedgerProduct.setFloorCode(salesLedgerProductImportDto.getFloorNo());
- salesLedgerProduct.setProcessRequirement(salesLedgerProductImportDto.getProcessingRequirements());
- salesLedgerProduct.setRemark(salesLedgerProductImportDto.getRemarks());
- salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
- salesLedgerProduct.setType(1);
- // 璁$畻涓嶅惈绋庢�讳环
- salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
- salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
- salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxExclusiveTotalPrice());
- list.stream()
- .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
- .findFirst()
- .ifPresent(map -> {
- salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
- salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
- });
- salesLedgerProduct.setRegister(loginUser.getNickName());
- salesLedgerProduct.setRegisterDate(LocalDateTime.now());
- salesLedgerProduct.setApproveStatus(0);
- salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
- salesLedgerProductMapper.insert(salesLedgerProduct);
+ BigDecimal settlePieceArea = salesLedgerProduct.getSettlePieceArea() == null
+ ? actualPieceArea
+ : salesLedgerProduct.getSettlePieceArea();
+ salesLedgerProduct.setSettlePieceArea(settlePieceArea);
+ salesLedgerProduct.setSettleTotalArea(settlePieceArea.multiply(quantity).setScale(4, RoundingMode.HALF_UP));
- // 澶勭悊棰濆鍔犲伐淇℃伅
- String extraProcessing = salesLedgerProductImportDto.getExtraProcessing();
- if (StringUtils.hasText(extraProcessing)) {
- List<SalesLedgerProductProcess> processList = new ArrayList<>();
- // 涓嫳鏂囧垎鍙�
- String[] items = extraProcessing.split("[;锛沒");
- for (String item : items) {
- if (StringUtils.hasText(item)) {
- String[] parts = item.split("[-鈥攡锝瀅");
- if (parts.length >= 2) {
- String processName = parts[0].trim();
- String qtyStr = parts[1].trim();
- try {
- BigDecimal quantity = new BigDecimal(qtyStr);
- SalesLedgerProductProcess process = salesLedgerProductProcessService.getOne(
- new LambdaQueryWrapper<SalesLedgerProductProcess>()
- .eq(SalesLedgerProductProcess::getProcessName, processName)
- .last("LIMIT 1")
+ BigDecimal perimeter = BigDecimal.ZERO;
+ if (width.compareTo(BigDecimal.ZERO) > 0 && height.compareTo(BigDecimal.ZERO) > 0) {
+ perimeter = width.add(height)
+ .multiply(new BigDecimal("2"))
+ .divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP);
+ }
+ salesLedgerProduct.setPerimeter(perimeter);
+
+ BigDecimal extraProcessAmountPerPiece = BigDecimal.ZERO;
+ list.stream()
+ .filter(Objects::nonNull)
+ .filter(map -> Objects.equals(Objects.toString(map.get("productName"), null), salesLedgerProduct.getProductCategory())
+ && Objects.equals(Objects.toString(map.get("model"), null), salesLedgerProduct.getSpecificationModel()))
+ .findFirst()
+ .ifPresent(map -> {
+ salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
+ salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
+ });
+ salesLedgerProduct.setRegister(loginUser.getNickName());
+ salesLedgerProduct.setRegisterDate(LocalDateTime.now());
+ salesLedgerProduct.setApproveStatus(0);
+ salesLedgerProduct.setProductStockStatus(0);
+
+ // 澶勭悊棰濆鍔犲伐淇℃伅
+ String extraProcessing = salesLedgerProductImportDto.getExtraProcessing();
+ List<SalesLedgerProductProcess> processList = new ArrayList<>();
+ if (StringUtils.hasText(extraProcessing)) {
+ // 涓嫳鏂囧垎鍙�
+ String[] items = extraProcessing.split("[;锛沒");
+ for (String item : items) {
+ if (StringUtils.hasText(item)) {
+ String[] parts = item.split("[-鈥攡锝瀅");
+ if (parts.length >= 2) {
+ String processName = parts[0].trim();
+ String qtyStr = parts[1].trim();
+ try {
+ BigDecimal processQty = new BigDecimal(qtyStr);
+ SalesLedgerProductProcess process = salesLedgerProductProcessService.getOne(
+ new LambdaQueryWrapper<SalesLedgerProductProcess>()
+ .eq(SalesLedgerProductProcess::getProcessName, processName)
+ .last("LIMIT 1")
+ );
+ if (process != null) {
+ SalesLedgerProductProcess p = new SalesLedgerProductProcess();
+ p.setId(process.getId());
+ p.setQuantity(processQty.intValue());
+ processList.add(p);
+ extraProcessAmountPerPiece = extraProcessAmountPerPiece.add(
+ defaultDecimal(process.getUnitPrice()).multiply(processQty)
);
- if (process != null) {
- SalesLedgerProductProcess p = new SalesLedgerProductProcess();
- p.setId(process.getId());
- p.setQuantity(quantity.intValue());
- processList.add(p);
- }
- } catch (Exception e) {
- log.error("瑙f瀽棰濆鍔犲伐鏁伴噺澶辫触: {}", qtyStr);
}
+ } catch (Exception e) {
+ log.error("瑙f瀽棰濆鍔犲伐鏁伴噺澶辫触: {}", qtyStr);
}
}
}
- if (!processList.isEmpty()) {
- salesLedgerProductProcessBindService.updateProductProcessBind(processList, salesLedgerProduct.getId());
- }
}
-
- // 娣诲姞鐢熶骇鏁版嵁
- salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
}
- }
- return AjaxResult.success("瀵煎叆鎴愬姛");
- } catch (Exception e) {
- e.printStackTrace();
+ // 鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺 + 棰濆鍔犲伐閲戦 * 鏁伴噺
+ BigDecimal taxInclusiveTotalPrice = unitPrice.multiply(settlePieceArea)
+ .multiply(quantity)
+ .add(extraProcessAmountPerPiece.multiply(quantity))
+ .setScale(2, RoundingMode.HALF_UP);
+ salesLedgerProduct.setTaxInclusiveTotalPrice(taxInclusiveTotalPrice);
+ assertPositive(taxInclusiveTotalPrice, "鍚◣鎬讳环", locate);
+
+ // 绋庣巼鍏佽涓虹┖锛岀┖鍊兼寜0澶勭悊
+ BigDecimal taxDivisor = BigDecimal.ONE.add(taxRate.divide(new BigDecimal("100"), 6, RoundingMode.HALF_UP));
+ salesLedgerProduct.setTaxExclusiveTotalPrice(
+ taxInclusiveTotalPrice.divide(taxDivisor, 2, RoundingMode.HALF_UP)
+ );
+ salesLedgerProduct.setNoInvoiceNum(quantity);
+ salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxExclusiveTotalPrice());
+ salesLedgerProduct.setPendingInvoiceTotal(taxInclusiveTotalPrice);
+ salesLedgerProductMapper.insert(salesLedgerProduct);
+ if (!processList.isEmpty()) {
+ salesLedgerProductProcessBindService.updateProductProcessBind(processList, salesLedgerProduct.getId());
+ }
+ // 娣诲姞鐢熶骇鏁版嵁
+ salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
+ contractAmount = contractAmount.add(taxInclusiveTotalPrice);
+ }
+ salesLedger.setContractAmount(contractAmount);
+ salesLedgerMapper.updateById(salesLedger);
}
- return AjaxResult.success("瀵煎叆澶辫触");
+ }
+
+ private BigDecimal defaultDecimal(BigDecimal value) {
+ return value == null ? BigDecimal.ZERO : value;
+ }
+
+ private void assertPositive(BigDecimal value, String fieldName, String locate) {
+ if (value == null || value.compareTo(BigDecimal.ZERO) <= 0) {
+ throw new ServiceException("瀵煎叆澶辫触锛�" + locate + "銆�" + fieldName + "銆戝繀椤诲ぇ浜�0");
+ }
+ }
+
+ private void assertNonNegative(BigDecimal value, String fieldName, String locate) {
+ if (value != null && value.compareTo(BigDecimal.ZERO) < 0) {
+ throw new ServiceException("瀵煎叆澶辫触锛�" + locate + "銆�" + fieldName + "銆戜笉鑳戒负璐熸暟");
+ }
+ }
+
+ private String buildImportLocate(String salesContractNo, SalesLedgerProductImportDto dto) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("閿�鍞崟鍙穂").append(salesContractNo == null ? "" : salesContractNo).append("]");
+ if (dto != null) {
+ if (StringUtils.hasText(dto.getProductCategory())) {
+ sb.append(" 浜у搧澶х被[").append(dto.getProductCategory()).append("]");
+ }
+ if (StringUtils.hasText(dto.getSpecificationModel())) {
+ sb.append(" 瑙勬牸鍨嬪彿[").append(dto.getSpecificationModel()).append("]");
+ }
+ if (StringUtils.hasText(dto.getFloorNo())) {
+ sb.append(" 妤煎眰缂栧彿[").append(dto.getFloorNo()).append("]");
+ }
+ }
+ return sb.toString();
}
@Override
public List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId) {
-
-
List<LossProductModelDto> lossProductModelDtos = salesLedgerProductMapper.selectProductBomStructure(salesLedgerId);
-
-
return lossProductModelDtos;
}
diff --git "a/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
index 79c2656..da4677c 100644
--- "a/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
+++ "b/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ
--
Gitblit v1.9.3