Browse Source

批量添加收款日期,导入报销人员信息功能开发,修改配置文件,保证数据库可批量修改

user5 2 years ago
parent
commit
8c4f317b1e
17 changed files with 510 additions and 162 deletions
  1. 25 3
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/controller/ReimbursementSysController.java
  2. 91 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/controller/ReimbursementUserController.java
  3. 13 117
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/domain/dto/ReimbursementDTO.java
  4. 28 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/domain/dto/ReimbursementUserDTO.java
  5. 9 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/ReimbursementSysMapper.java
  6. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/ReimbursementUserMapper.java
  7. 29 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/xml/ReimbursementSysMapper.xml
  8. 92 1
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/xml/ReimbursementUserMapper.xml
  9. 6 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/ReimbursementSysService.java
  10. 15 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/ReimbursementUserService.java
  11. 24 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/impl/ReimbursementSysServiceImpl.java
  12. 155 30
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/impl/ReimbursementUserServiceImpl.java
  13. 1 1
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java
  14. 2 5
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/ImportExcel.java
  15. 2 2
      jeeplus-web/src/main/resources/application-development.yml
  16. 1 1
      jeeplus-web/src/main/resources/application-production.yml
  17. 2 2
      pom.xml

+ 25 - 3
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/controller/ReimbursementSysController.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.aop.demo.annotation.DemoMode;
 import com.jeeplus.aop.logging.annotation.ApiLog;
-import com.jeeplus.sys.utils.ImportExcel;
+import com.jeeplus.core.excel.utils.EasyPoiUtil;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementDTO;
 import com.jeeplus.test.reimbursementsys.service.ReimbursementSysService;
