Przeglądaj źródła

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

lengfaqiang 2 lat temu
rodzic
commit
a418ccfcdf

+ 4 - 5
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/WorkbenchController.java

@@ -4,11 +4,10 @@ import com.sckw.core.web.response.HttpResult;
 import com.sckw.payment.model.vo.req.FinanceCount;
 import com.sckw.payment.service.WorkbenchService;
 import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * 工作台
@@ -29,8 +28,8 @@ public class WorkbenchController {
      *
      * @return
      */
-    @GetMapping("finance")
-    public HttpResult finance(FinanceCount financeCount) {
+    @PostMapping("finance")
+    public HttpResult finance(@Valid @RequestBody FinanceCount financeCount) {
         return HttpResult.ok(workbenchService.financeCount(financeCount));
     }
 

+ 3 - 1
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/dao/KwpSettlementRecordMapper.java

@@ -16,5 +16,7 @@ import java.util.List;
 public interface KwpSettlementRecordMapper extends BaseMapper<KwpSettlementRecord> {
     void insertBatch(@Param("list") List<KwpSettlementRecord> list);
 
-    List<SettlementRecord> countByDay(@Param("time") List<String> time, @Param("entId")Long entId);
+    List<SettlementRecord> countByDay(@Param("timeAll") List<String> timeAll, @Param("time") List<String> time, @Param("entId") Long entId);
+
+    List<SettlementRecord> countMonth(@Param("timeAll") List<String> timeAll, @Param("time") List<String> time, @Param("entId") Long entId);
 }

+ 27 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/dto/Factor.java

@@ -0,0 +1,27 @@
+package com.sckw.payment.model.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 统计因子
+ *
+ * @author xucaiqin
+ * @date 2023-09-20 09:03:38
+ */
+@Getter
+@Setter
+public class Factor {
+
+    /**
+     * 统计因子 1,2,3
+     */
+    @NotBlank(message = "统计因子1不能为空")
+    private String factorOne;
+    /**
+     * 统计因子 1,2,3
+     */
+    @NotBlank(message = "统计因子2不能为空")
+    private String factorTwo;
+}

+ 4 - 11
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/SettlementRecord.java

@@ -1,10 +1,8 @@
 package com.sckw.payment.model.vo;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.time.LocalDate;
 
 /**
  * 结算统计
@@ -14,10 +12,6 @@ import java.time.LocalDate;
  */
 @Data
 public class SettlementRecord {
-    /**
-     * 企业id
-     */
-    private Long entId;
 
     /**
      * 总应收金额
@@ -25,17 +19,17 @@ public class SettlementRecord {
     private BigDecimal totalReceiveMoney;
 
     /**
-     * 待收金额
+     * 待收金额(未回款金额)
      */
     private BigDecimal exactMoney;
 
     /**
-     * 已收金额(累加金额)
+     * 已收金额(回款金额)
      */
     private BigDecimal receivedMoney;
 
     /**
-     * 逾期待收金额
+     * 逾期待收金额(逾期未回款金额)
      */
     private BigDecimal overdueExactMoney;
 
@@ -62,6 +56,5 @@ public class SettlementRecord {
     /**
      * 创建日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate createTime;
+    private String createTime;
 }

+ 2 - 10
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/FinanceCount.java

@@ -1,12 +1,10 @@
 package com.sckw.payment.model.vo.req;
 
+import com.sckw.payment.model.dto.Factor;
 import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.List;
-
 /**
  * 财务统计
  *
@@ -15,7 +13,7 @@ import java.util.List;
  */
 @Getter
 @Setter
-public class FinanceCount {
+public class FinanceCount extends Factor {
     /**
      * 周期维度 1-日、2-周、3-月 4-年
      */
@@ -31,11 +29,5 @@ public class FinanceCount {
      */
 //    @NotBlank(message = "周期维度不能为空")
     private String endTime;
-    /**
-     * 统计因子
-     */
-    @Size(message = "统计因子不能为空", min = 1)
-    @NotNull(message = "统计因子不能为空")
-    private List<Integer> factor;
 
 }

+ 18 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/res/EChartsVo.java

@@ -0,0 +1,18 @@
+package com.sckw.payment.model.vo.res;
+
+import com.sckw.payment.model.dto.Factor;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2023-09-20 08:44:40
+ */
+@Getter
+@Setter
+public class EChartsVo extends Factor {
+    /**
+     * 创建日期
+     */
+    private String createTime;
+}

+ 10 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpSettlementRecordService.java

@@ -2,6 +2,7 @@ package com.sckw.payment.service;
 
 import com.sckw.payment.dao.KwpSettlementRecordMapper;
 import com.sckw.payment.model.vo.SettlementRecord;
+import com.sckw.payment.utils.DateTimeUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -21,7 +22,14 @@ public class KwpSettlementRecordService {
     private final KwpSettlementRecordMapper kwpSettlementRecordMapper;
 
 
-    public List<SettlementRecord> financeCount(List<String> financeCount, Long entId) {
-        return kwpSettlementRecordMapper.countByDay(financeCount,entId);
+    public List<SettlementRecord> financeCount(List<String> financeCount, Long entId, Integer circle) {
+        //3-月
+        if (circle == 3) {
+            List<String> timeAll = DateTimeUtil.generateMonthRange(DateTimeUtil.parseYMD(financeCount.get(0)), DateTimeUtil.parseYMD(financeCount.get(1)));
+            return kwpSettlementRecordMapper.countMonth(timeAll, financeCount, entId);
+        } else {
+            List<String> timeAll = DateTimeUtil.generateDateRange(DateTimeUtil.parseYMD(financeCount.get(0)), DateTimeUtil.parseYMD(financeCount.get(1)));
+            return kwpSettlementRecordMapper.countByDay(timeAll, financeCount, entId);
+        }
     }
 }

+ 52 - 4
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/WorkbenchService.java

@@ -1,16 +1,22 @@
 package com.sckw.payment.service;
 
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.payment.model.vo.SettlementRecord;
 import com.sckw.payment.model.vo.req.FinanceCount;
+import com.sckw.payment.model.vo.res.EChartsVo;
 import com.sckw.payment.utils.DateTimeUtil;
+import com.sckw.payment.utils.DecimalUtils;
 import jakarta.annotation.Resource;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 工作台
@@ -20,7 +26,6 @@ import java.util.List;
  */
 @Slf4j
 @Service
-@RequiredArgsConstructor
 public class WorkbenchService {
 
     @Resource
@@ -33,7 +38,7 @@ public class WorkbenchService {
 
         //时间参数为空,按照默认维度统计
         if (StringUtils.isBlank(financeCount.getStartTime()) && StringUtils.isBlank(financeCount.getEndTime())) {
-            //按照周期维度生成时间段
+            //按照周期维度生成时间段2
             if (circle == 1) {
                 //从今天倒推15天
                 time.add(DateTimeUtil.getComputeDaysStr(-14));
@@ -54,6 +59,49 @@ public class WorkbenchService {
             }
         }
         Long entId = LoginUserHolder.getEntId();
-        return kwpSettlementRecordService.financeCount(time,entId);
+        DecimalFormat df = new DecimalFormat("0.00");
+        //获取数据,按照统计因子进行处理,并转换成万元
+        List<SettlementRecord> settlementRecords = kwpSettlementRecordService.financeCount(time, entId, circle);
+        return settlementRecords.stream().map(a -> {
+            EChartsVo eChartsVo = new EChartsVo();
+            eChartsVo.setCreateTime(a.getCreateTime());
+            switch (financeCount.getFactorOne()) {
+                case "1" ->
+                        eChartsVo.setFactorOne(df.format(a.getReceivedMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "2" ->
+                        eChartsVo.setFactorOne(df.format(a.getExactMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "3" ->
+                        eChartsVo.setFactorOne(df.format(a.getOverdueExactMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "4" -> {
+                    BigDecimal overdueExactMoney = a.getOverdueExactMoney();
+                    //总应收金额
+                    BigDecimal totalReceiveMoney = a.getTotalReceiveMoney();
+                    if (totalReceiveMoney.compareTo(new BigDecimal("0.0")) <= 0) {
+                        eChartsVo.setFactorOne("0.00%");
+                    } else {
+                        eChartsVo.setFactorOne(DecimalUtils.financePercent(overdueExactMoney, totalReceiveMoney));
+                    }
+                }
+            }
+            switch (financeCount.getFactorTwo()) {
+                case "1" ->
+                        eChartsVo.setFactorTwo(df.format(a.getReceivedMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "2" ->
+                        eChartsVo.setFactorTwo(df.format(a.getExactMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "3" ->
+                        eChartsVo.setFactorTwo(df.format(a.getOverdueExactMoney().divide(new BigDecimal("10000.0"), 2, RoundingMode.HALF_UP)));
+                case "4" ->{
+                    BigDecimal overdueExactMoney = a.getOverdueExactMoney();
+                    //总应收金额
+                    BigDecimal totalReceiveMoney = a.getTotalReceiveMoney();
+                    if (totalReceiveMoney.compareTo(new BigDecimal("0.0")) <= 0) {
+                        eChartsVo.setFactorTwo("0.00%");
+                    } else {
+                        eChartsVo.setFactorTwo(DecimalUtils.financePercent(overdueExactMoney, totalReceiveMoney));
+                    }
+                }
+            }
+            return eChartsVo;
+        }).collect(Collectors.toList());
     }
 }

+ 39 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/utils/DateTimeUtil.java

@@ -5,7 +5,10 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @description: 时间工具类
@@ -15,10 +18,12 @@ import java.time.temporal.TemporalAdjusters;
  **/
 public class DateTimeUtil {
     public static final String YMD = "yyyy-MM-dd";
+    public static final String YM = "yyyy-MM";
     public static final String HMS = "HH:mm:ss";
     public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS = DateTimeFormatter.ofPattern(YMD + " " + HMS);
     public static final DateTimeFormatter YYYYMMDDHHMMSS = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
     public static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern(YMD);
+    public static final DateTimeFormatter YYYY_MM = DateTimeFormatter.ofPattern(YM);
     public static final DateTimeFormatter HH_MM_SS = DateTimeFormatter.ofPattern(HMS);
 
     public static LocalDateTime parse(String date) {
@@ -39,6 +44,10 @@ public class DateTimeUtil {
         return YYYY_MM_DD_HH_MM_SS.format(localDateTime);
     }
 
+    public static String formatYM(LocalDate localDate) {
+        return YYYY_MM.format(localDate);
+    }
+
     public static String formatYMD(LocalDate localDate) {
         return YYYY_MM_DD.format(localDate);
     }
@@ -242,6 +251,36 @@ public class DateTimeUtil {
         return LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
     }
 
+
+    public static List<String> generateDateRange(LocalDate startDate, LocalDate endDate) {
+        List<String> dateRange = new ArrayList<>();
+        LocalDate currentDate = startDate;
+
+        while (!currentDate.isAfter(endDate)) {
+            dateRange.add(formatYMD(currentDate));
+            currentDate = currentDate.plus(1, ChronoUnit.DAYS); // 增加一天
+        }
+        return dateRange;
+    }
+
+    /**
+     * 根据开始时间结束时间 格式化时间范围内的时间
+     *
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public static List<String> generateMonthRange(LocalDate startDate, LocalDate endDate) {
+        List<String> dateRange = new ArrayList<>();
+        LocalDate currentDate = startDate;
+
+        while (!currentDate.isAfter(endDate)) {
+            dateRange.add(formatYM(currentDate));
+            currentDate = currentDate.plus(1, ChronoUnit.MONTHS);
+        }
+        return dateRange;
+    }
+
     public static void main(String[] args) {
 
         System.out.println(parse("2023-12-11"));

+ 18 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/utils/DecimalUtils.java

@@ -34,4 +34,22 @@ public class DecimalUtils {
         }
         return df.format(dividend.divide(divisor, 6, RoundingMode.HALF_UP).multiply(new BigDecimal("100.0")).abs()) + "%";
     }
+
+    public static String financePercent(BigDecimal dividend, BigDecimal divisor) {
+        if (Objects.isNull(dividend)) {
+            dividend = new BigDecimal("0.00");
+        }
+        //除数为0
+        if (Objects.isNull(divisor)) {
+            divisor = new BigDecimal("0.00");
+        }
+
+        if (BigDecimal.ZERO.compareTo(dividend) != 0 && BigDecimal.ZERO.compareTo(divisor) == 0) {
+            return "100.00%";
+        }
+        if (BigDecimal.ZERO.compareTo(dividend) == 0 && BigDecimal.ZERO.compareTo(divisor) == 0) {
+            return "0.00%";
+        }
+        return df.format(dividend.divide(divisor, 6, RoundingMode.HALF_UP).multiply(new BigDecimal("100.0")).abs()) + "%";
+    }
 }

+ 47 - 13
sckw-modules/sckw-payment/src/main/resources/mapper/KwpSettlementRecordMapper.xml

@@ -58,26 +58,60 @@
         </foreach>
     </insert>
     <select id="countByDay" resultType="com.sckw.payment.model.vo.SettlementRecord">
-        select sum(ksr.total_pay_money)     totalPayMoney,
-               sum(ksr.exact_money)         exactMoney,
-               sum(ksr.received_money)      receivedMoney,
-               sum(ksr.overdue_exact_money) overdueExactMoney,
-               sum(ksr.total_pay_money)     totalPayMoney,
-               sum(ksr.unpaid_money)        unpaidMoney,
-               sum(ksr.paid_money)          paidMoney,
-               sum(ksr.overdue_paid_money)  overduePaidMoney
-        from kwp_settlement_record ksr
+        SELECT temp.date                               createTime,
+               ifnull(sum(ksr.total_receive_money), 0) totalReceiveMoney,
+               ifnull(sum(ksr.exact_money), 0)         exactMoney,
+               ifnull(sum(ksr.received_money), 0)      receivedMoney,
+               ifnull(sum(ksr.overdue_exact_money), 0) overdueExactMoney,
+               ifnull(sum(ksr.total_pay_money), 0)     totalPayMoney,
+               ifnull(sum(ksr.unpaid_money), 0)        unpaidMoney,
+               ifnull(sum(ksr.paid_money), 0)          paidMoney,
+               ifnull(sum(ksr.overdue_paid_money), 0)  overduePaidMoney
+        FROM (
+        <foreach collection="timeAll" item="date" separator="UNION ALL">
+            SELECT #{date} AS date
+        </foreach>
+        ) AS temp
+            left join
+        kwp_settlement_record ksr on temp.date = ksr.create_time and ksr.ent_id = #{entId,jdbcType=BIGINT}
         <where>
-            <if test="entId != null">
-                and ksr.ent_id = #{entId,jdbcType=BIGINT}
+            <if test="time != null and time.size() != 0">
+                temp.date between
+                <foreach collection="time" open=" " separator="and" close=" " item="item">
+                    #{item,jdbcType=TIMESTAMP}
+                </foreach>
             </if>
+        </where>
+        group by temp.date
+        order by temp.date
+    </select>
+    <select id="countMonth" resultType="com.sckw.payment.model.vo.SettlementRecord">
+        SELECT temp.date                               createTime,
+               ifnull(sum(ksr.total_receive_money), 0) totalReceiveMoney,
+               ifnull(sum(ksr.exact_money), 0)         exactMoney,
+               ifnull(sum(ksr.received_money), 0)      receivedMoney,
+               ifnull(sum(ksr.overdue_exact_money), 0) overdueExactMoney,
+               ifnull(sum(ksr.total_pay_money), 0)     totalPayMoney,
+               ifnull(sum(ksr.unpaid_money), 0)        unpaidMoney,
+               ifnull(sum(ksr.paid_money), 0)          paidMoney,
+               ifnull(sum(ksr.overdue_paid_money), 0)  overduePaidMoney
+        FROM (
+        <foreach collection="timeAll" item="date" separator="UNION ALL">
+            SELECT #{date} AS date
+        </foreach>
+        ) AS temp
+            left join
+        kwp_settlement_record ksr
+        on temp.date = date_format(ksr.create_time, '%Y-%m') and ksr.ent_id = #{entId,jdbcType=BIGINT}
+        <where>
             <if test="time != null and time.size() != 0">
-                and ksr.create_time between
+                temp.date between
                 <foreach collection="time" open=" " separator="and" close=" " item="item">
                     #{item,jdbcType=TIMESTAMP}
                 </foreach>
             </if>
         </where>
-        group by ksr.create_time
+        group by temp.date
+        order by temp.date
     </select>
 </mapper>