Просмотр исходного кода

Merge remote-tracking branch 'origin/test' into test

zhouzeyu@c-top.com.cn 3 лет назад
Родитель
Сommit
5fc47f85ff
23 измененных файлов с 714 добавлено и 191 удалено
  1. 12 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsPolicyInfoController.java
  2. 22 16
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/DemoController.java
  3. 1 1
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyInfoMapper.xml
  4. 5 9
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/controller/SettlementController.java
  5. 2 6
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/controller/SettlementFileController.java
  6. 2 2
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/ctopCwjsSettlementFileInfo.java
  7. 1 1
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/ctopCwjsSettlementInfo.java
  8. 27 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/CtopCwjsSlettementReport.java
  9. 28 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/CwjsProfitMapper.java
  10. 10 7
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/ReportSettlementMapper.java
  11. 2 4
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/SettlementFileInfoMapper.java
  12. 3 3
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/SettlementInfoMapper.java
  13. 27 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/CwjsProfitMapper.xml
  14. 123 26
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/ReportSettlementMapper.xml
  15. 3 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/SettlementFileInfoMapper.xml
  16. 1 1
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/SettlementInfoMapper.xml
  17. 8 3
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/IReportSettlementService.java
  18. 3 5
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/ISettlementFileInfoService.java
  19. 4 5
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/ISettlementInfoService.java
  20. 209 47
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/ReportSettlementServiceImpl.java
  21. 6 21
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/SettlementFileInfoServiceImpl.java
  22. 10 14
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/SettlementInfoServiceImpl.java
  23. 205 20
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/utils/SettlementUtil.java

+ 12 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsPolicyInfoController.java

