yangzian 3 лет назад
Родитель
Сommit
2458a26f54

+ 131 - 19
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/service/impl/CreateSheetServiceImpl.java

@@ -12,14 +12,20 @@ import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyInfoMapper;
 import org.jeecg.ctop.finance.policy.service.ICreateSheetService;
 import org.jeecg.ctop.finance.policy.service.ICwjsPolicyInfoService;
 import org.jeecg.ctop.finance.policy.utils.Check;
+import org.jeecg.ctop.finance.settlement.entity.vo.ProfitReportBytedanceVo;
 import org.jeecg.ctop.finance.settlement.entity.vo.SettlementReportBytedanceVo;
+import org.jeecg.ctop.finance.settlement.entity.vo.SheetBytedanceVo;
 import org.jeecg.ctop.finance.settlement.mapper.ReportSettlementMapper;
+import org.jeecg.ctop.finance.utils.SettlementUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *
@@ -35,11 +41,9 @@ public class CreateSheetServiceImpl implements ICreateSheetService {
 
 
     public void createBytedance(HSSFWorkbook wb, HSSFCellStyle style, List<String> accountIdList,String uploadYears){
-
         DecimalFormat sf  = new DecimalFormat("#.####");//保留四位小数
         //2:创建sheet 设置sheet名称
         HSSFSheet sheet = wb.createSheet("汇总页");
-
         //3:添加 第一行单元格
         HSSFRow row0 = sheet.createRow(0);
         HSSFCell cell0 = row0.createCell(0);
@@ -48,15 +52,12 @@ public class CreateSheetServiceImpl implements ICreateSheetService {
         CellRangeAddress region = new CellRangeAddress(0, 0, 0, 10);
         sheet.addMergedRegion(region);//合并行
         cell0.setCellStyle(style);
-
         //4:添加表头2行
         HSSFRow row = sheet.createRow(1);
-
         //5:创建第2行的单元格
         HSSFCell cell = row.createCell(0);     //第一个单元格
         cell.setCellValue("日期");         //设定值
         cell.setCellStyle(style);          //内容居中
-
         cell = row.createCell(1);
         cell.setCellValue("账户名称");
         cell.setCellStyle(style);
@@ -104,29 +105,140 @@ public class CreateSheetServiceImpl implements ICreateSheetService {
         cell = row.createCell(12);
         cell.setCellValue("冻结(¥)");
         cell.setCellStyle(style);
+
+        cell = row.createCell(13);
+        cell.setCellValue("返点类型");
+        cell.setCellStyle(style);
+
+        cell = row.createCell(14);
+        cell.setCellValue("返点比例");
+        cell.setCellStyle(style);
+
+        cell = row.createCell(15);
+        cell.setCellValue("政策时间");
+        cell.setCellStyle(style);
         sheet.autoSizeColumn(0, true);
+        List<SheetBytedanceVo> resultList = new ArrayList<>(accountIdList.size());
+        //查看账户数据
         List<Map<String,Object>> list = reportSettlementMapper.getAccountTransactionDayBytedanceSheet(accountIdList,uploadYears);
+        for (Map<String,Object> map : list) {
+            SheetBytedanceVo voSource = new SheetBytedanceVo();
+            voSource.setAgentId(map.get("agentId")+"");
+            voSource.setAgentName(map.get("agentName")+"");
+            voSource.setAccountId(map.get("accountId")+"");
+            voSource.setAccountName(map.get("accountName")+"");
+
+            //政策所有时间点
+            List<String> policyDaysList = new ArrayList<>();
+            if (!Check.isNull(map.get("productName"))){
+                //查询 头条利润表  返点类型和比列
+                List<Map<String,Object>> rateMap = reportSettlementMapper.getProfitBytedance(map.get("advertiserName")+"",map.get("productName")+"",null,"1",uploadYears+"-01",uploadYears+"-31");
+                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.size() < 2 ? times.get(i).toString() : times.get(i + 1).toString());
+                    i += 1;
+                    arrayList.add(mapTime);
+                }
+                for (Map<String, String> stringMap : arrayList) {
+                    SheetBytedanceVo vo = new SheetBytedanceVo();
+                    //使用政策 返点类型和比例
+                    Map<String,Object>  policyRateMap = reportSettlementMapper.getProfitRebate(map.get("advertiserName")+"",map.get("productName")+"",null,"1",stringMap.get("startDate"),stringMap.get("endDate"));
+                    if (!Check.isNull(policyRateMap)){
+                        if(Integer.valueOf(policyRateMap.get("rebateType").toString())== 0){
+                            vo.setRebateType("返现");//返点类型
+                        }else if (Integer.valueOf(policyRateMap.get("rebateType").toString())== 1){
+                            vo.setRebateType("返货");
+                        }else if (Integer.valueOf(policyRateMap.get("rebateType").toString())== 2){
+                            vo.setRebateType("返现+返货");
+                        }
+                        vo.setRebateRate(policyRateMap.getOrDefault("rebateRate","")+"%");//返点比列
+                    }else {
+                        vo.setRebateType("");
+                    }
+                    // 时间段内 账户流水 信息
+                    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","")+"");//赠款消耗
+                    vo.setBalance(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("balance","")+"");//日终结余
+                    vo.setFrozen(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("frozen","")+"");//冻结
+                    vo.setIncome(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("income","")+"");//总存入
+                    vo.setSharedWalletCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("sharedWalletCost","")+"");//共享钱包支出
+                    vo.setTransferIn(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("transferIn","")+"");//总转入
+                    vo.setTransferOut(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("transferOut","")+"");//总转出
+                    BeanUtils.copyProperties(voSource,vo,SettlementUtil.getNullPropertyNames(voSource));
+                    vo.setTime(stringMap.get("startDate")+"----"+stringMap.get("endDate"));
+                    resultList.add(vo);
+                    policyDaysList.addAll(SettlementUtil.getAllDatesOfTwoTimes(stringMap.get("startDate"),stringMap.get("endDate")));
+                }
+
+            }
+
+            //不使用政策 的时间段
+            // 获取两个日期之间 所有的 时间 年-月-日
+            List<String> betweenDaysList = SettlementUtil.getAllDatesOfTwoTimes(uploadYears+"-01",uploadYears+"-31");
+            // 时间差集(所有时间段 - 使用政策的时间段)
+            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) {
+                SheetBytedanceVo vo = new SheetBytedanceVo();
+                // 不使用 政策 则 返点为空
+                //政策 返点类型和比例
+                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","")+"");//赠款消耗
+                vo.setBalance(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("balance","")+"");//日终结余
+                vo.setFrozen(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("frozen","")+"");//冻结
+                vo.setIncome(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("income","")+"");//总存入
+                vo.setSharedWalletCost(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("sharedWalletCost","")+"");//共享钱包支出
+                vo.setTransferIn(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("transferIn","")+"");//总转入
+                vo.setTransferOut(Check.isNull(listAccount) ? "0" : listAccount.get(0).getOrDefault("transferOut","")+"");//总转出
+                BeanUtils.copyProperties(voSource,vo, SettlementUtil.getNullPropertyNames(voSource));
+                vo.setTime((!Check.isNull(vo.getRebateType()) ? stringMap.get("startDate")+"----"+stringMap.get("endDate") : ""));
+                resultList.add(vo);
+            }
+        }
 
