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