From 62fe432c21e9fd87d3fc7558c8c5a2863e220a98 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 29 一月 2026 18:00:34 +0800
Subject: [PATCH] feat: 财务分析大屏接口
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 226 +++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 174 insertions(+), 52 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 43d90f8..f62f179 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,7 +1,6 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -9,27 +8,30 @@
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.ruoyi.account.pojo.AccountIncome;
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.basic.pojo.ProductModel;
import com.ruoyi.common.enums.FileNameType;
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.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.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
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.MonthlyAmountDto;
-import com.ruoyi.sales.dto.SalesLedgerDto;
+import com.ruoyi.sales.dto.*;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
import com.ruoyi.sales.service.ISalesLedgerProductService;
@@ -44,10 +46,13 @@
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -85,6 +90,12 @@
private final TempFileMapper tempFileMapper;
private final ReceiptPaymentMapper receiptPaymentMapper;
+
+ private final ShippingInfoServiceImpl shippingInfoServiceImpl;
+
+ private final CommonFileServiceImpl commonFileService;
+
+ private final ShippingInfoMapper shippingInfoMapper;
private final InvoiceLedgerMapper invoiceLedgerMapper;
@@ -130,8 +141,12 @@
private final RedisTemplate<String, String> redisTemplate;
@Autowired
private ProductModelMapper productModelMapper;
+
+ @Autowired
+ private ProductMapper productMapper;
@Autowired
private ProductStructureMapper productStructureMapper;
+;
@Override
public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -219,8 +234,8 @@
// 鏌ヨ鍘熷鏁版嵁
LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.select(SalesLedger::getCustomerId,
- SalesLedger::getCustomerName,
- SalesLedger::getContractAmount)
+ SalesLedger::getCustomerName,
+ SalesLedger::getContractAmount)
.orderByDesc(SalesLedger::getContractAmount);
List<SalesLedger> records = salesLedgerMapper.selectList(queryWrapper);
@@ -228,7 +243,7 @@
Map<Long, GroupedCustomer> groupedMap = new LinkedHashMap<>(); // 浣跨敤LinkedHashMap淇濇寔鎺掑簭
for (SalesLedger record : records) {
groupedMap.computeIfAbsent(record.getCustomerId(),
- k -> new GroupedCustomer(record.getCustomerId(), record.getCustomerName()))
+ k -> new GroupedCustomer(record.getCustomerId(), record.getCustomerName()))
.addAmount(record.getContractAmount());
}
@@ -248,75 +263,51 @@
@Override
public List<MonthlyAmountDto> getAmountHalfYear(Integer type) {
+
LocalDate now = LocalDate.now();
- LocalDateTime currentDateTime = LocalDateTime.now();
-
- // 鏍规嵁 type 纭畾鏌ヨ鐨勬椂闂撮棿闅旓紙澶╂暟锛夊拰鎬绘煡璇㈠ぉ鏁�
- int daysPerPeriod;
- int totalDays;
- switch (type) {
- case 1:
- daysPerPeriod = 5; // 姣�5澶╂煡涓�娆�
- totalDays = 30; // 6娆� 脳 5澶� = 30澶�
- break;
- case 2:
- daysPerPeriod = 15; // 姣�15澶╂煡涓�娆�
- totalDays = 90; // 6娆� 脳 15澶� = 90澶�
- break;
- case 3:
- daysPerPeriod = 30; // 姣�30澶╂煡涓�娆�
- totalDays = 180; // 6娆� 脳 30澶� = 180澶�
- break;
- default:
- throw new IllegalArgumentException("Invalid type value: " + type);
- }
-
List<MonthlyAmountDto> result = new ArrayList<>();
- // 寰幆6娆★紝姣忔鏌ヨ涓�涓椂闂存鐨勬暟鎹�
- for (int i = 0; i < 6; i++) {
- // 璁$畻褰撳墠鏃堕棿娈电殑璧峰鍜岀粨鏉熸椂闂�
- LocalDateTime endTime = currentDateTime.minusDays(i * daysPerPeriod);
- LocalDateTime startTime = endTime.minusDays(daysPerPeriod);
+ for (int i = 5; i >= 0; i--) {
+ YearMonth yearMonth = YearMonth.from(now.minusMonths(i));
+ LocalDateTime startTime = yearMonth.atDay(1).atStartOfDay();
+ LocalDateTime endTime = yearMonth.atEndOfMonth().atTime(23, 59, 59);
- // 鏌ヨ鍥炴閲戦
+ // 鍥炴閲戦
LambdaQueryWrapper<ReceiptPayment> receiptPaymentQuery = new LambdaQueryWrapper<>();
receiptPaymentQuery
.ge(ReceiptPayment::getCreateTime, startTime)
- .lt(ReceiptPayment::getCreateTime, endTime);
- List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(receiptPaymentQuery);
+ .le(ReceiptPayment::getCreateTime, endTime);
- // 鏌ヨ寮�绁ㄩ噾棰�
- LambdaQueryWrapper<InvoiceLedger> invoiceLedgerQuery = new LambdaQueryWrapper<>();
- invoiceLedgerQuery
- .ge(InvoiceLedger::getCreateTime, startTime)
- .lt(InvoiceLedger::getCreateTime, endTime);
- List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(invoiceLedgerQuery);
+ List<ReceiptPayment> receiptPayments =
+ receiptPaymentMapper.selectList(receiptPaymentQuery);
- // 璁$畻鍥炴鎬婚
BigDecimal receiptAmount = receiptPayments.stream()
.map(ReceiptPayment::getReceiptPaymentAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
- // 璁$畻寮�绁ㄦ�婚
+ // 寮�绁ㄩ噾棰�
+ LambdaQueryWrapper<InvoiceLedger> invoiceLedgerQuery = new LambdaQueryWrapper<>();
+ invoiceLedgerQuery
+ .ge(InvoiceLedger::getCreateTime, startTime)
+ .le(InvoiceLedger::getCreateTime, endTime);
+
+ List<InvoiceLedger> invoiceLedgers =
+ invoiceLedgerMapper.selectList(invoiceLedgerQuery);
+
BigDecimal invoiceAmount = invoiceLedgers.stream()
.map(InvoiceLedger::getInvoiceTotal)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
- // 鏋勯�犺繑鍥炵殑 DTO
MonthlyAmountDto dto = new MonthlyAmountDto();
- dto.setMonth(startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " ~ " +
- endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ dto.setMonth(yearMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
dto.setReceiptAmount(receiptAmount);
dto.setInvoiceAmount(invoiceAmount);
result.add(dto);
}
- // 鍙嶈浆鍒楄〃锛屼娇鏃堕棿椤哄簭浠庢棭鍒版櫄
- Collections.reverse(result);
return result;
}
@@ -324,6 +315,129 @@
public IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
}
+
+ @Autowired
+ private SysUserMapper sysUserMapper;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public AjaxResult 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<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getModel,
+// salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getSpecificationModel).collect(Collectors.toList())));
+// // 浜у搧澶х被鏁版嵁
+// 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<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){
+ continue;
+ }
+ 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 RuntimeException("褰曞叆浜�:" + 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));
+ salesLedgerMapper.insert(salesLedger);
+
+
+ for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
+ SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
+ BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
+ 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.setProductId(productList.stream()
+// .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory()))
+// .findFirst()
+// .map(Product::getId)
+// .orElse(null));
+// salesLedgerProduct.setProductModelId(productModels.stream()
+// .filter(productModel -> productModel.getModel().equals(salesLedgerProduct.getSpecificationModel()))
+// .findFirst()
+// .map(ProductModel::getId)
+// .orElse(null));
+ salesLedgerProduct.setRegister(loginUser.getNickName());
+ salesLedgerProduct.setRegisterDate(LocalDateTime.now());
+ salesLedgerProduct.setApproveStatus(0);
+ salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
+ salesLedgerProductMapper.insert(salesLedgerProduct);
+ }
+ }
+
+ return AjaxResult.success("瀵煎叆鎴愬姛");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return AjaxResult.success("瀵煎叆澶辫触");
+ }
+
+ @Override
+ public List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId) {
+
+
+ List<LossProductModelDto> lossProductModelDtos = salesLedgerProductMapper.selectProductBomStructure(salesLedgerId);
+
+
+ return lossProductModelDtos;
+ }
+
// 鍐呴儴绫荤敤浜庡瓨鍌ㄨ仛鍚堢粨鏋�
private static class GroupedCustomer {
@@ -426,6 +540,14 @@
wrapperTree.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgerIds);
receiptPaymentMapper.delete(wrapperTree);
}
+ // 鍒犻櫎鍙戣揣鍙拌处璁板綍
+ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getSalesLedgerId, idList));
+ if(CollectionUtils.isNotEmpty(shippingInfos)){
+ shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
+ }
+ // 鍒犻櫎闄勪欢琛�
+ commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue());
// 鍒犻櫎鐢熶骇绠℃帶鏁版嵁
// 鍒犻櫎鐢熶骇璁㈠崟鏁版嵁
--
Gitblit v1.9.3