@@ -83,8 +83,9 @@ public class ReimbursementSysController {
     public Map<String,Object> uploadFile(HttpServletRequest request, MultipartFile file) {
         Map<String,Object> map = new HashMap<>();
         try {
-            ImportExcel ei = new ImportExcel(file, 0, 0);
-            List<ReimbursementDTO> list = ei.getDataList(ReimbursementDTO.class);
+            List <ReimbursementDTO> list = EasyPoiUtil.importExcel ( file, 0, 1, ReimbursementDTO.class );
+            /*ImportExcel ei = new ImportExcel(file, 0, 0);
+            List<ReimbursementDTO> list = ei.getDataList(ReimbursementDTO.class);*/
             map = service.save(list);
             return map;
         } catch (Exception e) {
@@ -150,6 +151,27 @@ public class ReimbursementSysController {
     }
 
     /**
+     * 保存业务报销编码
+     * @return
+     */
+    @ApiLog("保存收款时间信息")
+    @PostMapping("saveGatheringTime")
+    public ResponseEntity saveGatheringTime(@Valid @RequestBody ReimbursementDTO reimbursementDTO) {
+        if(StringUtils.isBlank(reimbursementDTO.getId())){
+            return ResponseEntity.badRequest ().body ("未选择发票信息!");
+        }
+        if(null == reimbursementDTO.getGatheringTime()){
+            return ResponseEntity.badRequest ().body ("未选择收款时间!");
+        }
+        Map<String, Object> map = service.saveGatheringTime(reimbursementDTO);
+        Boolean success = (Boolean) map.get("success");
+        if(success){
+            return ResponseEntity.ok("保存业务编码" + reimbursementDTO.getBusinessCode() + "成功");
+        }
+        return ResponseEntity.badRequest().body ( map.get("message"));
+    }
+
+    /**
      * 删除业务信息
      * @param ids
      * @return

+ 91 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/controller/ReimbursementUserController.java

@@ -5,15 +5,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.jeeplus.aop.demo.annotation.DemoMode;
 import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.common.beanvalidator.BeanValidators;
+import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementBusinessReturnDTO;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO;
 import com.jeeplus.test.reimbursementsys.service.ReimbursementUserService;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -110,4 +119,86 @@ public class ReimbursementUserController {
         ReimbursementBusinessReturnDTO info = service.findListByUserId(reimbursementUserDTO);
         return ResponseEntity.ok(info);
     }
+    /**
+     * 下载导入用户数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('reimbursementUser:import')")
+    @GetMapping("import/template")
+    @ApiOperation(value = "下载模板")
+    public void importFileTemplate(HttpServletResponse response) {
+        String fileName = "报销人员数据导入模板.xlsx";
+        List<ReimbursementUserDTO> list = Lists.newArrayList();
+        EasyPoiUtil.exportExcel ( list, "报销人员数据",  "报销人员数据", ReimbursementUserDTO.class, fileName, response );
+    }
+
+    /**
+     * 导入用户数据
+     *
+     * @return
+     */
+    @DemoMode
+    @PreAuthorize("hasAnyAuthority('reimbursementUser:import')")
+    @PostMapping("import")
+    @ApiOperation(value = "导入员工报销信息excel")
+    public ResponseEntity importFile(MultipartFile file) {
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder ( );
+            List <ReimbursementUserDTO> list = EasyPoiUtil.importExcel ( file, 1, 1, ReimbursementUserDTO.class );
+            List<ReimbursementUserDTO> saveList = Lists.newArrayList();
+            Map<String, Object> resultMap = new HashMap<>();
+            for (ReimbursementUserDTO user : list) {
+                try {
+                    //根据部门和人员名称查询人员信息
+                    List<UserDTO> userByNameAndOfficeName = service.getUserByNameAndOfficeName(user);
+                    if(userByNameAndOfficeName.size()>1){
+                        failureMsg.append ( "。 " + user.getOfficeName() + " 部门下的员工 " + user.getUserName() + " 存在多个,无法进行导入;" );
+                        failureNum++;
+                    }else if(userByNameAndOfficeName.size() == 0){
+                        failureMsg.append ( "。 " + user.getOfficeName() + " 部门下的员工 " + user.getUserName() + " 不存在,无法进行导入;" );
+                        failureNum++;
+                    }else {
+                        user.setUserId(userByNameAndOfficeName.get(0).getId());
+                        user.setUser(userByNameAndOfficeName.get(0));
+                        user.setKeyFlag(user.getYear() + user.getUserId());
+                        saveList.add(user);
+                        successNum ++;
+                    }
+                } catch (ConstraintViolationException ex) {
+                    failureMsg.append ( "。 " + user.getOfficeName() + " 部门下的员工 " + user.getUserName() + " 导入失败:" );
+                    List <String> messageList = BeanValidators.extractPropertyAndMessageAsList ( ex, ": " );
+                    for (String message : messageList) {
+                        failureMsg.append ( message + "; " );
+                        failureNum++;
+                    }
+                } catch (Exception ex) {
+                    failureNum++;
+                    failureMsg.append ( "。 " + user.getOfficeName() + " 部门下的员工 " + user.getUserName() + " 导入失败:" + ex.getMessage ( ) );
+                }
+            }
+
+            if ( failureNum > 0 ) {
+                failureMsg.insert ( 0, ",失败 " + failureNum + " 条员工报销数据,导入信息如下:" );
+            }
+
+            if(saveList.size()>0){
+                resultMap = service.saveList(saveList);
+
+                Boolean success = (Boolean) resultMap.get("success");
+                if(!success){
+                    return ResponseEntity.badRequest().body ( resultMap.get("message"));
+                }
+                Object saveCount = resultMap.get("saveCount");
+                Object message = resultMap.get("message");
+                return ResponseEntity.ok ( "已成功导入 " + saveCount + " 条员工报销数据" + failureMsg+message );
+            }
+            return ResponseEntity.ok ( "已成功导入 " + successNum + " 条员工报销数据" + failureMsg );
+        } catch (Exception e) {
+            return ResponseEntity.badRequest().body ( "导入员工报销数据失败!失败信息:" + e.getMessage ( ) );
+        }
+    }
 }

+ 13 - 117
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/domain/dto/ReimbursementDTO.java

@@ -1,9 +1,9 @@
 package com.jeeplus.test.reimbursementsys.domain.dto;
 
+import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jeeplus.core.domain.TreeEntity;
-import com.jeeplus.sys.utils.ExcelField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -21,21 +21,33 @@ import java.util.List;
 @TableName("zs_reimbursement_info")
 public class ReimbursementDTO extends TreeEntity<ReimbursementDTO> {
     private static final long serialVersionUID = 1L;
+    @Excel(name = "业务编号")
     private String businessCode;    //业务编号
     private String businessCodeId;    //业务编号id
+    @Excel(name = "发票代码")
     private String invoiceCode;     //发票代码
+    @Excel(name = "发票号码")
     private String invoiceNumber;   //发票号码
+    @Excel(name = "购方企业名称")
     private String firmName;        //购方企业名称
 
     @DateTimeFormat(pattern =  "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "开票日期")
     private Date makeTime;          //开票日期
+    @Excel(name = "商品名称")
     private String name;     //商品名称
+    @Excel(name = "金额")
     private String money;       //金额
+    @Excel(name = "税额")
     private String tax;         //税额
+    @Excel(name = "收入")
     private String income;      //收入
+    @Excel(name = "申请人")
     private String proposer;        //申请人
+    @Excel(name = "合伙人")
     private String partner;         //合伙人
+    @Excel(name = "业务类型")
     private String businessType;    //业务类型
     private String remarks;    //备注
     private Integer type;    //状态
@@ -49,121 +61,5 @@ public class ReimbursementDTO extends TreeEntity<ReimbursementDTO> {
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date gatheringTime;     //收款日期
 
-    @ExcelField(title="业务编号", align=2, sort=12)
-    public String getBusinessCode() {
-        return businessCode;
-    }
-
-    @ExcelField(title="发票代码", align=2, sort=1)
-    public String getInvoiceCode() {
-        return invoiceCode;
-    }
-
-    @ExcelField(title="发票号码", align=2, sort=2)
-    public String getInvoiceNumber() {
-        return invoiceNumber;
-    }
-
-    @ExcelField(title="购方企业名称", align=2, sort=3)
-    public String getFirmName() {
-        return firmName;
-    }
-
-    @ExcelField(title="开票日期", align=2, sort=4)
-    public Date getMakeTime() {
-        return makeTime;
-    }
-
-    @ExcelField(title="商品名称", align=2, sort=5)
-    public String getName() {
-        return name;
-    }
-
-    @ExcelField(title="金额", align=2, sort=6)
-    public String getMoney() {
-        return money;
-    }
-
-    @ExcelField(title="税额", align=2, sort=7)
-    public String getTax() {
-        return tax;
-    }
-
-    @ExcelField(title="收入", align=2, sort=8)
-    public String getIncome() {
-        return income;
-    }
-
-    @ExcelField(title="申请人", align=2, sort=9)
-    public String getProposer() {
-        return proposer;
-    }
-
-    @ExcelField(title="合伙人", align=2, sort=10)
-    public String getPartner() {
-        return partner;
-    }
-
-    @ExcelField(title="业务类型", align=2, sort=11)
-    public String getBusinessType() {
-        return businessType;
-    }
-
-    @ExcelField(title="收款日期", align=2, sort=13)
-    public Date getGatheringTime() {
-        return gatheringTime;
-    }
-
-    public void setBusinessCode(String businessCode) {
-        this.businessCode = businessCode;
-    }
-
-    public void setInvoiceCode(String invoiceCode) {
-        this.invoiceCode = invoiceCode;
-    }
-
-    public void setInvoiceNumber(String invoiceNumber) {
-        this.invoiceNumber = invoiceNumber;
-    }
-
-    public void setFirmName(String firmName) {
-        this.firmName = firmName;
-    }
-
-    public void setMakeTime(Date makeTime) {
-        this.makeTime = makeTime;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setMoney(String money) {
-        this.money = money;
-    }
-
-    public void setTax(String tax) {
-        this.tax = tax;
-    }
-
-    public void setIncome(String income) {
-        this.income = income;
-    }
-
-    public void setProposer(String proposer) {
-        this.proposer = proposer;
-    }
-
-    public void setPartner(String partner) {
-        this.partner = partner;
-    }
-
-    public void setBusinessType(String businessType) {
-        this.businessType = businessType;
-    }
-
-    public void setGatheringTime(Date gatheringTime) {
-        this.gatheringTime = gatheringTime;
-    }
 
 }

+ 28 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/domain/dto/ReimbursementUserDTO.java

@@ -1,10 +1,14 @@
 package com.jeeplus.test.reimbursementsys.domain.dto;
 
+import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.sys.service.dto.UserDTO;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
 
 /**
  * 报销人员表
@@ -16,10 +20,33 @@ import lombok.EqualsAndHashCode;
 @TableName("zs_reimbursement_user_info")
 public class ReimbursementUserDTO extends BaseEntity {
 
+    @Excel(name = "姓名")
+    @Length(min = 1, max = 100)
+    @NotNull(message = "姓名不能为空")
+    private String userName;//员工姓名
+    @Excel(name = "部门")
+    @Length(min = 1, max = 100)
+    @NotNull(message = "部门不能为空")
+    private String officeName;//部门名称
+
     private String userId;  //报销人id
     private UserDTO user;   //报销人员信息
+
+    @Excel(name = "报销年份")
+    @Length(min = 1, max = 100)
+    @NotNull(message = "报销年份不能为空")
     private String year;    //报销年份
+    @Excel(name = "年报销额度")
+    @Length(min = 1, max = 100)
+    @NotNull(message = "年报销额度不能为空")
     private String reimbursementQuota;  //年报销额度
+
+    @Excel(name = "年可报销天数")
+    @NotNull(message = "年可报销天数不能为空")
+    private Integer reimbursementAllDay;  //年可报销天数
+    @Excel(name = "日报销额度")
+    @Length(min = 1, max = 100)
+    @NotNull(message = "日报销额度不能为空")
     private String reimbursementQuotaDay;  //日报销额度
     private String reimbursementDay;  //报销天数
     private String reimbursementAmount;  //报销额度
@@ -31,6 +58,7 @@ public class ReimbursementUserDTO extends BaseEntity {
     private String alreadyReimbursementDay;  //已报销天数
     private String surplusReimbursementDay;  //剩余报销天数
     private String surplusReimbursementAmount;  //剩余报销额度
+    private String keyFlag; //用于判断使用
 
 
 }

+ 9 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/ReimbursementSysMapper.java

@@ -144,4 +144,13 @@ public interface ReimbursementSysMapper  extends BaseMapper<ReimbursementDTO> {
      * @param reimbursement
      */
     void updateReimbursementRatio(ReimbursementDTO reimbursement);
+
+    /**
+     * 根据发票id查询是否已经填写收款时间
+     * @param idList
+     * @return
+     */
+    List<ReimbursementDTO> getGatheringTimeInvoiceList(@Param("idList") List<String> idList);
+
+    void updateGatheringTime(@Param("idList") List<String> idList, @Param("reimbursement") ReimbursementDTO reimbursement);
 }

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/ReimbursementUserMapper.java

@@ -3,6 +3,7 @@ package com.jeeplus.test.reimbursementsys.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO;
 import org.apache.ibatis.annotations.Param;
 
@@ -38,6 +39,12 @@ public interface ReimbursementUserMapper extends BaseMapper<ReimbursementUserDTO
     void save(ReimbursementUserDTO reimbursementUser);
 
     /**
+     * 保存人员报销信息
+     * @param reimbursementUserList
+     */
+    void saveList(@Param("reimbursementUserList")List<ReimbursementUserDTO> reimbursementUserList);
+
+    /**
      * 修改人员报销信息
      * @param reimbursementUser
      */
@@ -62,4 +69,12 @@ public interface ReimbursementUserMapper extends BaseMapper<ReimbursementUserDTO
      * @param idList
      */
     void delete(@Param("idList") List<String> idList);
+
+    /**
+     * 根据部门和人员名称查询人员信息
+     * @param reimbursementUserDTO
+     * @return
+     */
+    List<UserDTO> getUserByNameAndOfficeName(ReimbursementUserDTO reimbursementUserDTO);
+
 }

+ 29 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/xml/ReimbursementSysMapper.xml

@@ -338,4 +338,33 @@
             id = #{id}
         </where>
     </update>
+
+    <select id="getGatheringTimeInvoiceList" resultType="com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementDTO">
+        SELECT
+        <include refid="reimbursementColumns"/>
+        FROM zs_reimbursement_invoice_info a
+        <where>
+            a.del_flag = 0
+            <if test="idList != null and idList.size>0">
+                and a.id in
+                <foreach collection="idList" item="id" separator="," open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+            and gathering_time is not null
+        </where>
+        order by a.invoice_number
+    </select>
+
+    <update id="updateGatheringTime">
+        <foreach collection="idList" item="id" index="index" open="" close="" separator=";">
+            update zs_reimbursement_invoice_info
+            <set >
+                update_by = #{reimbursement.updateBy}
+                ,update_date = #{reimbursement.updateDate}
+                ,gathering_time = #{reimbursement.gatheringTime}
+            </set>
+            where id = #{id}
+        </foreach>
+    </update>
 </mapper>

+ 92 - 1
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/mapper/xml/ReimbursementUserMapper.xml

@@ -12,6 +12,7 @@
 		a.user_id AS "userId",
         a.year AS "year",
         a.reimbursement_quota AS "reimbursementQuota",
+        a.reimbursement_all_day AS "reimbursementAllDay",
         a.reimbursement_quota_day AS "reimbursementQuotaDay",
         su.id as "user.id",
         su.name as "user.name"
@@ -21,6 +22,42 @@
         left join sys_user su on su.id = a.user_id
     </sql>
 
+    <sql id="userColumns">
+    	a.id,
+    	a.company_id AS "companyDTO.id",
+    	a.office_id AS "officeDTO.id",
+    	a.login_name AS "loginName",
+		a.is_admin AS "isAdmin",
+    	a.password,
+    	a.no,
+		a.name,
+		a.email,
+		a.phone,
+		a.mobile,
+		a.login_ip AS "loginIp",
+		a.login_date AS "loginDate",
+		a.remarks,
+		a.login_flag,
+		a.photo,
+		a.qr_code,
+		a.sign,
+		a.create_by AS "createBy.id",
+		a.create_date,
+		a.update_by AS "updateBy.id",
+		a.update_date,
+    	c.name AS "companyDTO.name",
+    	c.parent_id AS "companyDTO.parent.id",
+    	c.parent_ids AS "companyDTO.parentIds",
+    	o.name AS "officeDTO.name",
+    	o.parent_id AS "officeDTO.parent.id",
+    	o.parent_ids AS "officeDTO.parentIds"
+    </sql>
+
+    <sql id="userJoins">
+		LEFT JOIN sys_office c ON c.id = a.company_id
+		LEFT JOIN sys_office o ON o.id = a.office_id
+    </sql>
+
     <select id="findList" resultType="com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO">
         SELECT
             <include refid="reimbursementUserColumns"/>
@@ -28,7 +65,7 @@
         ifnull(sum(zrbi.reimbursement_day),0) as "alreadyReimbursementDay",
         ifnull(sum(zrbi.reimbursement_amount),0) as "alreadyReimbursementAmount",
         ifnull((a.reimbursement_quota - ifnull(sum(zrbi.reimbursement_amount),0)),0) as "remainReimbursementAmount",
-        ifnull((convert(a.reimbursement_quota/a.reimbursement_quota_day,decimal(15,2)) - sum(zrbi.reimbursement_day)),0) as "surplusReimbursementDay"
+        ifnull(( CONVERT ( a.reimbursement_quota / a.reimbursement_quota_day, DECIMAL ( 15, 2 )) - ifnull(sum( zrbi.reimbursement_day ),0)), 0 ) AS "surplusReimbursementDay"
         FROM zs_reimbursement_user_info a
         <include refid="reimbursementUserJoinColumns"/>
         LEFT JOIN zs_reimbursement_business_info zrbi ON zrbi.user_id = a.user_id and zrbi.year = a.year
@@ -71,6 +108,7 @@
             user_id,
             year,
             reimbursement_quota,
+            reimbursement_all_day,
             reimbursement_quota_day
         )
         values
@@ -85,10 +123,46 @@
             #{userId},
             #{year},
             #{reimbursementQuota},
+            #{reimbursementAllDay},
             #{reimbursementQuotaDay}
         )
     </insert>
 