@@ -149,6 +149,18 @@ public class CwjsPolicyInfoController {
 			 CwjsCompanyApprovalUser nextApprovalUser = companyApprovalUserMapper.queryByCompanySubjectIdAndLevel(companySubjectId, cwjsCompanyApprovalUser.getLevel() + 1);
 			 if(!Check.isNull(cwjsCompanyApprovalUser) && Check.isNull(nextApprovalUser)){//没有下一个审核人员,是终审
 				cwjsPolicyInfoEntity.setApprovedStatus(3);
+
+				 /**
+				  * 终审通过后 添加 起始时间
+				  */
+
+
+
+
+
+
+
+
 			}else{	//不是终审
 				cwjsPolicyInfoEntity.setApprovedStatus(2);
 				cwjsPolicyInfoEntity.setApprovedProgress(nextApprovalUser.getApprovalUserId());	//设置一下个人为审核人员

+ 22 - 16
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/DemoController.java

@@ -1,16 +1,15 @@
+/*
 package org.jeecg.ctop.finance.policy.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
 import org.jeecg.ctop.finance.settlement.service.ISettlementInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -20,15 +19,16 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.List;
 
+*/
 /**
  *
  * @description: demo
  *
  * @author: zian Y
  * @time: 2021/7/26
- */
+ *//*
+
 @RestController
 @RequestMapping("/finance/policy")
 @Api(tags="头条-财务结算-demo")
@@ -49,35 +49,40 @@ public class DemoController {
 
 
 
-    /**
+    */
+/**
      * @description:测试 注解 @Dict  返回类型 为 IPage
      *
      * @return: org.jeecg.common.api.vo.Result<com.baomidou.mybatisplus.core.metadata.IPage<org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo>>
      * @author: zianY
      * @time: 2021/7/28 18:36
-     */
+     *//*
+
     @ApiOperation(value="test", notes="test")
     @GetMapping(value = "/test")
-    public Result<IPage<ctopCwjsSettlementInfo>> test(ctopCwjsSettlementInfo SettlementInfoPojo,
+    public Result<IPage<CtopCwjsSettlementInfo>> test(CtopCwjsSettlementInfo SettlementInfoPojo,
                                                       @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                       @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                       HttpServletRequest req) {
-        QueryWrapper<ctopCwjsSettlementInfo> queryWrapper = QueryGenerator.initQueryWrapper(SettlementInfoPojo, req.getParameterMap());
-        Page<ctopCwjsSettlementInfo> page = new Page<>(pageNo, pageSize);
-        IPage<ctopCwjsSettlementInfo> list = settlementInfoService.page(page, queryWrapper);
+        QueryWrapper<CtopCwjsSettlementInfo> queryWrapper = QueryGenerator.initQueryWrapper(SettlementInfoPojo, req.getParameterMap());
+        Page<CtopCwjsSettlementInfo> page = new Page<>(pageNo, pageSize);
+        IPage<CtopCwjsSettlementInfo> list = settlementInfoService.page(page, queryWrapper);
         return Result.successMsg("chenggong.",list);
     }
 
 
-    /**
+    */
+/**
      *
      * @description:  注解 @Dict 返回类型 为 PageInfo
 
      * @return: org.jeecg.common.api.vo.Result<com.github.pagehelper.PageInfo<org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo>>
      * @author: zianY
      * @time: 2021/7/28 20:35
-     */
-   /* @ApiOperation(value="test2", notes="test2")
+     *//*
+
+   */
+/* @ApiOperation(value="test2", notes="test2")
     @GetMapping(value = "/test2")
     public Result<PageInfo<ctopCwjsSettlementInfo>> test2(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                         @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
@@ -86,10 +91,11 @@ public class DemoController {
         PageInfo<ctopCwjsSettlementInfo> pageInfo = new PageInfo<>(list);
         return Result.successMsg("chenggong.",pageInfo);
     }
-*/
+*//*
+
 
 
 
 
 
-}
+}*/

+ 1 - 1
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyInfoMapper.xml

@@ -97,7 +97,7 @@
           AND t2.role_id = t3.id
           AND t1.STATUS = 1
           AND t1.del_flag = 0
-          AND t3.role_code LIKE '%peration%'
+          AND t3.role_name LIKE '%运营%'
 
     </select>
 

+ 5 - 9
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/controller/SettlementController.java

@@ -1,14 +1,10 @@
 package org.jeecg.ctop.finance.settlement.controller;
 
-import cn.com.ctop.common.module.service.impl.SysUserServiceImpl;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.checkerframework.checker.units.qual.A;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyInfoMapper;
 import org.jeecg.ctop.finance.policy.service.impl.CwjsPolicyInfoServiceImpl;
-import org.jeecg.ctop.finance.policy.utils.Check;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
 
 
 import org.jeecg.ctop.finance.settlement.service.ISettlementInfoService;
@@ -46,9 +42,9 @@ public class SettlementController {
 
     @ApiOperation(value="财务结算-账户列表查询", notes="财务结算-账户列表查询")
     @GetMapping(value = "/getSettlementList")
-    public Result getSettlementList(ctopCwjsSettlementInfo settlementInfo,
-                                                                      @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-                                                                      @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
+    public Result getSettlementList(CtopCwjsSettlementInfo settlementInfo,
+                                    @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                    @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
         //查询用户角色
         String roleCode = sysRoleService.getRoleCodeByUserId(settlementInfo.getCreateUserId());
         //普通用户
@@ -83,7 +79,7 @@ public class SettlementController {
 
     @ApiOperation(value="财务结算-上传账户", notes="财务结算-上传账户")
     @PostMapping("/settlementAccountImport")
-    public Result settlementAccountImport(ctopCwjsSettlementInfo settlementInfo,@RequestParam("file") MultipartFile files) {
+    public Result settlementAccountImport(CtopCwjsSettlementInfo settlementInfo, @RequestParam("file") MultipartFile files) {
         if (files.isEmpty()){
             return Result.errorMsg("附件不能为空!");
         }

+ 2 - 6
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/controller/SettlementFileController.java

@@ -5,19 +5,15 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.ctop.finance.policy.utils.Check;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementFileInfo;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementFileInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 import org.jeecg.ctop.finance.settlement.service.ISettlementFileInfoService;
-import org.jeecg.ctop.finance.settlement.service.ISettlementInfoService;
 import org.jeecg.modules.ctop.service.IMaterialReportOverViewService;
 import org.jeecg.modules.system.service.ISysRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -97,7 +93,7 @@ public class SettlementFileController {
 
     @ApiOperation(value="结算单-账户截图上传", notes="结算单-账户截图上传")
     @PostMapping(value = "/insertAccountImages")
-    public Result insertAccountImages(@RequestBody ctopCwjsSettlementFileInfo settlementFileInfo) {
+    public Result insertAccountImages(@RequestBody CtopCwjsSettlementFileInfo settlementFileInfo) {
         if (Check.isNull(settlementFileInfo.getSettlementList())){
             return Result.errorMsg("账户截图不能为空!");
         }

+ 2 - 2
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/ctopCwjsSettlementFileInfo.java

@@ -16,7 +16,7 @@ import java.util.List;
  **/
 
 @Data
-public class ctopCwjsSettlementFileInfo implements Serializable {
+public class CtopCwjsSettlementFileInfo implements Serializable {
 
     @TableId(type = IdType.AUTO)
     /**
@@ -107,6 +107,6 @@ public class ctopCwjsSettlementFileInfo implements Serializable {
     private Date updateTime;
 
     @TableField(exist = false)
-    private List<ctopCwjsSettlementFileInfo> settlementList;
+    private List<CtopCwjsSettlementFileInfo> settlementList;
 
 }

+ 1 - 1
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/ctopCwjsSettlementInfo.java

@@ -17,7 +17,7 @@ import java.util.Set;
  **/
 
 @Data
-public class ctopCwjsSettlementInfo implements Serializable {
+public class CtopCwjsSettlementInfo implements Serializable {
 
     @TableId(type = IdType.AUTO)
     /**

+ 27 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/pojo/CtopCwjsSlettementReport.java

@@ -0,0 +1,27 @@
+package org.jeecg.ctop.finance.settlement.entity.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * 财务结算 计算利润表
+ * zian Y
+ **/
+
+@Data
+public class CtopCwjsSlettementReport implements Serializable {
+
+    private Long id;
+    private Integer policyId;
+    private String advertiserName;
+    private String productName;
+    private String policyDate;
+    private Integer mediaType;
+    private String createUserId;
+}

+ 28 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/CwjsProfitMapper.java

@@ -0,0 +1,28 @@
+package org.jeecg.ctop.finance.settlement.mapper;
+
+import io.lettuce.core.dynamic.annotation.Param;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSlettementReport;
+import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
+import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportBytedanceVo;
+import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportKuaiShouVo;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ *
+ * @description:
+ *
+ * @return:
+ * @author: zianY
+ */
+public interface CwjsProfitMapper {
+
+
+    void replaceCwjsSlettementProfit(List<CtopCwjsSlettementReport> list);
+
+
+
+
+}

+ 10 - 7
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/ReportSettlementMapper.java

@@ -1,8 +1,6 @@
 package org.jeecg.ctop.finance.settlement.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import io.lettuce.core.dynamic.annotation.Param;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportBytedanceVo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportKuaiShouVo;
@@ -47,14 +45,15 @@ public interface ReportSettlementMapper {
      * @param accountId
      * @return
      */
-   List<String> getAccountImagesBytedance(String accountId);
+   List<String> getAccountImagesBytedance(@Param("accountId") String accountId,@Param("uploadYears")String uploadYears);
 
 
     /**
      * 查询 头条利润表 总花费
      * @return
      */
-    List<Map<String,Object>> getProfitBytedanceCost(String uploadYears);
+    List<Map<String,Object>> getProfitBytedanceAccountCost(@Param("accountId") String accountId,@Param("startTime") String startTime,@Param("endTime") String endTime);
+    List<Map<String,Object>> getProfitBytedanceCost(@Param("accountId") String accountId,@Param("startTime") String startTime,@Param("endTime") String endTime);
 
     /**
      * 查询 快手 利润表 总花费
@@ -64,11 +63,15 @@ public interface ReportSettlementMapper {
     List<Map<String,Object>> getProfitKuaiShou(String uploadYears);
 
     /**
-     * 查询 头条利润表  销售人员姓名 以及 返点类型和比列
-     * @param productId
+     * 查询 头条利润表  返点类型和比列
+     * @param
      * @return
      */
-    Map<String,Object> getProfitBytedanceSale(String productId);
+    List<Map<String,Object>> getProfitBytedance(@Param("productName") String productName,@Param("mediaType") String mediaType,@Param("startTime")String startTime,@Param("endTime")String endTime);
+
+    Map<String,Object> getProfitRebate(@Param("productName") String productName,@Param("startTime")String startTime,@Param("endTime")String endTime);
+
+    Map<String,Object> getProfitBytedanceSale(String accountId);
 
     Map<String,Object> getProfitBytedanceOperate(String accountId);
 

+ 2 - 4
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/SettlementFileInfoMapper.java

@@ -1,9 +1,7 @@
 package org.jeecg.ctop.finance.settlement.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import io.lettuce.core.dynamic.annotation.Param;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementFileInfo;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementFileInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 
 import java.util.List;
@@ -18,7 +16,7 @@ import java.util.Map;
  * @author: zianY
  * @time: 2021/7/28 17:07
  */
-public interface SettlementFileInfoMapper extends BaseMapper<ctopCwjsSettlementFileInfo> {
+public interface SettlementFileInfoMapper extends BaseMapper<CtopCwjsSettlementFileInfo> {
 
     /**
      *查询 财务结算-结算单列表

+ 3 - 3
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/SettlementInfoMapper.java

@@ -2,7 +2,7 @@ package org.jeecg.ctop.finance.settlement.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import io.lettuce.core.dynamic.annotation.Param;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
 
 import java.util.List;
 import java.util.Map;
@@ -17,14 +17,14 @@ import java.util.Set;
  * @author: zianY
  * @time: 2021/7/28 17:07
  */
-public interface SettlementInfoMapper extends BaseMapper<ctopCwjsSettlementInfo> {
+public interface SettlementInfoMapper extends BaseMapper<CtopCwjsSettlementInfo> {
 
     /**
      *查询 财务结算-账户列表
      * @param settlementInfo
      * @return
      */
-    List<ctopCwjsSettlementInfo> getSettlementList(ctopCwjsSettlementInfo settlementInfo);
+    List<CtopCwjsSettlementInfo> getSettlementList(CtopCwjsSettlementInfo settlementInfo);
 
     /**
      *修改财务结算账户状态

+ 27 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/CwjsProfitMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.ctop.finance.settlement.mapper.CwjsProfitMapper">
+
+
+    <insert id="replaceCwjsSlettementProfit">
+            replace into ctop_cwjs_slettement_report(
+            advertiser_name,
+            product_name,
+            policy_date,
+            create_user_id,
+            media_type,
+            policy_id
+            )
+            values
+            <foreach collection="list" item="l" separator=",">
+                (#{l.advertiserName},
+                #{l.productName},
+                #{l.policyDate},
+                #{l.createUserId},
+                #{l.mediaType},
+                #{l.policyId})
+            </foreach>
+    </insert>
+
+
+</mapper>

+ 123 - 26
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/ReportSettlementMapper.xml

@@ -44,6 +44,7 @@
         ctop_cwjs_settlement_file_info
         where del_flag = 0
         AND account_id = #{accountId}
+        AND upload_years = #{uploadYears}
 
     </select>
 
@@ -74,54 +75,146 @@
 
 
 
-    <!-- 查询 头条利润表 总花费-->
-    <select id="getProfitBytedanceCost" resultType="java.util.LinkedHashMap">
+    <!-- 查询 头条利润表 所用账户-->
+    <select id="getProfitBytedanceAccountCost" resultType="java.util.LinkedHashMap">
         SELECT
-            d.advertiser_id AS accountId,
-            SUM( d.cost ) AS cost,
-            SUM( d.cash_cost ) AS cashCost,
-            SUM( d.reward_cost ) rewardCost,
-            cwjs.product_id as productId,
-            p.product_name AS productName
+        d.advertiser_id AS accountId,
+        SUM( d.cost ) AS cost,
+        SUM( d.cash_cost ) AS cashCost,
+        SUM( d.reward_cost ) rewardCost,
+        pd.id as productId,
+        pd.product_name AS productName
         FROM
-            ctop_account_transaction_day d
-                LEFT JOIN ctop_cwjs_settlement_info cwjs ON d.advertiser_id = cwjs.account_id
-                LEFT JOIN ctop_product p ON cwjs.product_id = p.id
-        WHERE
-            cwjs.del_flag = 0
-        <if test="uploadYears !=null and uploadYears != ''">
-            AND DATE_FORMAT(d.date,'%Y-%m') = #{uploadYears}
-        </if>
+        ctop_account_transaction_day d
+        LEFT JOIN ctop_user_allocation u ON d.advertiser_id = u.account_id
+        LEFT JOIN ctop_project p ON u.project_id = p.id
+        LEFT JOIN ctop_product pd on pd.id = p.product_id
+
+        <where>
+            <if test="accountId !=null and accountId != ''">
+                AND d.advertiser_id = #{accountId}
+            </if>
+            <if test="startTime !=null and startTime != ''">
+                AND d.date &gt;= #{startTime}
+            </if>
+            <if test="endTime !=null and endTime != ''">
+                AND d.date &lt;= #{endTime}
+            </if>
+            AND u.media_id = 1 or u.media_id = 3
+        </where>
         GROUP BY
             d.advertiser_id;
 
     </select>
 
 
+    <!-- 查询 头条利润表 总花费-->
+    <select id="getProfitBytedanceCost" resultType="java.util.LinkedHashMap">
+        SELECT
+        d.advertiser_id AS accountId,
+        SUM( d.cost ) AS cost,
+        SUM( d.cash_cost ) AS cashCost,
+        SUM( d.reward_cost ) rewardCost,
+        pd.id as productId,
+        pd.product_name AS productName
+        FROM
+        ctop_account_transaction_day d
+        LEFT JOIN ctop_user_allocation u ON d.advertiser_id = u.account_id
+        LEFT JOIN ctop_project p ON u.project_id = p.id
+        LEFT JOIN ctop_product pd on pd.id = p.product_id
+        where (u.media_id = 1 or u.media_id = 3)
+            <if test="accountId !=null and accountId != ''">
+                AND d.advertiser_id = #{accountId}
+            </if>
+            <if test="startTime !=null and startTime != ''">
+                AND d.date &gt;= #{startTime}
+            </if>
+            <if test="endTime !=null and endTime != ''">
+                AND d.date &lt;= #{endTime}
+            </if>
+
+
+
+    </select>
+
+
+
+    <!-- 查询 头条利润表  返点类型和比列-->
+    <select id="getProfitBytedance" resultType="java.util.LinkedHashMap">
 
-    <!-- 查询 头条利润表  销售人员姓名 以及 返点类型和比列-->
-    <select id="getProfitBytedanceSale" resultType="java.util.LinkedHashMap">
         SELECT
         pp.create_user_id,
-        su.realname AS saleName,
         cp.rebate_type AS rebateType,
         cp.rebate_rate AS rebateRate,
         cp.approved_status AS approvedStatus,
         cp.policy_start_date as policyStartDate,
-        DATE_FORMAT(cp.policy_start_date,'%Y-%m') as policyStart,
         cp.policy_end_date as policyEndDate,
-        DATE_FORMAT(cp.policy_end_date,'%Y-%m') as policyEnd
+        cp.create_time as createTime
         FROM
         ctop_cwjs_policy_product pp
-        LEFT JOIN sys_user su ON pp.create_user_id = su.id
         LEFT JOIN ctop_cwjs_policy_info cp ON cp.id = pp.policy_id
         WHERE
         pp.del_flag = 0
         AND cp.del_flag = 0
-        <if test="productId !=null and productId != ''">
-            AND pp.id = #{productId}
+        and cp.approved_status = 3
+        <if test="mediaType !=null and mediaType != ''">
+            AND cp.media_type = #{mediaType}
+        </if>
+        <if test="productName !=null and productName != ''">
+            AND pp.policy_product_name = #{productName}
+        </if>
+        <if test="startTime !=null and startTime != ''">
+            AND  cp.policy_start_date &gt;= #{startTime}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            AND cp.policy_end_date &lt;= #{endTime}
         </if>
 
+    </select>
+
+
+    <!-- 查询 利润表  返点类型和比列-->
+    <select id="getProfitRebate" resultType="java.util.LinkedHashMap">
+        SELECT
+        p.id,
+        p.rebate_type AS rebateType,
+        p.rebate_rate AS rebateRate
+        FROM
+        ctop_cwjs_slettement_report r
+        LEFT JOIN ctop_cwjs_policy_info p ON r.policy_id = p.id
+        WHERE
+        p.del_flag = 0
+        <if test="productName !=null and productName != ''">
+            AND r.product_name = #{productName}
+        </if>
+        <if test="startTime !=null and startTime != ''">
+            AND  r.policy_date &gt;= #{startTime}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            AND r.policy_date &lt;= #{endTime}
+        </if>
+        GROUP BY
+        p.id
+        limit 1
+
+
+
+
+    </select>
+
+
+    <!-- 查询 头条利润表  销售人员姓名 -->
+    <select id="getProfitBytedanceSale" resultType="java.util.LinkedHashMap">
+
+        SELECT f.create_user_id,u.realname as saleName
+        from ctop_cwjs_settlement_info f
+        LEFT  JOIN sys_user u on u.id = f.create_user_id
+        where f.del_flag = 0
+        <if test="accountId !=null and accountId != ''">
+            AND f.account_id = #{accountId}
+        </if>
+        limit 1
+
 
     </select>
 
@@ -161,9 +254,13 @@
                 LEFT JOIN ctop_product p ON cwjs.product_id = p.id
         WHERE
             cwjs.del_flag = 0
-        <if test="uploadYears !=null and uploadYears != ''">
-          and DATE_FORMAT(d.date,'%Y-%m') = #{uploadYears}
+        <if test="startTime !=null and startTime != ''">
+            AND d.date &gt;= #{startTime}
+        </if>
+        <if test="endTime !=null and endTime != ''">
+            AND d.date &lt;= #{endTime}
         </if>
+
         GROUP BY
             d.account_id;
     </select>

+ 3 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/SettlementFileInfoMapper.xml

@@ -207,6 +207,9 @@
                         <if test="mediaId !=null and mediaId != ''">
                             AND media_id = #{mediaId}
                         </if>
+                           <if test="uploadYears !=null and uploadYears != ''">
+                            AND upload_years = #{uploadYears}
+                        </if>
                      ) t2
     </select>
 

+ 1 - 1
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/mapper/xml/SettlementInfoMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="org.jeecg.ctop.finance.settlement.mapper.SettlementInfoMapper">
 
     <!-- 查询 财务结算-账户列表-->
-    <select id="getSettlementList" resultType="org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo">
+    <select id="getSettlementList" resultType="org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo">
         SELECT * from (
         SELECT
             id,

+ 8 - 3
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/IReportSettlementService.java

@@ -1,11 +1,9 @@
 package org.jeecg.ctop.finance.settlement.service;
 
-import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportBytedanceVo;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
@@ -30,4 +28,11 @@ public interface IReportSettlementService {
 
     Result sendMessageToOperate(String userId);
 
+
+
+
+
+    void cwjsPRofit(CwjsPolicyInfo cwjsPolicyInfo);
+
+
 }

+ 3 - 5
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/ISettlementFileInfoService.java

@@ -3,21 +3,19 @@ package org.jeecg.ctop.finance.settlement.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.pagehelper.PageInfo;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementFileInfo;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementFileInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 
-import java.util.List;
 import java.util.Map;
 
-public interface ISettlementFileInfoService extends IService<ctopCwjsSettlementFileInfo> {
+public interface ISettlementFileInfoService extends IService<CtopCwjsSettlementFileInfo> {
 
     Result<PageInfo<Map<String,String>>> getSettlementSheetList(SettlementFileParamsVo paramsVo, Integer pageNo, Integer pageSize);
 
 
     Result deleteSettlementFile(SettlementFileParamsVo paramsVo);
 
-    Result insertAccountImages(ctopCwjsSettlementFileInfo settlementFileInfo);
+    Result insertAccountImages(CtopCwjsSettlementFileInfo settlementFileInfo);
 
     Result getAccountNumAndImgNum(SettlementFileParamsVo paramsVo);
 

+ 4 - 5
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/ISettlementInfoService.java

@@ -2,23 +2,22 @@ package org.jeecg.ctop.finance.settlement.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-public interface ISettlementInfoService extends IService<ctopCwjsSettlementInfo> {
+public interface ISettlementInfoService extends IService<CtopCwjsSettlementInfo> {
 
-    Result getSettlementList(ctopCwjsSettlementInfo settlementInfo, Integer pageNo, Integer pageSize);
+    Result getSettlementList(CtopCwjsSettlementInfo settlementInfo, Integer pageNo, Integer pageSize);
 
     Result updSettlementStatusById(Long id,Integer status);
 
     Result deleteSettlementById(Long id);
 
-    Result settlementAccountImport(ctopCwjsSettlementInfo settlementInfo,MultipartFile file);
+    Result settlementAccountImport(CtopCwjsSettlementInfo settlementInfo, MultipartFile file);
 
 
     List<Map<String,Object>> getUserByIds(Set userIds);

+ 209 - 47
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/ReportSettlementServiceImpl.java

@@ -5,6 +5,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.com.ctop.common.module.mapper.MailLogMapper;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -14,25 +15,32 @@ import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
+import org.jeecg.ctop.finance.policy.entity.CwjsPolicyProduct;
+import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyProductMapper;
 import org.jeecg.ctop.finance.policy.utils.Check;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSlettementReport;
 import org.jeecg.ctop.finance.settlement.entity.vo.*;
+import org.jeecg.ctop.finance.settlement.mapper.CwjsProfitMapper;
 import org.jeecg.ctop.finance.settlement.mapper.ReportSettlementMapper;
+import org.jeecg.ctop.finance.settlement.mapper.SettlementInfoMapper;
 import org.jeecg.ctop.finance.settlement.service.IReportSettlementService;
 import org.jeecg.ctop.finance.utils.SettlementUtil;
 import org.jeecg.ctop.finance.utils.createExcelByTemplate;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
+import javax.swing.*;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URLEncoder;
 import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -48,6 +56,9 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
     @Resource
     private MailLogMapper mailLogMapper;
 
+    @Resource
+    private CwjsProfitMapper cwjsProfitMapper;
+
 
     @Override
     public List<SettlementReportBytedanceVo> getAccountTransactionDayBytedance() {
@@ -193,7 +204,7 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
                 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
 
                 //查询 图片 url
-                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId);
+                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId,paramsVo.getUploadYears());
 
                 if (!Check.isNull(imageUrlList)){
                     for (int j = 0; j < imageUrlList.size(); j++) {
@@ -202,8 +213,9 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
                         InputStream is = createExcelByTemplate.getInputStreamByUrl(imagePath);
                         BufferedImage bufferImg = ImageIO.read(is);
                         ImageIO.write(bufferImg, imagePath.substring(imagePath.lastIndexOf(".") + 1), byteArrayOut);
+                        int startIndex = settlementList.size() +6;
                         //anchor主要用于设置图片的属性
-                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255, (short) 2, settlementList.size() + 6 +(j*40), (short) 10, 90*(j+1));
+                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 255, 255, (short) 2, startIndex+(5*j)+50*j, (short) 10, startIndex+(5*j)+50*(j+1));
                         //HSSFClientAnchor anchor2 = new HSSFClientAnchor(0, 0, 255, 255, (short) 5, settlementList.size() + 40, (short) 10, 40 * 2);
                         anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
                         //插入图片
@@ -214,7 +226,7 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
             }
 
             if(accountIdList.size() == num){
-                return Result.errorMsg("暂无数据。");
+                return Result.errorMsg("暂无账户流水数据。");
             }
 
             response.setCharacterEncoding("UTF-8");
@@ -222,7 +234,7 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
             response.setHeader("Pragma", "no-cache");
             response.setHeader("Cache-Control", "no-cache");
             response.setDateHeader("Expires", 0);
-            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getUploadYears()+"头条结算单.xlsx", "UTF-8"));
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getUploadYears()+"-头条结算单.xlsx", "UTF-8"));
             OutputStream output = response.getOutputStream();
             BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
             wb.write(bufferedOutPut);
@@ -378,7 +390,7 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
                 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
 
                 //查询 图片 url
-                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId);
+                List<String> imageUrlList = reportSettlementMapper.getAccountImagesBytedance(accountId,paramsVo.getUploadYears());
 
                 if (!Check.isNull(imageUrlList)){
                     for (int j = 0; j < imageUrlList.size(); j++) {
@@ -409,7 +421,7 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
             response.setHeader("Pragma", "no-cache");
             response.setHeader("Cache-Control", "no-cache");
             response.setDateHeader("Expires", 0);
-            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getUploadYears()+"快手结算单.xlsx", "UTF-8"));
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(paramsVo.getUploadYears()+"-快手结算单.xlsx", "UTF-8"));
             OutputStream output = response.getOutputStream();
             BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
             wb.write(bufferedOutPut);
@@ -426,7 +438,8 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
 
 
 
-
+    @Resource
+    private SettlementInfoMapper settlementInfoMapper;
     /**
      *
      * @description: 财务结算 利润表导出 头条
@@ -439,47 +452,108 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
     public Result porfitReportBytedance(SettlementFileParamsVo paramsVo, HttpServletResponse response) {
 
         try {
-            //查询 头条利润表 总花费
-            List<Map<String,Object>> list = reportSettlementMapper.getProfitBytedanceCost(paramsVo.getUploadYears());
+            //查询 头条利润表 时间段内 所有 账户
+            List<Map<String,Object>> list = reportSettlementMapper.getProfitBytedanceAccountCost(null,paramsVo.getStartTime(),paramsVo.getEndTime());
             if (Check.isNull(list)){
                 return Result.errorMsg("暂无数据。");
             }
             List<ProfitReportBytedanceVo> resultList = new ArrayList<>(list.size());
             for (Map<String, Object> map : list) {
-                ProfitReportBytedanceVo vo = new ProfitReportBytedanceVo();
-                vo.setCost(map.getOrDefault("cost","")+"");//总消耗
-                vo.setCashCost(map.getOrDefault("cashCost","")+"");//现金消耗
-                vo.setRewardCost(map.getOrDefault("rewardCost","")+"");//赠款消耗
-                vo.setProductName(map.getOrDefault("productName","")+"");//产品名称
-                //查询 头条利润表  销售人员姓名 以及 返点类型和比列
-                Map<String,Object> slaeMap = reportSettlementMapper.getProfitBytedanceSale(map.get("productId")+"");
-                if (!Check.isNull(slaeMap)){
-                    vo.setSaleName(slaeMap.getOrDefault("saleName","")+"");//销售
-                    // 当前查询时间 与 销售政策 开始 截至时间 是否匹配
-                    if (SettlementUtil.isEffectiveDate(paramsVo.getUploadYears(),slaeMap.get("policyStart")+"",slaeMap.get("policyEnd")+"")){
-                        //销售政策状态 为 通过 显示 返点类型 和 返点比列
-                        if (StringUtils.equals(slaeMap.getOrDefault("approvedStatus","")+"","3")){
-                            vo.setRebateType(slaeMap.getOrDefault("rebateType","")+"");//返点类型
-                            vo.setRebateRate(slaeMap.getOrDefault("rebateRate","")+"");//返点比列
-                        }
-                    }
+                //查看该账户 状态信息
+                QueryWrapper<CtopCwjsSettlementInfo> settlementAccountQw = new QueryWrapper<>();
+                settlementAccountQw.eq("account_id",map.get("accountId"));
+                //账户状态 0-开 1-关
+                settlementAccountQw.eq("status",0);
+                //(0,正常,1已删除)
+                settlementAccountQw.eq("del_flag",0);
+                List<CtopCwjsSettlementInfo> settlementAccountList =  settlementInfoMapper.selectList(settlementAccountQw);
+                if (Check.isNull(settlementAccountList)){
+                    continue;
                 }
 
+                ProfitReportBytedanceVo voSource = new ProfitReportBytedanceVo();
+                //查询销售
+                Map<String,Object> slaeMap = reportSettlementMapper.getProfitBytedanceSale(map.get("accountId")+"");
+                voSource.setSaleName(Check.isNull(slaeMap) ? "" : slaeMap.getOrDefault("saleName","")+"");//销售
+
+                //产品名称
+                voSource.setProductName(map.getOrDefault("productName","")+"");
+
                 Map<String,Object> operateMap = reportSettlementMapper.getProfitBytedanceOperate(map.get("accountId")+"");
                 if (!Check.isNull(operateMap)){
-                    vo.setAdvertiserName(operateMap.getOrDefault("advertiserName","")+"");//广告主名称
-                    vo.setOperateName(operateMap.getOrDefault("operateName","")+"");//运营
-                    vo.setOperateArea(operateMap.getOrDefault("operateArea","")+"");//运营所属区域
+                    voSource.setAdvertiserName(operateMap.getOrDefault("advertiserName","")+"");//广告主名称
+                    voSource.setOperateName(operateMap.getOrDefault("operateName","")+"");//运营
+                    voSource.setOperateArea(operateMap.getOrDefault("operateArea","")+"");//运营所属区域
                 }
-                resultList.add(vo);
-            }
 
-            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("头条利润单", "头条利润单"), ProfitReportBytedanceVo.class, resultList);
+                //查询 头条利润表  返点类型和比列
+                List<Map<String,Object>> rateMap = reportSettlementMapper.getProfitBytedance(map.get("productName")+"","1",paramsVo.getStartTime(),paramsVo.getEndTime());
+                List listPolicyTIme = new ArrayList();
+                for (Map<String, Object> rate : rateMap) {
+                    listPolicyTIme.add(rate.get("policyStartDate"));
+                    listPolicyTIme.add(rate.get("policyEndDate"));
+                }
+                //政策时间 去重 排序
+                List<Object> times = SettlementUtil.sortlistTest(listPolicyTIme);
+                // 使用政策的时间段 拼接 开始 和 截至 时间
+                List<Map<String, String>> arrayList = new ArrayList<>();
+                for ( int i = 0; i < times.size(); i++) {
+                    HashMap<String, String> mapTime = new HashMap<>();
+                    mapTime.put("startDate", times.get(i).toString());
+                    mapTime.put("endDate",  times.get(i+1).toString());
+                    i += 1;
+                    arrayList.add(mapTime);
+                }
+
+                //政策所有时间点
+                List<String> policyDaysList = new ArrayList<>();
+                for (Map<String, String> stringMap : arrayList) {
+                    ProfitReportBytedanceVo vo = new ProfitReportBytedanceVo();
+                    //使用政策 返点类型和比例
+                    Map<String,Object>  policyRateMap = reportSettlementMapper.getProfitRebate(map.get("productName")+"",stringMap.get("startDate"),stringMap.get("endDate"));
+                    vo.setRebateType(policyRateMap.getOrDefault("rebateType","")+"");//返点类型
+                    vo.setRebateRate(policyRateMap.getOrDefault("rebateRate","")+"");//返点比列
+                    // 时间段内 账户流水 信息
+                    List<Map<String,Object>> listAccount = reportSettlementMapper.getProfitBytedanceCost(map.get("accountId")+"",stringMap.get("startDate"),stringMap.get("endDate"));
+                    listAccount.removeAll(Collections.singleton(null));
+                    vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost","")+"");//总消耗
+                    vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost","")+"");//现金消耗
+                    vo.setRewardCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("rewardCost","")+"");//赠款消耗
+                    BeanUtils.copyProperties(voSource,vo,SettlementUtil.getNullPropertyNames(voSource));
+                    resultList.add(vo);
+                    policyDaysList.addAll(SettlementUtil.getAllDatesOfTwoTimes(stringMap.get("startDate"),stringMap.get("endDate")));
+                }
 
+                //不使用政策 的时间段
+                // 获取两个日期之间 所有的 时间 年-月-日
+                List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(paramsVo.getStartTime(),paramsVo.getEndTime());
+                // 时间差集(所有时间段 - 使用政策的时间段)
+                List<String>  reduceList = betweenDaysList.stream().filter(item -> !policyDaysList.contains(item)).collect(Collectors.toList());
+                //差集拼接  开始 和 结束时间
+                List<Map<String, String>> stringList = SettlementUtil.getTime(reduceList);
+                for (Map<String, String> stringMap : stringList) {
+                    ProfitReportBytedanceVo vo = new ProfitReportBytedanceVo();
+                    // 不使用 政策 则 返点为空
+                    //政策 返点类型和比例
+                   /* Map<String,Object>  policyRateMap = reportSettlementMapper.getProfitRebate(map.get("productName")+"",stringMap.get("startDate"),stringMap.get("endDate"));
+                  */
+                    vo.setRebateType("");//返点类型
+                    vo.setRebateRate("");//返点比列
+                    //账户流水 信息
+                    List<Map<String,Object>> listAccount = reportSettlementMapper.getProfitBytedanceCost(map.get("accountId")+"",stringMap.get("startDate"),stringMap.get("endDate"));
+                    listAccount.removeAll(Collections.singleton(null));
+                    vo.setCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cost","")+"");//总消耗
+                    vo.setCashCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("cashCost","")+"");//现金消耗
+                    vo.setRewardCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("rewardCost","")+"");//赠款消耗
+                    BeanUtils.copyProperties(voSource,vo,SettlementUtil.getNullPropertyNames(voSource));
+                    resultList.add(vo);
+                }
+            }
+            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("头条利润单", "头条利润单"), ProfitReportBytedanceVo.class, resultList);
             try {
                 response.setCharacterEncoding("UTF-8");
                 response.setHeader("content-Type", "application/vnd.ms-excel");
-                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("头条利润单.xls", "UTF-8"));
+                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("头条利润单.xlsx", "UTF-8"));
                 workbook.write(response.getOutputStream());
             } catch (IOException e) {
                 throw new RuntimeException(e);
@@ -519,19 +593,24 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
                 vo.setCost(map.getOrDefault("cost","")+"");//总消耗
                 vo.setCashCost(map.getOrDefault("cashCost","")+"");//现金消耗
                 vo.setProductName(map.getOrDefault("productName","")+"");//产品名称
+
+                //查询销售
+                Map<String,Object> slaeMap = reportSettlementMapper.getProfitBytedanceSale(map.get("accountId")+"");
+                vo.setSaleName(Check.isNull(slaeMap) ? "" : slaeMap.getOrDefault("saleName","")+"");//销售
+
                 //查询  销售人员姓名 以及 返点类型和比列
-                Map<String,Object> slaeMap = reportSettlementMapper.getProfitBytedanceSale(map.get("productId")+"");
-                if (!Check.isNull(slaeMap)){
-                    vo.setSaleName(slaeMap.getOrDefault("saleName","")+"");//销售
+                List<Map<String,Object>> rateMap = reportSettlementMapper.getProfitBytedance(map.get("productId")+"","2",paramsVo.getStartTime(),paramsVo.getEndTime());
+               /* if (!Check.isNull(slaeMap)){
+
                     // 当前查询时间 与 销售政策 开始 截至时间 是否匹配
-                    if (SettlementUtil.isEffectiveDate(paramsVo.getUploadYears(),slaeMap.get("policyStart")+"",slaeMap.get("policyEnd")+"")){
+                    if (SettlementUtil.isEffectiveDate(paramsVo.getUploadYears(),rateMap.get("policyStart")+"",rateMap.get("policyEnd")+"")){
                         //销售政策状态 为 通过 显示 返点类型 和 返点比列
-                        if (StringUtils.equals(slaeMap.getOrDefault("approvedStatus","")+"","3")){
-                            vo.setRebateType(slaeMap.getOrDefault("rebateType","")+"");//返点类型
-                            vo.setRebateRate(slaeMap.getOrDefault("rebateRate","")+"");//返点比列
+                        if (StringUtils.equals(rateMap.getOrDefault("approvedStatus","")+"","3")){
+                            vo.setRebateType(rateMap.getOrDefault("rebateType","")+"");//返点类型
+                            vo.setRebateRate(rateMap.getOrDefault("rebateRate","")+"");//返点比列
                         }
                     }
-                }
+                }*/
 
                 Map<String,Object> operateMap = reportSettlementMapper.getProfitKuaiShouOperate(map.get("accountId")+"");
                 if (!Check.isNull(operateMap)){
@@ -603,11 +682,94 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
     }
 
 
+
+    @Resource
+    private CwjsPolicyProductMapper cwjsPolicyProductMapper;
+
+
+    @Override
+    public void cwjsPRofit(CwjsPolicyInfo cwjsPolicyInfo) {
+
+        // 获取两个日期之间 所有的 时间 年-月-日
+        List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(cwjsPolicyInfo.getPolicyStartDate(),cwjsPolicyInfo.getPolicyEndDate());
+        //查看 政策下的产品
+        List<CwjsPolicyProduct> productList = cwjsPolicyProductMapper.queryProductsByPolicyId(cwjsPolicyInfo.getId());
+        if (!Check.isNull(productList)){
+            if (!Check.isNull(betweenDaysList)){
+                List<CtopCwjsSlettementReport> reportList = new ArrayList<>();
+                for (CwjsPolicyProduct product : productList) {
+                    for (String day : betweenDaysList) {
+                        CtopCwjsSlettementReport report = new CtopCwjsSlettementReport();
+                        report.setPolicyId(cwjsPolicyInfo.getId());
+                        report.setAdvertiserName(cwjsPolicyInfo.getAdvertiserName());
+                        report.setProductName(product.getPolicyProductName());
+                        report.setMediaType(cwjsPolicyInfo.getMediaType());
+                        report.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
+                        report.setPolicyDate(day);
+                        reportList.add(report);
+                    }
+                }
+                cwjsProfitMapper.replaceCwjsSlettementProfit(reportList);
+            }
+        }
+
+
+
+
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
     public static void main(String[] args) {
-        String a =  "woshiwoshi{1}woshi{2}111{3}===";
+       /* String a =  "woshiwoshi{1}woshi{2}111{3}===";
         String b = MessageFormat.format(a,"测试","我","你","结束");
         System.out.println(a);
-        System.out.println(b);
+        System.out.println(b);*/
+
+
+        List list = new ArrayList();
+
+        list.add("2021-07-01");
+       // list.add("2021-07-02");
+        list.add("2021-07-10");
+        list.add("2021-07-05");
+        list.add("2021-07-15");
+
+
+
+
+        // 获取两个日期之间 所有的 时间 年-月-日
+        List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes("2021-07-01","2021-07-20");
+
+        List<Object> times = SettlementUtil.sortlistTest(list);
+
+        //差集
+        List<String>  reduceList = betweenDaysList.stream().filter(item -> !times.contains(item)).collect(Collectors.toList());
+
+
+        System.out.println(betweenDaysList);
+        System.out.println(times);
+        System.out.println(reduceList);
+
+       List<Map<String,String>> stringList = SettlementUtil.getTime(reduceList);
+
+        System.out.println(stringList);
+
+
+
+
+
+
     }
 
 }

+ 6 - 21
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/SettlementFileInfoServiceImpl.java

@@ -1,45 +1,30 @@
 package org.jeecg.ctop.finance.settlement.service.serviceImpl;
 
-import cn.afterturn.easypoi.excel.ExcelImportUtil;
-import cn.afterturn.easypoi.excel.entity.ImportParams;
-import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
-import cn.hutool.core.bean.copier.CopyOptions;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
-import org.antlr.v4.runtime.misc.Array2DHashSet;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.ctop.finance.policy.utils.Check;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementFileInfo;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
-import org.jeecg.ctop.finance.settlement.entity.vo.AccountImportVo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementFileInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementFileParamsVo;
 import org.jeecg.ctop.finance.settlement.mapper.SettlementFileInfoMapper;
 import org.jeecg.ctop.finance.settlement.mapper.SettlementInfoMapper;
 import org.jeecg.ctop.finance.settlement.service.ISettlementFileInfoService;
-import org.jeecg.ctop.finance.settlement.service.ISettlementInfoService;
 import org.jeecg.ctop.finance.utils.SettlementUtil;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mapping.AccessOptions;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 @Slf4j
 @Service
-public class SettlementFileInfoServiceImpl extends ServiceImpl<SettlementFileInfoMapper, ctopCwjsSettlementFileInfo> implements ISettlementFileInfoService {
+public class SettlementFileInfoServiceImpl extends ServiceImpl<SettlementFileInfoMapper, CtopCwjsSettlementFileInfo> implements ISettlementFileInfoService {
 
     @Resource
     private SettlementFileInfoMapper settlementFileInfoMapper;
@@ -130,7 +115,7 @@ public class SettlementFileInfoServiceImpl extends ServiceImpl<SettlementFileInf
         List<Map<String,String>> list = settlementFileInfoMapper.getSettlementSheetList(paramsVo);
         for (Map<String, String> map : list) {
             //图片数量
-            QueryWrapper<ctopCwjsSettlementFileInfo> settlementFileInfoQw = new QueryWrapper<>();
+            QueryWrapper<CtopCwjsSettlementFileInfo> settlementFileInfoQw = new QueryWrapper<>();
             //广告主id
             settlementFileInfoQw.eq("advertiser_id",map.get("advertiserId"));
             //产品id
@@ -143,7 +128,7 @@ public class SettlementFileInfoServiceImpl extends ServiceImpl<SettlementFileInf
             settlementFileInfoQw.eq("create_user_id",map.get("operateUserId"));
             //(0,正常,1已删除)
             settlementFileInfoQw.eq("del_flag",0);
-            List<ctopCwjsSettlementFileInfo> settlementFileList =  settlementFileInfoMapper.selectList(settlementFileInfoQw);
+            List<CtopCwjsSettlementFileInfo> settlementFileList =  settlementFileInfoMapper.selectList(settlementFileInfoQw);
             map.put("imgNum",Check.isNull(settlementFileList) ? "0" : String.valueOf(settlementFileList.size()));
 
         }
@@ -177,9 +162,9 @@ public class SettlementFileInfoServiceImpl extends ServiceImpl<SettlementFileInf
      */
     @Override
     @Transactional
-    public Result insertAccountImages(ctopCwjsSettlementFileInfo settlementFileInfo) {
+    public Result insertAccountImages(CtopCwjsSettlementFileInfo settlementFileInfo) {
 
-        for (ctopCwjsSettlementFileInfo settlement : settlementFileInfo.getSettlementList()) {
+        for (CtopCwjsSettlementFileInfo settlement : settlementFileInfo.getSettlementList()) {
 
             settlement.setAccountId(SettlementUtil.subAccountName(settlement.getFileName()));
 

+ 10 - 14
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/SettlementInfoServiceImpl.java

@@ -8,20 +8,16 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.ctop.finance.settlement.entity.pojo.ctopCwjsSettlementInfo;
+import org.jeecg.ctop.finance.settlement.entity.pojo.CtopCwjsSettlementInfo;
 import org.jeecg.ctop.finance.settlement.entity.vo.AccountImportVo;
 import org.jeecg.ctop.finance.settlement.mapper.SettlementInfoMapper;
 import org.jeecg.ctop.finance.settlement.service.ISettlementInfoService;
-import org.jeecg.ctop.finance.utils.SettlementUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -29,7 +25,7 @@ import java.util.Set;
 
 @Slf4j
 @Service
-public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper, ctopCwjsSettlementInfo> implements ISettlementInfoService {
+public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper, CtopCwjsSettlementInfo> implements ISettlementInfoService {
 
     @Resource
     private SettlementInfoMapper settlementInfoMapper;
@@ -46,10 +42,10 @@ public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper,
      * @author: zianY
      */
     @Override
-    public Result getSettlementList(ctopCwjsSettlementInfo settlementInfo, Integer pageNo, Integer pageSize) {
+    public Result getSettlementList(CtopCwjsSettlementInfo settlementInfo, Integer pageNo, Integer pageSize) {
         PageHelper.startPage(pageNo, pageSize);
-        List<ctopCwjsSettlementInfo> list = settlementInfoMapper.getSettlementList(settlementInfo);
-        PageInfo<ctopCwjsSettlementInfo> pageInfo = new PageInfo<>(list);
+        List<CtopCwjsSettlementInfo> list = settlementInfoMapper.getSettlementList(settlementInfo);
+        PageInfo<CtopCwjsSettlementInfo> pageInfo = new PageInfo<>(list);
         return Result.successMsg("财务结算-账户列表查询成功。", pageInfo);
     }
 
@@ -63,7 +59,7 @@ public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper,
     @Override
     public Result updSettlementStatusById(Long id, Integer status) {
         settlementInfoMapper.updSettlementStatusById(id,status);
-        return Result.successMsg("财务结算-修改账户状态成功。.", null);
+        return Result.successMsg("财务结算-修改账户状态成功。", null);
     }
 
     /**
@@ -92,11 +88,11 @@ public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper,
      * @time: 2021/7/30 16:26
      */
     @Override
-    public Result settlementAccountImport(ctopCwjsSettlementInfo settlementInfo, MultipartFile file) {
+    public Result settlementAccountImport(CtopCwjsSettlementInfo settlementInfo, MultipartFile file) {
 
             try {
-                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-                settlementInfo.setCreateUserId(user.getId());
+                //LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+                //settlementInfo.setCreateUserId(user.getId());
                 //settlementInfo.setCreateUserId("b161b7d9793942f980dbfe8c931cd1b0");
                 ImportParams importParams = new ImportParams();
                 //表格标题行数
@@ -126,7 +122,7 @@ public class SettlementInfoServiceImpl extends ServiceImpl<SettlementInfoMapper,
                 e.printStackTrace();
                 return Result.error("账户数据上传失败,请使用正确的模板导入!");
             }
-            return Result.successMsg("账户数据上传成功",null);
+            return Result.successMsg("账户数据上传成功",null);
         }
 
 

+ 205 - 20
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/utils/SettlementUtil.java

@@ -8,11 +8,14 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * zian Y
@@ -24,7 +27,7 @@ public class SettlementUtil {
     public static String getFileNameNoEx(String filename) {
         if ((filename != null) && (filename.length() > 0)) {
             int dot = filename.lastIndexOf('.');
-            if ((dot >-1) && (dot < (filename.length()))) {
+            if ((dot > -1) && (dot < (filename.length()))) {
                 return filename.substring(0, dot);
             }
         }
@@ -34,12 +37,13 @@ public class SettlementUtil {
     /**
      * 格式:123456-1
      * 截取 账户 id
+     *
      * @param str
      * @return
      */
-    public static String subAccountName(String str){
-        if (!Check.isNull(str)){
-            if (str.contains("-")){
+    public static String subAccountName(String str) {
+        if (!Check.isNull(str)) {
+            if (str.contains("-")) {
                 return str.substring(0, str.indexOf("-"));
             }
         }
@@ -51,11 +55,11 @@ public class SettlementUtil {
     /**
      * @Description: 忽略null值/只拷贝非null属性
      */
-    public static String[] getNullPropertyNames (Object source) {
+    public static String[] getNullPropertyNames(Object source) {
         final BeanWrapper src = new BeanWrapperImpl(source);
         java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
         Set<String> emptyNames = new HashSet<String>();
-        for(java.beans.PropertyDescriptor pd : pds) {
+        for (java.beans.PropertyDescriptor pd : pds) {
             Object srcValue = src.getPropertyValue(pd.getName());
             if (srcValue == null) emptyNames.add(pd.getName());
         }
@@ -64,9 +68,9 @@ public class SettlementUtil {
     }
 
 
-
     /**
      * 获取网络图片转成字节流
+     *
      * @param strUrl 完整图片地址
      * @return 图片资源数组
      */
@@ -90,13 +94,14 @@ public class SettlementUtil {
 
     /**
      * 从输入流中获取字节流数据
+     *
      * @param inStream 输入流
-     * @return  图片流
+     * @return 图片流
      */
     private static byte[] readInputStream(InputStream inStream) throws Exception {
         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
         // 设置每次读取缓存区大小
-        byte[] buffer = new byte[1024*10];
+        byte[] buffer = new byte[1024 * 10];
         int len = 0;
         while ((len = inStream.read(buffer)) != -1) {
             outStream.write(buffer, 0, len);
@@ -107,10 +112,11 @@ public class SettlementUtil {
 
     /**
      * 获取日期的年月
+     *
      * @param strDate
      * @return
      */
-    public static int getYearMonth(String strDate)throws Exception{
+    public static int getYearMonth(String strDate) throws Exception {
 
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
         Date date = simpleDateFormat.parse(strDate);
@@ -118,23 +124,23 @@ public class SettlementUtil {
         Calendar cal = Calendar.getInstance();
         cal.setTime(date);//设置时间
         int year = cal.get(Calendar.YEAR);//获取年份
-        int month=cal.get(Calendar.MONTH);//获取月份
-        return year*100+month;//返回年份乘以100加上月份的值,因为月份最多2位数,所以年份乘以100可以获取一个唯一的年月数值
+        int month = cal.get(Calendar.MONTH);//获取月份
+        return year * 100 + month;//返回年份乘以100加上月份的值,因为月份最多2位数,所以年份乘以100可以获取一个唯一的年月数值
     }
 
 
-
     /**
      * 判断当前时间是否在[startTime, endTime]区间
      * 年-月   2021-08
-     * @param nowStrTime 当前时间
+     *
+     * @param nowStrTime   当前时间
      * @param startStrTime 开始时间
-     * @param endStrTime 结束时间
+     * @param endStrTime   结束时间
      * @return
      * @author zian Y
      */
     public static boolean isEffectiveDate(String nowStrTime, String startStrTime, String endStrTime) throws Exception {
-       // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
         Date nowTime = simpleDateFormat.parse(nowStrTime);
         Date startTime = simpleDateFormat.parse(startStrTime);
@@ -158,7 +164,186 @@ public class SettlementUtil {
     }
 
 
+    public static long DateCompare(String s1, String s2) {
+        try {
+
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            Date d1 = simpleDateFormat.parse(s1);
+            Date d2 = simpleDateFormat.parse(s2);
+            // LocalDateTime d1 = LocalDateTime.parse(s1, DateTimeFormatter.ISO_LOCAL_DATE);
+            //LocalDateTime d2 = LocalDateTime.parse(s2, DateTimeFormatter.ISO_LOCAL_DATE);
+            //排序规则
+            return ((d1.getTime()) - (d2.getTime()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    public static List<String> sortlistTest(List<String> list) {
+        //去重
+        List<String> newlist = new ArrayList<String>();
+        for (int i = 0; i < list.size(); i++) {
+            if (!newlist.contains(list.get(i))) {
+                newlist.add(list.get(i));
+            }
+        }
+        String tmp;
+        for (int i = 1; i < newlist.size(); i++) {
+            tmp = newlist.get(i);
+            int j = i - 1;
+            for (; j >= 0 && (DateCompare(tmp, newlist.get(j)) < 0); j--) {
+                newlist.set(j + 1, newlist.get(j));
+            }
+            newlist.set(j + 1, tmp);
+        }
+        return newlist;
+    }
+
+
+    /**
+     * 获取 两个日期之间的所有 日期
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static List<String> getAllDatesOfTwoTimes(String startDate, String endDate) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<String> dateList = new ArrayList<String>();
+        try {
+            Date dateOne = sdf.parse(startDate);
+            Date dateTwo = sdf.parse(endDate);
+
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(dateOne);
+
+            dateList.add(startDate);
+            while (calendar.getTime().before(dateTwo)) { //倒序时间,顺序after改before其他相应的改动。
+                calendar.add(Calendar.DAY_OF_MONTH, 1);
+                dateList.add(sdf.format(calendar.getTime()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateList;
+    }
+
+
+    public static List<Map<String, String>> getTime( List<String> list) {
+        //初始化list,且该list中的日期是升序的。
+        //List<String> list = Arrays.asList("2020-11-19","2020-11-20","2020-11-21","2021-07-20");
+       /* List<String> list = Arrays.asList("2021-07-02", "2021-07-03", "2021-07-04", "2021-07-06",
+                "2021-07-07", "2021-07-08", "2021-07-09", "2021-07-11", "2021-07-12",
+                "2021-07-13", "2021-07-14", "2021-07-16", "2021-07-17", "2021-07-18",
+                "2021-07-19", "2021-07-20", "2021-07-21", "2021-07-22", "2021-07-23",
+                "2021-07-24", "2021-07-25", "2021-07-26", "2021-07-27", "2021-07-28",
+                "2021-07-29", "2021-07-30");
+        */
+        List<Map<String, String>> arrayList = new ArrayList<>();
+        int num = 0;
+        for (int i = 0; i < list.size(); i = num) {
+            String start = list.get(i);
+            String end = "";
+            if (i == list.size() - 1) {
+                end = start;
+            }
+            int n = 0;
+            for (int j = i + 1; j < list.size(); j++) {
+                //判断当前日期的后一天与list中该元素的下一个元素是否相等
+                if (getSpecifiedDayAfter(list.get(j - 1)).equals(list.get(j))) {
+                    end = list.get(j);
+                    n++;
+                    num++;
+                    continue;
+                } else {
+                    //list中该元素不是连续的
+                    if (n == 0) {
+                        end = list.get(j - 1);
+                    }
+                    break;
+                }
+            }
+            num = num + 1;
+            HashMap<String, String> map = new HashMap<>();
+            map.put("startDate", start);
+            map.put("endDate", end);
+            arrayList.add(map);
+        }
+
+       // System.out.println(arrayList);
+        return arrayList;
+
 
+}
+
+    /**
+     * 获取当前日期的后一天
+     * @param specifiedDay
+     * @return
+     */
+    public static String getSpecifiedDayAfter(String specifiedDay) {
+        Calendar c = Calendar.getInstance();
+        Date date = null;
+        try {
+            date = new SimpleDateFormat("yyyy-MM-dd").parse(specifiedDay);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day + 1);
+        String dayAfter = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+        return dayAfter;
+    }
+
+    public static void main(String[] args) {
+
+
+
+            List list = new ArrayList();
+
+
+            Map map1 = new HashMap();
+            map1.put("startTime","2021-07-01");
+            map1.put("endTime","2021-07-05");
+
+            Map map2 = new HashMap();
+            map2.put("startTime","2021-07-10");
+            map2.put("endTime","2021-07-15");
+
+
+            list.add("2021-07-01");
+            list.add("2021-07-02");
+            //list.add("2021-07-03");
+            list.add("2021-07-04");
+            list.add("2021-07-05");
+
+
+
+
+            // 获取两个日期之间 所有的 时间 年-月-日
+            List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes("2021-07-01","2021-07-10");
+
+            List<Object> times = SettlementUtil.sortlistTest(list);
+
+            //差集
+            List<String>  reduceList = betweenDaysList.stream().filter(item -> !times.contains(item)).collect(Collectors.toList());
+
+
+            System.out.println(betweenDaysList);
+            System.out.println(times);
+            System.out.println(reduceList);
+
+            List<Map<String, String>> stringList = SettlementUtil.getTime(reduceList);
+
+            System.out.println(stringList);
+
+
+
+
+
+    }