From cc8d2b9a40189629c1b4513d3749251cbaf68133 Mon Sep 17 00:00:00 2001
From: jiangxiaoming <jiangxiaoming@seaskysh.com>
Date: Fri, 13 Dec 2024 13:23:24 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E5=8D=95=E5=AF=BC=E5=85=A5=E5=AF=BC?=
 =?UTF-8?q?=E5=87=BA=E5=A2=9E=E5=88=A0=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../template/enums/IncomeStateEnum.java       |  31 +++++
 .../template/web/api/IIncomeController.java   |  47 +++++++
 .../web/dto/request/DepartmentRequest.java    |   4 -
 .../web/dto/request/IncomeFailTemplate.java   |  19 +++
 .../web/dto/request/IncomeSaveRequest.java    |  55 ++++++++
 .../web/dto/request/IncomeTemplate.java       |  45 ++++++
 .../web/dto/request/TrainingFailTemplate.java |   2 +-
 .../web/dto/request/TrainingRequest.java      |   3 -
 .../src/main/java/com/seasky/Application.java |   2 +
 .../template/business/api/IncomeService.java  |  24 ++++
 .../business/dao/mapper/IncomeMapper.java     |  36 +++++
 .../business/dao/mapper/TrainingMapper.java   |   2 +-
 .../template/business/entity/Income.java      |  60 ++++++++
 .../business/service/IncomeServiceImpl.java   | 118 ++++++++++++++++
 .../business/service/TrainServiceImpl.java    |   5 +
 .../web/controller/IncomeController.java      | 128 ++++++++++++++++++
 .../src/main/resources/application.properties |   2 +
 17 files changed, 574 insertions(+), 9 deletions(-)
 create mode 100644 ServiceSiteCommon/facade/src/main/java/com/seasky/template/enums/IncomeStateEnum.java
 create mode 100644 ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/api/IIncomeController.java
 create mode 100644 ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeFailTemplate.java
 create mode 100644 ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeSaveRequest.java
 create mode 100644 ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeTemplate.java
 create mode 100644 ServiceSiteCommon/src/main/java/com/seasky/template/business/api/IncomeService.java
 create mode 100644 ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/IncomeMapper.java
 create mode 100644 ServiceSiteCommon/src/main/java/com/seasky/template/business/entity/Income.java
 create mode 100644 ServiceSiteCommon/src/main/java/com/seasky/template/business/service/IncomeServiceImpl.java
 create mode 100644 ServiceSiteCommon/src/main/java/com/seasky/template/web/controller/IncomeController.java

diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/enums/IncomeStateEnum.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/enums/IncomeStateEnum.java
new file mode 100644
index 0000000..f62e74b
--- /dev/null
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/enums/IncomeStateEnum.java
@@ -0,0 +1,31 @@
+package com.seasky.template.enums;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public enum IncomeStateEnum {
+
+    鏈垎绫�("鏈垎绫�","鏈垎绫�"),
+    宸插垎绫�("宸插垎绫�","宸插垎绫�"),
+    寰呰棰�("寰呰棰�","寰呰棰�"),
+    宸插畬鎴�("宸插畬鎴�","宸插畬鎴�");
+    private final String value;
+    private final String code;
+    IncomeStateEnum(String value,
+                    String code
+    ) {
+        this.value = value;
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+    public String getCode() {
+        return code;
+    }
+    public static List<String> getList() {
+        return Arrays.stream(IncomeStateEnum.values()).map(t->{return t.getValue();}).collect(Collectors.toList());
+    }
+}
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/api/IIncomeController.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/api/IIncomeController.java
new file mode 100644
index 0000000..50d2818
--- /dev/null
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/api/IIncomeController.java
@@ -0,0 +1,47 @@
+package com.seasky.template.web.api;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.seasky.core.common.Result;
+import com.seasky.template.web.dto.request.DepartmentRequest;
+import com.seasky.template.web.dto.request.IncomeSaveRequest;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 15:25
+ * @Version 1.0
+ */
+@Api(tags = "涓氬姟澶勭悊-鏀跺叆鐧昏")
+@RequestMapping("income")
+@RestController
+public interface IIncomeController {
+
+
+    @ApiOperation("鎵嬪姩鏂板")
+    @PostMapping("add")
+   Result<Object> add(@Validated @RequestBody IncomeSaveRequest income);
+
+    @ApiOperation("鍒犻櫎")
+    @GetMapping("remove")
+    Result<Object> remove(@RequestParam("id") Long id);
+
+    @ApiOperation("瀵煎叆妯℃澘涓嬭浇")
+    @GetMapping("downLoadTemplate")
+    void downLoadTemplate(HttpServletResponse response) throws JsonProcessingException;
+
+    @ApiOperation("瀵煎嚭")
+    @GetMapping("export")
+    void export(HttpServletResponse response) throws JsonProcessingException;
+
+    @ApiOperation("瀵煎叆")
+    @PostMapping("importIncome")
+    Result<Object> importIncome(HttpServletRequest request, HttpServletResponse response, @RequestBody
+    MultipartFile file) throws JsonProcessingException;
+}
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/DepartmentRequest.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/DepartmentRequest.java
index a674292..d3fdc1a 100644
--- a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/DepartmentRequest.java
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/DepartmentRequest.java
@@ -21,19 +21,15 @@ import javax.validation.constraints.NotNull;
 public class DepartmentRequest {
     @ApiModelProperty("閮ㄩ棬id 淇敼闇€瑕�")
     private Long id;
-    @NotNull(message="閮ㄩ棬缂栧彿涓嶈兘涓虹┖")
     @NotBlank(message="閮ㄩ棬缂栧彿涓嶈兘涓虹┖")
     @ApiModelProperty("閮ㄩ棬缂栧彿")
     private String departmentCode;
-    @NotNull(message="閮ㄩ棬鍚嶇О涓嶈兘涓虹┖")
     @NotBlank(message="閮ㄩ棬鍚嶇О涓嶈兘涓虹┖")
     @ApiModelProperty("閮ㄩ棬鍚嶇О")
     private String departmentName;
-    @NotNull(message="绠$悊浜哄憳缂栧彿涓嶈兘涓虹┖")
     @NotBlank(message="绠$悊浜哄憳缂栧彿涓嶈兘涓虹┖")
     @ApiModelProperty("绠$悊浜哄憳缂栧彿")
     private String managementCode;
-    @NotNull(message="绠$悊浜哄憳涓嶈兘涓虹┖")
     @NotBlank(message="绠$悊浜哄憳涓嶈兘涓虹┖")
     @ApiModelProperty("绠$悊浜哄憳")
     private String managementPerson;
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeFailTemplate.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeFailTemplate.java
new file mode 100644
index 0000000..a799bde
--- /dev/null
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeFailTemplate.java
@@ -0,0 +1,19 @@
+package com.seasky.template.web.dto.request;
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/11 11:12
+ * @Version 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class IncomeFailTemplate extends IncomeTemplate {
+
+    @Excel(needMerge = true,orderNum ="10",name="閿欒淇℃伅",width = 20)
+    private String errMsg;
+}
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeSaveRequest.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeSaveRequest.java
new file mode 100644
index 0000000..554c6b1
--- /dev/null
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeSaveRequest.java
@@ -0,0 +1,55 @@
+package com.seasky.template.web.dto.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 15:27
+ * @Version 1.0
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class IncomeSaveRequest {
+    @NotBlank(message = "閾惰璐︽埛鍚嶇О涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "閾惰璐︽埛鍚嶇О")
+    private String bankName;
+    @NotBlank(message = "鏀舵鍗曞彿涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏀舵鍗曞彿")
+    private String billNo;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @NotNull(message = "鏀舵鏃ユ湡涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏀舵鏃ユ湡")
+    private Date incomeDate;
+    @NotNull(message = "鍥炲崟閲戦涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鍥炲崟閲戦")
+    private BigDecimal incomeAmount;
+    @NotBlank(message = "鏀舵璐︽埛涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏀舵璐︽埛")
+    private String incomeAccount;
+    @NotBlank(message = "浠樻璐︽埛涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "浠樻璐︽埛")
+    private String paymentAccount;
+    @NotBlank(message = "鏀舵浜哄悕绉颁笉鑳戒负绌�")
+    @ApiModelProperty(value = "鏀舵浜哄悕绉�")
+    private String incomeName;
+    @NotBlank(message = "浠樻浜哄悕绉颁笉鑳戒负绌�")
+    @ApiModelProperty(value = "浠樻浜哄悕绉�")
+    private String paymentName;
+    @NotBlank(message = "鎽樿涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鎽樿")
+    private String incomeSummary;
+    @NotBlank(message = "闄勮█涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "闄勮█")
+    private String incomePostscript;
+
+}
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeTemplate.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeTemplate.java
new file mode 100644
index 0000000..26b540c
--- /dev/null
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/IncomeTemplate.java
@@ -0,0 +1,45 @@
+package com.seasky.template.web.dto.request;
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/11 11:12
+ * @Version 1.0
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class IncomeTemplate implements Serializable {
+    @Excel(needMerge = true,orderNum ="1",name="閾惰璐︽埛鍚嶇О",width = 20)
+    private String bankName;
+    @Excel(needMerge = true,orderNum ="2",name="鏀舵鍗曞彿",width = 20)
+    private String billNo;
+    @Excel(needMerge = true,orderNum ="3",name="鏀舵鏃ユ湡",width = 20)
+    private Date incomeDate;
+
+    @Excel(needMerge = true,orderNum ="4",name="鏀舵閲戦",width = 20)
+    private BigDecimal incomeAmount;
+
+    @Excel(needMerge = true,orderNum ="5",name="鏀舵璐︽埛",width = 20)
+    private String incomeAccount;
+
+    @Excel(needMerge = true,orderNum ="6",name="浠樻璐︽埛",width = 20)
+    private String paymentAccount;
+
+    @Excel(needMerge = true,orderNum ="7",name="鏀舵浜哄悕绉�",width = 20)
+    private String incomeName;
+
+    @Excel(needMerge = true,orderNum ="8",name="浠樻浜哄悕绉�",width = 20)
+    private String paymentName;
+
+    @Excel(needMerge = true,orderNum ="9",name="鎽樿",width = 20)
+    private String incomeSummary;
+
+}
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingFailTemplate.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingFailTemplate.java
index 6d0ebf7..f468dc7 100644
--- a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingFailTemplate.java
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingFailTemplate.java
@@ -16,6 +16,6 @@ import java.io.Serializable;
 @NoArgsConstructor
 public class TrainingFailTemplate extends TrainingTemplate {
 
-    @Excel(needMerge = true,orderNum ="4",name="鍩硅绫诲瀷",width = 20)
+    @Excel(needMerge = true,orderNum ="4",name="閿欒淇℃伅",width = 20)
     private String errMsg;
 }
diff --git a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingRequest.java b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingRequest.java
index 9eb1958..3a4fe2a 100644
--- a/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingRequest.java
+++ b/ServiceSiteCommon/facade/src/main/java/com/seasky/template/web/dto/request/TrainingRequest.java
@@ -20,15 +20,12 @@ import javax.validation.constraints.NotNull;
 public class TrainingRequest {
 
     private Long id;
-    @NotNull
     @ApiModelProperty(value = "鍩硅鍚嶇О")
     @NotBlank(message="鍩硅鍚嶇О涓嶈兘涓虹┖")
     private String trainingName;
-    @NotNull(message = "瀵瑰簲鏀跺叆绉戠洰缂栧彿涓嶈兘涓虹┖")
     @NotBlank(message="瀵瑰簲鏀跺叆绉戠洰缂栧彿涓嶈兘涓虹┖")
     @ApiModelProperty(value = "瀵瑰簲鏀跺叆绉戠洰缂栧彿")
     private String accountCode;
-    @NotNull
     @NotBlank(message="鍩硅绫诲瀷涓嶈兘涓虹┖")
     @ApiModelProperty(value = "鍩硅绫诲瀷")
     private String trainingType;
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/Application.java b/ServiceSiteCommon/src/main/java/com/seasky/Application.java
index 391f230..c7248cf 100644
--- a/ServiceSiteCommon/src/main/java/com/seasky/Application.java
+++ b/ServiceSiteCommon/src/main/java/com/seasky/Application.java
@@ -1,5 +1,6 @@
 package com.seasky;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -10,6 +11,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
 /***
  * @author bandi
  * */
+@MapperScan("com.seasky.template.business.dao.mapper")
 @SpringBootApplication
 @EnableAspectJAutoProxy(proxyTargetClass = true)
 @EnableDiscoveryClient
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/api/IncomeService.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/api/IncomeService.java
new file mode 100644
index 0000000..96d73dc
--- /dev/null
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/api/IncomeService.java
@@ -0,0 +1,24 @@
+package com.seasky.template.business.api;
+
+import com.seasky.core.base.BaseService;
+import com.seasky.template.business.entity.Income;
+import com.seasky.template.business.entity.IncomeType;
+import com.seasky.template.web.dto.request.IncomeSaveRequest;
+import com.seasky.template.web.dto.request.IncomeTemplate;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 17:14
+ * @Version 1.0
+ */
+public interface IncomeService extends BaseService<Income> {
+
+    void add(IncomeSaveRequest saveRequest);
+
+    void delete(Long id);
+
+    Map<Integer, String> importExcel(List<IncomeTemplate> list);
+}
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/IncomeMapper.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/IncomeMapper.java
new file mode 100644
index 0000000..618f01b
--- /dev/null
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/IncomeMapper.java
@@ -0,0 +1,36 @@
+package com.seasky.template.business.dao.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.seasky.core.base.BaseMapper;
+import com.seasky.template.business.entity.Department;
+import com.seasky.template.business.entity.Income;
+import com.seasky.template.web.dto.request.DepartmentQueryListRequest;
+import com.seasky.template.web.dto.request.DepartmentQueryRequest;
+import com.seasky.template.web.dto.result.DepartmentResult;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface IncomeMapper extends BaseMapper<Income> {
+
+    @Select("select bill_no from t_income where bill_no = #{billNo} and available ='YES'")
+    String selectExistOrderNo(@Param("billNo") String billNo);
+
+
+    @Select({
+            "<script>",
+            "SELECT bill_no FROM t_income",
+            "WHERE bill_no IN",
+            "<foreach item='item' index='index' collection='stringList' open='(' separator=',' close=')'>",
+            "#{item}",
+            "</foreach>",
+            "</script>"
+    })
+    List<String> checkBillExist(@Param("stringList") List<String> stringList);
+
+    @Select("select * from t_income where available ='YES'")
+    List<Income> selectList();
+}
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/TrainingMapper.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/TrainingMapper.java
index da7655a..31127cc 100644
--- a/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/TrainingMapper.java
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/dao/mapper/TrainingMapper.java
@@ -17,7 +17,7 @@ public interface TrainingMapper extends BaseMapper<Training> {
 
     List<TrainingResult> selectList(@Param("trainingRequest") TrainingRequest trainingRequest);
 
-    @Select("select count(1) from t_training where training_name = #{trainingName}")
+    @Select("select count(1) from t_training where training_name = #{trainingName} and available ='YES'")
     int selectExist(@Param("trainingName") String trainingName);
 
     @Select({
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/entity/Income.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/entity/Income.java
new file mode 100644
index 0000000..148cbf8
--- /dev/null
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/entity/Income.java
@@ -0,0 +1,60 @@
+package com.seasky.template.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.seasky.core.base.BaseModel;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 15:21
+ * @Version 1.0
+ */
+@TableName("t_income")
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("鏀跺叆鍥炲崟瀹炰綋")
+@Data
+public class Income extends BaseModel {
+
+    /** Bank account name */
+    private String bankName;
+
+    /** Receipt number */
+    private String billNo;
+
+    /** Date of income */
+    private Date incomeDate;
+
+    /** Income amount */
+    private BigDecimal incomeAmount;
+
+    /** Receiving account */
+    private String incomeAccount;
+
+    /** Payment account */
+    private String paymentAccount;
+
+    /** Name of the recipient */
+    private String incomeName;
+
+    /** Name of the payer */
+    private String paymentName;
+
+    /** Summary */
+    private String incomeSummary;
+
+    /** Postscript */
+    private String incomePostscript;
+
+    /** Assigned income type ID */
+    private Long incomeTypeId;
+
+    /** Income state */
+    private String state;
+}
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/IncomeServiceImpl.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/IncomeServiceImpl.java
new file mode 100644
index 0000000..a383ba2
--- /dev/null
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/IncomeServiceImpl.java
@@ -0,0 +1,118 @@
+package com.seasky.template.business.service;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.seasky.core.base.AbstractService;
+import com.seasky.core.ddd.utils.MapperUtils;
+import com.seasky.core.util.ExceptionUtil;
+import com.seasky.template.annotation.NullableField;
+import com.seasky.template.business.api.IncomeService;
+import com.seasky.template.business.dao.mapper.IncomeMapper;
+import com.seasky.template.business.entity.Income;
+import com.seasky.template.enums.IncomeStateEnum;
+import com.seasky.template.web.dto.request.IncomeSaveRequest;
+import com.seasky.template.web.dto.request.IncomeTemplate;
+import com.seasky.template.web.dto.request.TrainingTemplate;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 17:16
+ * @Version 1.0
+ */
+@Service
+public class IncomeServiceImpl extends AbstractService<Income, IncomeMapper> implements IncomeService {
+
+    @Autowired
+    IncomeMapper incomeMapper;
+
+    @Override
+    public void add(IncomeSaveRequest saveRequest) {
+        String orderNo = incomeMapper.selectExistOrderNo(saveRequest.getBillNo());
+        if(!StringUtils.isEmpty(orderNo)){
+            throw ExceptionUtil.getException(null,"鏀舵鍗曞彿宸插瓨鍦�");
+        }
+       Income income =  MapperUtils.INSTANCE.map(Income.class,saveRequest);
+       income.setState(IncomeStateEnum.鏈垎绫�.getValue());
+       this.insert(income);
+    }
+
+    @Override
+    public void delete(Long id) {
+        Income income = incomeMapper.selectById(id);
+        if(income ==null){
+            throw new RuntimeException("鍥炲崟涓嶅瓨鍦�");
+        }
+        if(income.getState()!=null && !income.getState().equals(IncomeStateEnum.鏈垎绫�.getValue())){
+            throw new RuntimeException("闈炴湭鍒嗙被鐨勫洖鍗曚笉鍏佽鍒犻櫎");
+        }
+        this.logicDelete(id);
+    }
+
+    @Override
+    public Map<Integer, String> importExcel(List<IncomeTemplate> list) {
+        Map<Integer, String> resMap = new HashMap<>();
+        List<String> stringList = list.stream().map(t -> {
+            return t.getBillNo();
+        }).collect(Collectors.toList());
+        List<String> existList = incomeMapper.checkBillExist(stringList);
+        if (existList!=null && !existList.isEmpty()) {
+            Map<String, Integer> existListMap = new HashMap<>();
+            // 灏� existList 鐨勫厓绱犲拰瀹冧滑鐨勭储寮曞瓨鍏� HashMap
+            for (int i = 0; i < existList.size(); i++) {
+                existListMap.put(existList.get(i), i);
+            }
+            for (int i = 0; i < stringList.size(); i++) {
+                String item = stringList.get(i);
+                if (existListMap.containsKey(item)) {
+                    resMap.put(i, "鍥炲崟宸插瓨鍦�");
+                }
+            }
+            if(!resMap.isEmpty()){
+                return resMap;
+            }
+        }
+        for (int i = 0; i < list.size(); i++) {
+            StringBuilder errMsg = new StringBuilder();
+            IncomeTemplate template = list.get(i);
+            Field[] fields = IncomeTemplate.class.getDeclaredFields();
+            for (Field field : fields) {
+                ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
+                String excelHeader = excelProperty.value()[0]; // 鑾峰彇 ExcelProperty 娉ㄨВ涓殑鍊�
+                if (field.isAnnotationPresent(NullableField.class)) {
+                    continue; // 璺宠繃鏍囪浜� @NullableField 鐨勫瓧娈�
+                }
+                field.setAccessible(true);
+                try {
+                    Object value = field.get(template);
+                    if (value == null || (value instanceof String && io.seata.common.util.StringUtils.isEmpty((String) value))) {
+                        errMsg.append(excelHeader).append("涓嶈兘涓虹┖,");
+                    } else if (value instanceof BigDecimal && ((BigDecimal) value).compareTo(BigDecimal.ZERO) == 0) {
+                        errMsg.append(excelHeader).append("涓嶈兘涓虹┖,");
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (errMsg.length() > 0) {
+                resMap.put(i, errMsg.toString().substring(0, errMsg.length()-1));
+            }
+        }
+        if (resMap.values().size() > 0) {
+            return resMap;
+        }
+        //鎵归噺淇濆瓨
+        List<Income> incomes = MapperUtils.INSTANCE.mapAsList(Income.class, list);
+        incomes.forEach(t->{t.setState(IncomeStateEnum.鏈垎绫�.getValue());});
+        this.insertBatch(incomes);
+        return resMap;
+    }
+}
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/TrainServiceImpl.java b/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/TrainServiceImpl.java
index 12a5ced..dad9fb2 100644
--- a/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/TrainServiceImpl.java
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/business/service/TrainServiceImpl.java
@@ -116,6 +116,11 @@ public class TrainServiceImpl extends AbstractService<Training, TrainingMapper>
                 resMap.put(i, errMsg.toString().substring(0, errMsg.length()-1));
             }
         }
+        if(resMap.size()>0){
+            return resMap;
+        }
+        List<Training> trainings = MapperUtils.INSTANCE.mapAsList(Training.class, list);
+        this.insertBatch(trainings);
         return resMap;
     }
 }
diff --git a/ServiceSiteCommon/src/main/java/com/seasky/template/web/controller/IncomeController.java b/ServiceSiteCommon/src/main/java/com/seasky/template/web/controller/IncomeController.java
new file mode 100644
index 0000000..f36f987
--- /dev/null
+++ b/ServiceSiteCommon/src/main/java/com/seasky/template/web/controller/IncomeController.java
@@ -0,0 +1,128 @@
+package com.seasky.template.web.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.seasky.core.common.ResponseCode;
+import com.seasky.core.common.Result;
+import com.seasky.core.ddd.utils.MapperUtils;
+import com.seasky.core.util.ExceptionUtil;
+import com.seasky.template.business.api.IncomeService;
+import com.seasky.template.business.dao.mapper.IncomeMapper;
+import com.seasky.template.business.entity.Income;
+import com.seasky.template.utils.EasyPoiUtils;
+import com.seasky.template.utils.ExcelCheckUtil;
+import com.seasky.template.web.api.IIncomeController;
+import com.seasky.template.web.controller.excel.EasyExcelHelper;
+import com.seasky.template.web.controller.listen.ExcelEventListener;
+import com.seasky.template.web.dto.request.IncomeSaveRequest;
+import com.seasky.template.web.dto.request.IncomeTemplate;
+import com.seasky.template.web.dto.request.TrainingFailTemplate;
+import com.seasky.template.web.dto.request.TrainingTemplate;
+import com.seasky.template.web.dto.result.TrainingResult;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static com.seasky.core.common.Response.ok;
+
+/**
+ * @Author jxm
+ * @Date 2024/12/12 15:24
+ * @Version 1.0
+ */
+@RestController
+public class IncomeController implements IIncomeController {
+
+   @Autowired
+   IncomeService incomeService;
+   @Autowired
+   IncomeMapper incomeMapper;
+    @Override
+    public Result<Object> add(IncomeSaveRequest saveRequest) {
+        incomeService.add(saveRequest);
+        return ok(ResponseCode.SUCCESS);
+    }
+
+    @Override
+    public Result<Object> remove(Long id) {
+        incomeService.delete(id);
+        return ok(ResponseCode.SUCCESS);
+    }
+
+    @Override
+    public void downLoadTemplate(HttpServletResponse response) throws JsonProcessingException {
+        List<IncomeTemplate> outs = Collections.emptyList();
+        EasyPoiUtils.exportExcel(outs, null, "sheet1", IncomeTemplate.class, "鍥炲崟瀵煎嚭.xls", true, response);
+    }
+
+    @Override
+    public void export(HttpServletResponse response) throws JsonProcessingException {
+        List<Income> results = incomeMapper.selectList();
+        if(results == null){
+            List<IncomeTemplate> outs = Collections.emptyList();
+            EasyExcelHelper.downExcel(response, outs, TrainingTemplate.class, "鍥炲崟瀵煎嚭.xlsx", "鍥炲崟瀵煎嚭");
+            return;
+        }
+        List<IncomeTemplate> outs =  MapperUtils.INSTANCE.mapAsList(IncomeTemplate.class,results);
+        EasyExcelHelper.downExcel(response, outs, IncomeTemplate.class, "鍥炲崟瀵煎嚭.xlsx", "鍥炲崟瀵煎嚭");
+    }
+
+    @Override
+    public Result<Object> importIncome(HttpServletRequest request, HttpServletResponse response, MultipartFile file) throws JsonProcessingException {
+        File f = null;
+        InputStream inputStream = null;
+        try {
+            List<IncomeTemplate> list = ExcelCheckUtil.checkExcelAnd2List(file, IncomeTemplate.class);
+            List<String> titles = new ArrayList<>();
+            try {
+                f = File.createTempFile("temp", null);
+                // 鎶妋ultipartFile鍐欏叆涓存椂鏂囦欢
+                file.transferTo(f);
+                // 浣跨敤鏂囦欢鍒涘缓 inputStream 娴�
+                inputStream = new FileInputStream(f);
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw ExceptionUtil.getException(null, e.getMessage());
+            }
+
+            ExcelEventListener listener = new ExcelEventListener();
+            EasyExcel.read(inputStream, listener).sheet(0).doReadSync();
+            Map<Integer, String> map = listener.getMap().get(0);
+            map.values().forEach(e -> titles.add(e));
+            String header = StringUtils.join(titles, ",");
+            if (!("閾惰璐︽埛鍚嶇О,鏀舵鍗曞彿,鏀舵鏃ユ湡,鏀舵閲戦,鏀舵璐︽埛,浠樻璐︽埛,鏀舵浜哄悕绉�,鏀舵浜哄悕绉�,鎽樿").equals(header)
+            ) { throw ExceptionUtil.getException(null, "琛ㄥご涓嶆纭�");
+            }
+            Map<Integer, String> checkMap = incomeService.importExcel(list);
+            if (checkMap.size() > 0) {
+                List<TrainingFailTemplate> exportList = new ArrayList<>();
+                for (int i = 0; i < list.size(); i++) {
+                    String errMsg = checkMap.get(i);
+                    TrainingFailTemplate ruleFailTemplate = MapperUtils.INSTANCE.map(TrainingFailTemplate.class, list.get(i));
+                    ruleFailTemplate.setErrMsg(StringUtils.isEmpty(errMsg) ? "" : errMsg);
+                    exportList.add(ruleFailTemplate);
+                }
+                EasyPoiUtils.exportExcel(exportList, null, "sheet1", TrainingTemplate.class, "鍩硅瀵煎嚭閿欒淇℃伅.xlsx", true, response);
+                //EasyExcelHelper.downExcel(response, exportList, InvoiceFailTemplate.class, "鍙戠エ瀵煎叆閿欒淇℃伅", "鍙戠エ瀵煎叆閿欒淇℃伅");
+            }
+            return ok(ResponseCode.SUCCESS);
+        } finally {
+            if (f != null) {
+                f.deleteOnExit();
+            }
+        }
+    }
+
+}
diff --git a/ServiceSiteCommon/src/main/resources/application.properties b/ServiceSiteCommon/src/main/resources/application.properties
index 208b3b0..92eb20b 100644
--- a/ServiceSiteCommon/src/main/resources/application.properties
+++ b/ServiceSiteCommon/src/main/resources/application.properties
@@ -25,3 +25,5 @@ spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
 spring.datasource.druid.stat-view-servlet.reset-enable=false
 spring.datasource.druid.stat-view-servlet.login-username=druid
 spring.datasource.druid.stat-view-servlet.login-password=druid
+
+spring.jackson.time-zone=Asia/Shanghai
-- 
GitLab