+    <insert id="saveList">
+        insert into zs_reimbursement_user_info (
+        id,
+        create_by,
+        create_date,
+        update_by,
+        update_date,
+        remarks,
+        del_flag,
+        user_id,
+        year,
+        reimbursement_quota,
+        reimbursement_all_day,
+        reimbursement_quota_day
+        )
+        values
+        <foreach collection="reimbursementUserList" item="item" separator=",">
+            ( #{item.id},
+            #{item.createBy},
+            #{item.createDate},
+            #{item.updateBy},
+            #{item.updateDate},
+            #{item.remarks},
+            #{item.delFlag},
+            #{item.userId},
+            #{item.year},
+            #{item.reimbursementQuota},
+            #{item.reimbursementAllDay},
+            #{item.reimbursementQuotaDay}
+            )
+        </foreach>
+    </insert>
+
+
+
     <update id="update">
         update zs_reimbursement_user_info
         set
@@ -100,6 +174,9 @@
             <if test="reimbursementQuota != null and reimbursementQuota != ''">
                 ,reimbursement_quota = #{reimbursementQuota}
             </if>
+            <if test="reimbursementAllDay != null and reimbursementAllDay != ''">
+                ,reimbursement_all_day = #{reimbursementAllDay}
+            </if>
             <if test="reimbursementQuotaDay != null and reimbursementQuotaDay != ''">
                 ,reimbursement_quota_day = #{reimbursementQuotaDay}
             </if>