-        for (int i = 0; i < list.size(); i++) {
-            Map<String,Object> vo = list.get(i);
+        for (int i = 0; i < resultList.size(); i++) {
+            SheetBytedanceVo vo = resultList.get(i);
             //创建行 (表头占0-1行 所以 从 2开始)
             row = sheet.createRow(i + 2);
             sheet.autoSizeColumn(0, true);
             sheet.autoSizeColumn(i + 1, true);
             //创建单元格并且添加数据
             row.createCell(0).setCellValue(uploadYears);
-            row.createCell(1).setCellValue(vo.get("accountName")+"");
-            row.createCell(2).setCellValue(vo.get("advertiser_id")+"");
-            row.createCell(3).setCellValue(vo.get("agentName")+"");
-            row.createCell(4).setCellValue(vo.get("agentId")+"");
-            row.createCell(5).setCellValue(sf.format(vo.get("cost")));
-            row.createCell(6).setCellValue(sf.format(vo.get("cash_cost")));
-            row.createCell(7).setCellValue(sf.format(vo.get("reward_cost")));
-            row.createCell(8).setCellValue(sf.format(vo.get("income")));
-            row.createCell(9).setCellValue(sf.format(vo.get("transfer_in")));
-            row.createCell(10).setCellValue(sf.format(vo.get("transfer_out")));
-            row.createCell(11).setCellValue(sf.format(vo.get("balance")));
-            row.createCell(12).setCellValue(sf.format(vo.get("frozen")));
+            row.createCell(1).setCellValue(vo.getAccountName());
+            row.createCell(2).setCellValue(vo.getAccountId());
+            row.createCell(3).setCellValue(vo.getAgentName());
+            row.createCell(4).setCellValue(vo.getAgentId());
+            row.createCell(5).setCellValue(sf.format(new BigDecimal(vo.getCost())));
+            row.createCell(6).setCellValue(sf.format(new BigDecimal(vo.getCashCost())));
+            row.createCell(7).setCellValue(sf.format(new BigDecimal(vo.getRewardCost())));
+            row.createCell(8).setCellValue(sf.format(new BigDecimal(vo.getIncome())));
+            row.createCell(9).setCellValue(sf.format(new BigDecimal(vo.getTransferIn())));
+            row.createCell(10).setCellValue(sf.format(new BigDecimal(vo.getTransferOut())));
+            row.createCell(11).setCellValue(sf.format(new BigDecimal(vo.getBalance())));
+            row.createCell(12).setCellValue(sf.format(new BigDecimal(vo.getFrozen())));
+            row.createCell(13).setCellValue(vo.getRebateType());
+            row.createCell(14).setCellValue(vo.getRebateRate());
+            row.createCell(15).setCellValue(vo.getTime());
            // row.setRowStyle(style);
         }
     }

