From f89381d3183b98f0607c4fbe6010daada5a4e1b7 Mon Sep 17 00:00:00 2001
From: zzs <hi@lnbiuc.copm>
Date: Fri, 29 Nov 2024 16:28:27 +0800
Subject: [PATCH] feat:generate excel template, parsing excel data

---
 .../framework/excel/core/util/ExcelUtils.java |  8 +--
 .../ensign-module-crm-biz/pom.xml             |  5 ++
 .../crm/ExcelTemplateController.java          | 44 +++++++++++++++++
 .../crm/model/DealerRegistrationModel.java    | 49 +++++++++++++++++++
 .../crm/module/crm/model/RegionOption.java    | 12 +++++
 .../crm/service/ExcelTemplateService.java     | 36 ++++++++++++++
 .../system/enums/DictTypeConstants.java       |  3 ++
 7 files changed, 154 insertions(+), 3 deletions(-)
 create mode 100644 ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ExcelTemplateController.java
 create mode 100644 ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/DealerRegistrationModel.java
 create mode 100644 ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/RegionOption.java
 create mode 100644 ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ExcelTemplateService.java

diff --git a/ensign-framework/ensign-spring-boot-starter-excel/src/main/java/com/ensign/crm/framework/excel/core/util/ExcelUtils.java b/ensign-framework/ensign-spring-boot-starter-excel/src/main/java/com/ensign/crm/framework/excel/core/util/ExcelUtils.java
index 090e10e..d6a9f0d 100644
--- a/ensign-framework/ensign-spring-boot-starter-excel/src/main/java/com/ensign/crm/framework/excel/core/util/ExcelUtils.java
+++ b/ensign-framework/ensign-spring-boot-starter-excel/src/main/java/com/ensign/crm/framework/excel/core/util/ExcelUtils.java
@@ -1,9 +1,9 @@
 package com.ensign.crm.framework.excel.core.util;
 