@@ -129,6 +206,7 @@
             and a.user_id = #{userId}
             and a.year = #{year}
         </where>
+        order by id limit 1
     </select>
 
     <delete id="delete">
@@ -142,4 +220,17 @@
             </if>
         </where>
     </delete>
+
+    <select id="getUserByNameAndOfficeName" resultType="com.jeeplus.sys.service.dto.UserDTO">
+        SELECT
+        <include refid="userColumns"/>
+        FROM sys_user a
+        <include refid="userJoins"/>
+        <where>
+            a.del_flag = 0
+            and a.name = #{userName}
+            and o.name = #{officeName}
+        </where>
+
+    </select>
 </mapper>

+ 6 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/ReimbursementSysService.java

@@ -44,6 +44,12 @@ public interface ReimbursementSysService {
     void saveBusiness(ReimbursementDTO reimbursement);
 
     /**
+     * 保存收款时间信息
+     * @param reimbursement
+     */
+    Map<String,Object> saveGatheringTime(ReimbursementDTO reimbursement);
+
+    /**
      * 保存发票收款时间
      * @param reimbursement
      */

+ 15 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/ReimbursementUserService.java

@@ -2,6 +2,7 @@ package com.jeeplus.test.reimbursementsys.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementBusinessReturnDTO;
 import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO;
 
@@ -62,4 +63,18 @@ public interface ReimbursementUserService {
      * @return
      */
     ReimbursementBusinessReturnDTO findListByUserId(ReimbursementUserDTO reimbursementUserDTO);
+
+    /**
+     * 根据部门和人员名称查询人员信息
+     * @param reimbursementUserDTO
+     * @return
+     */
+    List<UserDTO> getUserByNameAndOfficeName(ReimbursementUserDTO reimbursementUserDTO);
+
+
+    /**
+     * 保存方法(批量导入)
+     * @param reimbursementUserList
+     */
+    Map<String,Object> saveList(List<ReimbursementUserDTO> reimbursementUserList);
 }

+ 24 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/impl/ReimbursementSysServiceImpl.java

@@ -290,6 +290,30 @@ public class ReimbursementSysServiceImpl implements ReimbursementSysService {
             mapper.saveBusiness(reimbursement);
         }
     }