+ 47 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/entity/vo/SheetBytedanceVo.java

@@ -0,0 +1,47 @@
+package org.jeecg.ctop.finance.settlement.entity.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @description: 头条 结算单 汇总页
+ * @return:
+ * @author: zianY
+ */
+@Data
+public class SheetBytedanceVo implements Serializable {
+
+    private String time;
+
+    private String productName;
+
+    private String accountId;
+    private String accountName;
+
+    private String agentId;
+    private String agentName;
+
+
+    private String rebateType;
+    private String rebateRate;
+
+    private String balance;
+    private String cashCost;
+    private String cost;
+    private String frozen;
+    private String income;
+    private String rewardCost;
+    private String sharedWalletCost;
+    private String transferIn;
+    private String transferOut;
+
+
+
+
+
+
+
+}

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

@@ -38,7 +38,7 @@
 <!-- 获取头条 账户 日流水信息 汇总页数据 -->
     <select id="getAccountTransactionDayBytedanceSheet" resultType="java.util.LinkedHashMap">
         SELECT
-            t.advertiser_id,
+            t.advertiser_id accountId,
         ua.auth_name accountName,
         ROUND( SUM( t.balance ), 3 ) balance,
             ROUND( SUM( t.cash_cost ), 3 ) cash_cost,
@@ -50,7 +50,14 @@
             ROUND( SUM( t.transfer_in ), 3 ) transfer_in,
             ROUND( SUM( t.transfer_out ), 3 ) transfer_out,
             ag.agent_id agentId,
-            ag.NAME agentName
+            ag.NAME agentName,
+        ua.project_id,
+        (SELECT ad.id from ctop_advertiser ad WHERE ad.id = ua.advertiser_id) advertiserId,
+        (SELECT ad.name from ctop_advertiser ad WHERE ad.id = ua.advertiser_id) advertiserName,
+        (SELECT pd.id from ctop_project pr, ctop_product pd WHERE ua.project_id = pr.id and pr.product_id = pd.id) productId,
+        (SELECT pd.product_name from ctop_project pr, ctop_product pd WHERE ua.project_id = pr.id and pr.product_id = pd.id) productName
+
+
         FROM
             ctop_account_transaction_day t
         LEFT JOIN (SELECT DISTINCT account_id,agent_id from ctop_agent_account where 1 = 1
@@ -341,9 +348,15 @@
     <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
+        ROUND( SUM( d.balance ), 3 ) balance,
+        ROUND( SUM( d.cash_cost ), 3 ) cashCost,
+        ROUND( SUM( d.cost ), 3 ) cost,
+        ROUND( SUM( d.frozen ), 3 ) frozen,
+        ROUND( SUM( d.income ), 3 ) income,
+        ROUND( SUM( d.reward_cost ), 3 ) rewardCost,
+        ROUND( SUM( d.shared_wallet_cost ), 3 ) sharedWalletCost,
+        ROUND( SUM( d.transfer_in ), 3 ) transferIn,
+        ROUND( SUM( d.transfer_out ), 3 ) transferOut
         FROM
         ctop_account_transaction_day d
         <where>
@@ -383,7 +396,9 @@
         </if>
             AND r.advertiser_name = #{advertiserName}
             AND r.product_name = #{productName}
+        <if test="saleId !=null and saleId != ''">
             AND r.create_user_id = #{saleId}
+        </if>
         <if test="startTime !=null and startTime != ''">
             AND  r.policy_date &gt;= #{startTime}
         </if>
@@ -411,7 +426,10 @@
         </if>
         AND r.advertiser_name = #{advertiserName}
         AND r.product_name = #{productName}
-        AND r.create_user_id = #{saleId}
+          <if test="saleId !=null and saleId != ''">
+              AND r.create_user_id = #{saleId}
+          </if>
+
         <if test="startTime !=null and startTime != ''">
             AND  r.policy_date &gt;= #{startTime}
         </if>