From 9aec7c5d4e11dcd66f0c886c759bbaa54efe6211 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 23 一月 2026 14:53:22 +0800
Subject: [PATCH] yys 销售导入
---
src/main/resources/mapper/basic/ProductModelMapper.xml | 9 ++++
src/main/java/com/ruoyi/common/utils/DateUtils.java | 9 ++++
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | 45 ++++++++++++++++++++++
src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java | 6 +++
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java | 4 ++
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 47 +++++++++++++----------
src/main/resources/static/销售台账导入模板.xlsx | 0
7 files changed, 100 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java b/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
index 05d5792..bddcca4 100644
--- a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
+++ b/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -7,6 +7,9 @@
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Map;
+
/**
* 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
@@ -22,4 +25,5 @@
ProductModel selectLatestRecord();
+ List<Map<String, Object>> getProductAndModelList();
}
diff --git a/src/main/java/com/ruoyi/common/utils/DateUtils.java b/src/main/java/com/ruoyi/common/utils/DateUtils.java
index 20dbbb7..0fa7e5a 100644
--- a/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -43,6 +43,15 @@
return new Date();
}
+ public static LocalDate toLocalDate(Date date){
+ if(date == null) return LocalDate.now();
+ // 2. 鎸囧畾鍥哄畾鏃跺尯杞崲锛堝涓滃叓鍖篣TC+8銆乁TC闆舵椂鍖猴級
+ return date.toInstant()
+ .atZone(ZoneId.of("Asia/Shanghai")) // 涓滃叓鍖猴紙鍖椾含/涓婃捣鏃跺尯锛�
+ // .atZone(ZoneId.of("UTC")) // 鍙�夛細UTC闆舵椂鍖�
+ .toLocalDate();
+ }
+
/**
* 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd
*
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 016141c..46d3d48 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -26,13 +26,19 @@
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.math.BigDecimal;
+import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -49,6 +55,7 @@
@RequestMapping("/sales/ledger")
@AllArgsConstructor
@Api(tags = "閿�鍞彴璐�")
+@Slf4j
public class SalesLedgerController extends BaseController {
private ISalesLedgerService salesLedgerService;
@@ -76,6 +83,44 @@
return salesLedgerService.importData(file);
}
+ @ApiOperation("瀵煎嚭閿�鍞彴璐︽ā鏉�")
+ @PostMapping("/exportTemplate")
+ public void exportTemplate(HttpServletResponse response) {
+ // 1. 妯℃澘鏂囦欢鍦╮esources/static涓嬬殑璺緞
+ String templatePath = "static/閿�鍞彴璐﹀鍏ユā鏉�.xlsx";
+
+ // 2. 鑾峰彇妯℃澘鏂囦欢鐨勮緭鍏ユ祦
+ try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath)) {
+ if (inputStream == null) {
+ throw new FileNotFoundException("妯℃澘鏂囦欢涓嶅瓨鍦細" + templatePath);
+ }
+
+ // 3. 璁剧疆鍝嶅簲澶达紝瑙﹀彂娴忚鍣ㄤ笅杞�
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ String fileName = URLEncoder.encode("閿�鍞彴璐﹀鍏ユā鏉�.xlsx", "utf-8").replaceAll("\\+", "%20");
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName);
+
+ // 4. 灏嗘ā鏉挎枃浠跺啓鍏ュ搷搴旇緭鍑烘祦
+ try (OutputStream outputStream = response.getOutputStream()) {
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = inputStream.read(buffer)) > 0) {
+ outputStream.write(buffer, 0, len);
+ }
+ outputStream.flush();
+ }
+ } catch (IOException e) {
+ log.error("瀵煎嚭閿�鍞彴璐︽ā鏉垮け璐�", e);
+ // 鑻ユā鏉挎枃浠惰鍙栧け璐ワ紝杩斿洖閿欒鎻愮ず
+ try {
+ response.getWriter().write("妯℃澘瀵煎嚭澶辫触锛�" + e.getMessage());
+ } catch (IOException ex) {
+ log.error("鍝嶅簲杈撳嚭閿欒", ex);
+ }
+ }
+ }
+
/**
* 鏌ヨ閿�鍞彴璐﹀垪琛�
*/
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
index 52c3b22..74615bf 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
@@ -31,6 +31,8 @@
private String salesman;
@Excel(name = "瀹㈡埛鍚嶇О")
private String customerName;
+ @Excel(name = "椤圭洰鍚嶇О")
+ private String projectName;
@Excel(name = "褰曞叆浜�")
private String entryPerson;
@Excel(name = "澶囨敞")
@@ -44,5 +46,9 @@
@Excel(name = "鍚堝悓閲戦")
private BigDecimal contractAmount;
+ @ApiModelProperty(value = "浠樻鏂瑰紡")
+ @Excel(name = "浠樻鏂瑰紡")
+ private String paymentMethod;
+
}
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 85d05cc..0ebfb5b 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -19,6 +19,7 @@
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;
@@ -356,19 +357,21 @@
if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閿�鍞骇鍝佹暟鎹负绌猴紒");
// 瀹㈡埛鏁版嵁
List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName,
- salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getCustomerName).toArray(String[]::new)));
- // 瑙勬牸鍨嬪彿鏁版嵁
- List<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getModel,
- salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getSpecificationModel).toArray(String[]::new)));
- // 浜у搧澶х被鏁版嵁
- List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getProductName,
- salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getProductCategory).toArray(String[]::new)));
+ 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).toArray(String[]::new)));
+ salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getEntryPerson).collect(Collectors.toList())));
for (SalesLedgerImportDto salesLedgerImportDto : salesLedgerImportDtoList) {
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()))
@@ -404,25 +407,29 @@
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());
-
- salesLedgerProduct.setProductId(productList.stream()
- .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory()))
+ list.stream()
+ .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
.findFirst()
- .map(Product::getId)
- .orElse(null));
- salesLedgerProduct.setProductModelId(productModels.stream()
- .filter(productModel -> productModel.getModel().equals(salesLedgerProduct.getSpecificationModel()))
- .findFirst()
- .map(ProductModel::getId)
- .orElse(null));
+ .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("瀵煎叆鎴愬姛");
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index e12b63c..317f5d9 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -97,5 +97,14 @@
ORDER BY pm.id DESC
</select>
+ <select id="getProductAndModelList" resultType="java.util.Map">
+ select p.id as id,
+ pm.id as modelId,
+ p.product_name as productName ,
+ pm.model as model
+ from product_model pm
+ left join product p on p.id = pm.product_id
+ order by p.id,pm.id desc
+ </select>
</mapper>
\ No newline at end of file
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"
new file mode 100644
index 0000000..bbb5525
--- /dev/null
+++ "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