+    @Override
+    public Map<String,Object> saveGatheringTime(ReimbursementDTO reimbursement) {
+        Map<String,Object> map = new HashMap<String,Object>();
+        String[] idArray =reimbursement.getId().split(",");
+        ArrayList<String> idList = Lists.newArrayList(idArray);
+        //根据id查询发票是否已经填写过收款时间信息
+        List<ReimbursementDTO> invoiceList =  mapper.getGatheringTimeInvoiceList(idList);
+        if(invoiceList.size()>0){
+            List<String> invoiceNumber = Lists.newArrayList();
+            for (ReimbursementDTO invoice : invoiceList) {
+                invoiceNumber.add(invoice.getInvoiceNumber());
+            }
+            String invoiceNumberStr = StringUtils.join(invoiceNumber, ",");
+            map.put("message","发票号:" + invoiceNumberStr + " 已经填写过收款日期,无法重复填写。<br/> 本次收款操作失败");
+            map.put("success",false);
+            return map;
+        }
+        //修改发票收款时间
+        reimbursement.preUpdate();
+        mapper.updateGatheringTime(idList,reimbursement);
+        map.put("success",true);
+        map.put("message","收款成功");
+        return map;
+    }
 
     @Override
     public void saveInvoice(ReimbursementDTO reimbursement) {

+ 155 - 30
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/reimbursementsys/service/impl/ReimbursementUserServiceImpl.java

@@ -12,10 +12,12 @@ import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO;
 import com.jeeplus.test.reimbursementsys.mapper.ReimbursementBusinessMapper;
 import com.jeeplus.test.reimbursementsys.mapper.ReimbursementUserMapper;
 import com.jeeplus.test.reimbursementsys.service.ReimbursementUserService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -74,16 +76,25 @@ public class ReimbursementUserServiceImpl implements ReimbursementUserService {
             map.put("message", "报销年份不正确,请重新填写!");
             return map;
         }
-        if(StringUtils.isBlank(reimbursementUser.getReimbursementQuota())){
+
+        if(StringUtils.isBlank(reimbursementUser.getReimbursementQuotaDay())){
             map.put("success", false);
-            map.put("message", "报销额度填写不正确!");
+            map.put("message", "报销额度填写不正确!");
             return map;
         }
-        if(StringUtils.isBlank(reimbursementUser.getReimbursementQuotaDay())){
+        if(null == reimbursementUser.getReimbursementAllDay()){
             map.put("success", false);
-            map.put("message", "日报销额度填写不正确!");
+            map.put("message", "年可报销天数填写不正确!");
             return map;
         }
+        //日报销额度
+        BigDecimal reimbursementQuotaDay = new BigDecimal(reimbursementUser.getReimbursementQuotaDay());
+        //年可报销天数
+        BigDecimal reimbursementAllDay = new BigDecimal(reimbursementUser.getReimbursementAllDay());
+
+        //计算并赋值年报销额度
+        reimbursementUser.setReimbursementQuota(reimbursementQuotaDay.multiply(reimbursementAllDay).toString());
+
         UserDTO user = UserUtils.get(reimbursementUser.getUserId());
         if(StringUtils.isNotBlank(reimbursementUser.getId())){
             reimbursementUser.preUpdate();
@@ -150,37 +161,151 @@ public class ReimbursementUserServiceImpl implements ReimbursementUserService {
         ReimbursementBusinessReturnDTO reimbursementBusinessReturnDTO = new ReimbursementBusinessReturnDTO();
         List<ReimbursementBusinessDTO> list = businessMapper.findListByUserIdAndYear(reimbursementBusiness);
 
-            //获取人员年度报销详情
-            ReimbursementUserDTO reimbursementUserInfo = mapper.queryByUserIdAndYear(reimbursementUserDTO);
-            reimbursementBusinessReturnDTO.setList(list);
-            reimbursementBusinessReturnDTO.setReimbursementQuota(reimbursementUserInfo.getReimbursementQuota());
+        //获取人员年度报销详情
+        ReimbursementUserDTO reimbursementUserInfo = mapper.queryByUserIdAndYear(reimbursementUserDTO);
+        reimbursementBusinessReturnDTO.setList(list);
+        reimbursementBusinessReturnDTO.setReimbursementQuota(reimbursementUserInfo.getReimbursementQuota());
+
+        //已报销额度
+        BigDecimal alreadyReimbursementAmount = new BigDecimal("0");
+        //已报销天数
+        BigDecimal alreadyReimbursementDay = new BigDecimal("0");
+
+        for (ReimbursementBusinessDTO info : list) {
+            BigDecimal bigDecimal = new BigDecimal(info.getReimbursementAmount());
+            alreadyReimbursementAmount = alreadyReimbursementAmount.add(bigDecimal);
+            alreadyReimbursementDay = alreadyReimbursementDay.add(new BigDecimal(info.getReimbursementDay()));
+        }
+        //剩余报销额度
+        reimbursementBusinessReturnDTO.setSurplusReimbursementAmount(new BigDecimal(reimbursementBusinessReturnDTO.getReimbursementQuota()).subtract(alreadyReimbursementAmount).toString());
+        //计算出可报销总天数
+        BigDecimal reimbursementDay = new BigDecimal("0");
+        if(null == reimbursementUserInfo.getReimbursementAllDay()){
+            reimbursementDay = new BigDecimal(reimbursementBusinessReturnDTO.getReimbursementQuota()).divide(new BigDecimal(reimbursementUserInfo.getReimbursementQuotaDay()),2, BigDecimal.ROUND_HALF_UP);
+        }else{
+            reimbursementDay = new BigDecimal(reimbursementUserInfo.getReimbursementAllDay());
+        }
+
+        //剩余报销天数
+        reimbursementBusinessReturnDTO.setSurplusReimbursementDay(reimbursementDay.subtract(alreadyReimbursementDay).toString());
+        //报销天数
+        reimbursementBusinessReturnDTO.setReimbursementDay(reimbursementDay.toString());
+        //已报销天数
+        reimbursementBusinessReturnDTO.setAlreadyReimbursementDay(alreadyReimbursementDay.toString());
+        //已报销额度
+        reimbursementBusinessReturnDTO.setAlreadyReimbursementAmount(alreadyReimbursementAmount.toString());
+        //日报销额度
+        reimbursementBusinessReturnDTO.setReimbursementQuotaDay(reimbursementUserInfo.getReimbursementQuotaDay());
+
+        return reimbursementBusinessReturnDTO;
+    }
+
+    @Override
+    public List<UserDTO> getUserByNameAndOfficeName(ReimbursementUserDTO reimbursementUserDTO) {
+        return mapper.getUserByNameAndOfficeName(reimbursementUserDTO);
+    }
+
+    @Override
+    public Map<String, Object> saveList(List<ReimbursementUserDTO> reimbursementUserList) {
 
-            //已报销额度
-            BigDecimal alreadyReimbursementAmount = new BigDecimal("0");
-            //已报销天数
-            BigDecimal alreadyReimbursementDay = new BigDecimal("0");
+        List<ReimbursementUserDTO> saveList = Lists.newArrayList();
+        List<ReimbursementUserDTO> existList = Lists.newArrayList();
+        StringBuilder failureMsg = new StringBuilder ( );
 
-            for (ReimbursementBusinessDTO info : list) {
-                BigDecimal bigDecimal = new BigDecimal(info.getReimbursementAmount());
-                alreadyReimbursementAmount = alreadyReimbursementAmount.add(bigDecimal);
-                alreadyReimbursementDay = alreadyReimbursementDay.add(new BigDecimal(info.getReimbursementDay()));
+        Map<String,Object> map = new HashMap<>();
+        Map<String, List<ReimbursementUserDTO>> stringListMap = dataDispose(reimbursementUserList);
+        if(reimbursementUserList.size() != stringListMap.size()){
+            map.put("success", false);
+            map.put("message", "报销人员中存在重复项,无法进行导入!");
+            return map;
+        }
+
+
+        for (ReimbursementUserDTO reimbursementUser: reimbursementUserList) {
+            if(StringUtils.isBlank(reimbursementUser.getYear())){
+                map.put("success", false);
+                map.put("message", reimbursementUser.getUserName() + " 的报销年份不正确,请重新填写!");
+                return map;
+            }
+            if(StringUtils.isBlank(reimbursementUser.getReimbursementQuotaDay())){
+                map.put("success", false);
+                map.put("message", reimbursementUser.getUserName() + " 的日报销额度填写不正确!");
+                return map;
+            }
+            if(null == reimbursementUser.getReimbursementAllDay()){
+                map.put("success", false);
+                map.put("message", reimbursementUser.getUserName() + " 的年可报销天数填写不正确!");
+                return map;
             }
-            //剩余报销额度
-            reimbursementBusinessReturnDTO.setSurplusReimbursementAmount(new BigDecimal(reimbursementBusinessReturnDTO.getReimbursementQuota()).subtract(alreadyReimbursementAmount).toString());
-            //计算出可报销总天数
-            BigDecimal reimbursementDay = new BigDecimal(reimbursementBusinessReturnDTO.getReimbursementQuota()).divide(new BigDecimal(reimbursementUserInfo.getReimbursementQuotaDay()),2, BigDecimal.ROUND_HALF_UP);
-            //剩余报销天数
-            reimbursementBusinessReturnDTO.setSurplusReimbursementDay(reimbursementDay.subtract(alreadyReimbursementDay).toString());
-            //报销天数
-            reimbursementBusinessReturnDTO.setReimbursementDay(reimbursementDay.toString());
-            //已报销天数
-            reimbursementBusinessReturnDTO.setAlreadyReimbursementDay(alreadyReimbursementDay.toString());
-            //已报销额度
-            reimbursementBusinessReturnDTO.setAlreadyReimbursementAmount(alreadyReimbursementAmount.toString());
             //日报销额度
-            reimbursementBusinessReturnDTO.setReimbursementQuotaDay(reimbursementUserInfo.getReimbursementQuotaDay());
+            BigDecimal reimbursementQuotaDay = new BigDecimal(reimbursementUser.getReimbursementQuotaDay());
+            //年可报销天数
+            BigDecimal reimbursementAllDay = new BigDecimal(reimbursementUser.getReimbursementAllDay());
 
-        return reimbursementBusinessReturnDTO;
+            //计算并赋值年报销额度
+            reimbursementUser.setReimbursementQuota(reimbursementQuotaDay.multiply(reimbursementAllDay).toString());
+
+            //根据用户id和年份查询报数员工库表中是否存在数据
+            //如果有,则将其从list列表中剔除
+            ReimbursementUserDTO reimbursementUserDTOS = mapper.queryByUserIdAndYear(reimbursementUser);
+            if(null != reimbursementUserDTOS){
+                existList.add(reimbursementUser);
+            }else{
+                reimbursementUser.preInsert();
+                saveList.add(reimbursementUser);
+            }
+
+        }
+
+
+        //新增
+        if(saveList.size()>0){
+            mapper.saveList(saveList);
+        }
+
+        if(existList.size()>0){
+            for (ReimbursementUserDTO user : existList) {
+                failureMsg.append ( "。 " + user.getOfficeName() + " 部门下的员工 " + user.getUserName() + " 已添加,无法再次添加;" );
+            }
+        }
+
+        map.put("success", true);
+        map.put("saveCount", saveList.size());
+        map.put("message", failureMsg);
+
+        return map;
+    }
+
+
+    /**
+     * 文件数据分组
+     * @param dataList
+     * @return
+     */
+    public Map<String, List<ReimbursementUserDTO>> dataDispose(List<ReimbursementUserDTO> dataList) {
+        Map<String, List<ReimbursementUserDTO>> result = listMap(dataList);
+        return result;
+    }
+
+    private Map<String, List<ReimbursementUserDTO>> listMap(List<ReimbursementUserDTO> list) {
+        Map<String, List<ReimbursementUserDTO>> userSignSerialMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(list)) {
+            // 分组
+            for (ReimbursementUserDTO vo : list) {
+                List<ReimbursementUserDTO> tempList = userSignSerialMap.get(vo.getKeyFlag());
+                /*如果取不到数据,那么直接new一个空的ArrayList**/
+                if (tempList == null) {
+                    tempList = new ArrayList<>();
+                    tempList.add(vo);
+                    userSignSerialMap.put(vo.getKeyFlag(), tempList);
+                }
+                else {
+                    /*某个vo之前已经存放过了,则直接追加数据到原来的List里**/
+                    tempList.add(vo);
+                }
+            }
+        }
+        return userSignSerialMap;
     }
 
 }

+ 1 - 1
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/controller/UserController.java

@@ -219,7 +219,7 @@ public class UserController {
             int successNum = 0;
             int failureNum = 0;
             StringBuilder failureMsg = new StringBuilder ( );
-            List <UserDTO> list = EasyPoiUtil.importExcel ( file, 1, 1, UserDTO.class );
+            List <UserDTO> list = EasyPoiUtil.importExcel ( file, 1, 2, UserDTO.class );
             for (UserDTO user : list) {
                 try {
                     if ( isCheckLoginName ( "", user.getLoginName ( ) ) ) {

+ 2 - 5
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/ImportExcel.java

@@ -5,10 +5,8 @@ package com.jeeplus.sys.utils;
 
 import com.google.common.collect.Lists;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -23,7 +21,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.text.NumberFormat;
 import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Comparator;
@@ -192,7 +189,7 @@ public class ImportExcel {
 	 */
 	public Object getCellValue(Row row, int column) {
 		Object val = "";
-		try {
+		/*try {
 			Cell cell = row.getCell(column);
 
 			if (cell != null) {
@@ -241,7 +238,7 @@ public class ImportExcel {
 			}
 		} catch (Exception e) {
 			return val;
-		}
+		}*/
 		return val;
 	}
 

+ 2 - 2
jeeplus-web/src/main/resources/application-development.yml

@@ -48,7 +48,7 @@ spring:
         master:
           username: root
           password: root
-          url: jdbc:mysql://127.0.0.1:3306/jeeplus-vue-base?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
+          url: jdbc:mysql://127.0.0.1:3306/jeeplus-vue-base?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           driver-class-name: com.mysql.cj.jdbc.Driver
 
           #oracle database settings
@@ -85,7 +85,7 @@ spring:
     port: 6379
     expireTime: 3600000 #单位秒
     database: 1
-    password: 123456
+    password:
   mvc.servlet.load-on-startup: 1
   jmx:
     enabled: false

+ 1 - 1
jeeplus-web/src/main/resources/application-production.yml

@@ -50,7 +50,7 @@ spring:
         master:
           username: root
           password: root
-          url: jdbc:mysql://127.0.0.1:3306/jeeplus-vue?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
+          url: jdbc:mysql://127.0.0.1:3306/jeeplus-vue?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
           driver-class-name: com.mysql.cj.jdbc.Driver
 
           #oracle database settings

+ 2 - 2
pom.xml

@@ -226,7 +226,7 @@
             <version>4.3.0</version>
         </dependency>
 
-        <dependency>
+        <!--<dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
             <version>3.17</version>
@@ -240,7 +240,7 @@
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>3.17</version>
-        </dependency>
+        </dependency>-->
         <!--<dependency>
             <groupId>com.belerweb</groupId>
             <artifactId>pinyin4j</artifactId>