-import com.ensign.crm.framework.excel.core.handler.SelectSheetWriteHandler;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.converters.longconverter.LongStringConverter;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.ensign.crm.framework.excel.core.handler.SelectSheetWriteHandler;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -32,6 +32,10 @@ public class ExcelUtils {
      */
     public static <T> void write(HttpServletResponse response, String filename, String sheetName,
                                  Class<T> head, List<T> data) throws IOException {
+
+        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
+        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+
         // 输出 Excel
         EasyExcel.write(response.getOutputStream(), head)
                 .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
@@ -40,8 +44,6 @@ public class ExcelUtils {
                 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
                 .sheet(sheetName).doWrite(data);
         // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
-        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
-        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
     }
 
     public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {
diff --git a/ensign-module-crm/ensign-module-crm-biz/pom.xml b/ensign-module-crm/ensign-module-crm-biz/pom.xml
index b5136d4..e5c02cc 100644
--- a/ensign-module-crm/ensign-module-crm-biz/pom.xml
+++ b/ensign-module-crm/ensign-module-crm-biz/pom.xml
@@ -79,5 +79,10 @@
             <groupId>com.ensign</groupId>
             <artifactId>ensign-spring-boot-starter-biz-tenant</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.ensign</groupId>
+            <artifactId>ensign-spring-boot-starter-excel</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ExcelTemplateController.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ExcelTemplateController.java
new file mode 100644
index 0000000..d3fa2bb
--- /dev/null
+++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/controller/crm/ExcelTemplateController.java
@@ -0,0 +1,44 @@
+package com.ensign.crm.module.crm.controller.crm;
+
+import com.ensign.crm.framework.common.pojo.CommonResult;
+import com.ensign.crm.module.crm.model.DealerRegistrationModel;
+import com.ensign.crm.module.crm.service.ExcelTemplateService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @Description: 生成Excel模板,解析Excel
+ * @Date: 29/11/2024 2:27 pm
+ * @Created: by ZZSLL
+ */
+
+@RestController
+@Tag(name = "CRM - excel")
+@RequestMapping("/crm-api/proxy/excel")
+public class ExcelTemplateController {
+
+    @Autowired
+    private ExcelTemplateService excelTemplateService;
+
+    @GetMapping("/download-template")
+    @Operation(summary = "下载经销商登记引出模板")
+    public void generateTemplate(HttpServletResponse response) throws IOException {
+        excelTemplateService.generateDealerRegistration(response);
+    }
+
+    @PostMapping("/upload/parsing")
+    @Operation(summary = "解析经销商登记Excel数据")
+    public CommonResult<List<DealerRegistrationModel>> parsing(MultipartFile file) throws IOException {
+        return CommonResult.success(excelTemplateService.parsingExcel(file));
+    }
+}
diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/DealerRegistrationModel.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/DealerRegistrationModel.java
new file mode 100644
index 0000000..a8ff339
--- /dev/null
+++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/DealerRegistrationModel.java
@@ -0,0 +1,49 @@
+package com.ensign.crm.module.crm.model;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ensign.crm.framework.excel.core.annotations.DictFormat;
+import com.ensign.crm.framework.excel.core.annotations.ExcelColumnSelect;
+import com.ensign.crm.framework.excel.core.convert.DictConvert;
+import com.ensign.crm.module.system.enums.DictTypeConstants;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 经销商登记分录
+ * @Date: 29/11/2024 2:36 pm
+ * @Created: by ZZSLL
+ */
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false)
+public class DealerRegistrationModel {
+
+    @ExcelProperty("公司名称或客户姓名")
+    private String yem_tcompanyname_jxs;
+
+    @ExcelProperty("客户联系人")
+    private String yem_customerlxr_jxs;
+
+    @ExcelProperty("客户联系方式")
+    private String yem_customercontact_jxs;
+
+    @ExcelProperty(value = "区域", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.REGION_OPTION)
+    @ExcelColumnSelect(dictType = DictTypeConstants.REGION_OPTION)
+    private String yem_region_jxs;
+
+    @ExcelProperty(value = "意向强度", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.INTENTION_OPTION)
+    @ExcelColumnSelect(dictType = DictTypeConstants.INTENTION_OPTION)
+    private String yem_intentionality;
+
+    @ExcelProperty("转换客户")
+    private String yem_switching;
+
+}
diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/RegionOption.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/RegionOption.java
new file mode 100644
index 0000000..d7b9548
--- /dev/null
+++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/model/RegionOption.java
@@ -0,0 +1,12 @@
+package com.ensign.crm.module.crm.model;
+
+import lombok.Data;
+
+/**
+ * @Description: 区域下拉列 标题-值
+ * @Date: 29/11/2024 2:48 pm
+ * @Created: by ZZSLL
+ */
+
+@Data
+public class RegionOption { private String label; private String value;}
diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ExcelTemplateService.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ExcelTemplateService.java
new file mode 100644
index 0000000..b71529c
--- /dev/null
+++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/service/ExcelTemplateService.java
@@ -0,0 +1,36 @@
+package com.ensign.crm.module.crm.service;
+
+import com.ensign.crm.framework.excel.core.util.ExcelUtils;
+import com.ensign.crm.module.crm.model.DealerRegistrationModel;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @Date: 29/11/2024 2:29 pm
+ * @Created: by ZZSLL
+ */
+
+@Service
+public class ExcelTemplateService {
+
+    /**
+     * 经销商登记
+     *
+     * @param response
+     */
+    public void generateDealerRegistration(HttpServletResponse response) throws IOException {
+
+        List<DealerRegistrationModel> emptyData = new ArrayList<>();
+        ExcelUtils.write(response, "经销商登记引出模板.xlsx", "Sheet1", DealerRegistrationModel.class, emptyData);
+    }
+
+    public List<DealerRegistrationModel> parsingExcel(MultipartFile file) throws IOException {
+        return ExcelUtils.read(file, DealerRegistrationModel.class);
+    }
+}
diff --git a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/DictTypeConstants.java b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/DictTypeConstants.java
index c984124..597433b 100644
--- a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/DictTypeConstants.java
+++ b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/DictTypeConstants.java
@@ -24,4 +24,7 @@ public interface DictTypeConstants {
     String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态
     String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态
 
+    String REGION_OPTION = "crm_region_option";
+
+    String INTENTION_OPTION = "crm_intention_option";
 }