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

Merge branch 'dev' into sky_v1

15928045575 2 лет назад
Родитель
Сommit
98bdba7241
22 измененных файлов с 1005 добавлено и 60 удалено
  1. 4 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/NumberConstant.java
  2. 199 30
      sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/utils/DateUtil.java
  3. 20 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsStatisticsService.java
  4. 40 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsNumStsParam.java
  5. 11 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTransportDemandController.java
  6. 12 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwpWantBuyController.java
  7. 36 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TransportDemandContactInfoRes.java
  8. 2 8
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TransportDemandSquaresListRes.java
  9. 36 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuyContactInfoRes.java
  10. 101 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuyHallRes.java
  11. 9 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuySelectRes.java
  12. 28 5
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTransportDemandService.java
  13. 34 14
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwpWantBuyService.java
  14. 28 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsStatisticsServiceImpl.java
  15. 22 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  16. 5 1
      sckw-modules/sckw-report/pom.xml
  17. 38 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/KwOrderStatisticsController.java
  18. 47 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/model/dto/WorkbenchOrderStsDTO.java
  19. 61 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/TOrderDataStsResVO.java
  20. 42 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/WbTOrderDataStsParam.java
  21. 66 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/WbTOrderDataStsResVO.java
  22. 164 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderStatisticsService.java

+ 4 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/NumberConstant.java

@@ -1,5 +1,7 @@
 package com.sckw.core.common.enums;
 
+import java.math.BigDecimal;
+
 /**
  * @description:    定义常量
  * @author: LengFaQiang
@@ -62,6 +64,8 @@ public final class NumberConstant {
     public static final double NEGATICE_ONE_HUNDRED_EIGHTY = -180.0D;
     public static final int COOKIE_TIMEN = 300;
 
+    public static final BigDecimal ONE_HUNDRED = new BigDecimal("100.00");
+
     public NumberConstant() {
     }
 }

+ 199 - 30
sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/utils/DateUtil.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.utils.StringUtils;
+import org.springframework.util.Assert;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -75,6 +76,12 @@ public class DateUtil {
         return format;
     }
 
+    public static LocalDate localDateToLocalDate(LocalDate date) {
+        String str = dateToStr(date, "yyyy-MM-dd") + " 23:59:59";
+//        LocalDate localDate = parseLocalDate(str);
+        LocalDate localDate = LocalDate.parse(str, YYYY_MM_DD_HH_MM_SS);
+        return localDate;
+    }
 
     public static String dateToStr(LocalDate date) {
         return dateToStr(date, "yyyy-MM-dd");
@@ -167,6 +174,52 @@ public class DateUtil {
     }
 
 
+    /**
+     * 上个月
+     *
+     * @return 上个月
+     */
+    public static DateTime lastMonth(int offset) {
+        return offsetMonth(new DateTime(), -offset);
+    }
+
+    /**
+     * 偏移月
+     *
+     * @param date   日期
+     * @param offset 偏移月数,正数向未来偏移,负数向历史偏移
+     * @return 偏移后的日期
+     */
+    public static DateTime offsetMonth(Date date, int offset) {
+        return offset(date, DateField.MONTH, offset);
+    }
+
+    /**
+     * 获取指定日期偏移指定时间后的时间,生成的偏移日期不影响原日期
+     *
+     * @param date      基准日期
+     * @param dateField 偏移的粒度大小(小时、天、月等){@link DateField}
+     * @param offset    偏移量,正数为向后偏移,负数为向前偏移
+     * @return 偏移后的日期
+     */
+    public static DateTime offset(Date date, DateField dateField, int offset) {
+        return dateNew(date).offset(dateField, offset);
+    }
+
+    /**
+     * 根据已有{@link Date} 产生新的{@link DateTime}对象
+     *
+     * @param date Date对象,如果传入{@code null},返回{@code null}
+     * @return {@link DateTime}对象
+     * @since 4.3.1
+     */
+    public static DateTime dateNew(Date date) {
+        if (date == null) {
+            return null;
+        }
+        return new DateTime(date);
+    }
+
     /**
      * @param time yyyy-MM-dd
      * @return String yyyy-MM-dd HH:mm:ss
@@ -189,6 +242,7 @@ public class DateUtil {
 
     /**
      * 获取上周和上上周的开始时间和结束时间
+     *
      * @return
      */
     private static Map<String, String> getLastWeekTime() {
@@ -221,21 +275,21 @@ public class DateUtil {
     }
 
 
-    private static Map<String, String>  getRealizeLastWeekTime(int upLastStartOffset,int upLastEndOffset,int lastStartOffset,int lastEndOffset) {
+    private static Map<String, String> getRealizeLastWeekTime(int upLastStartOffset, int upLastEndOffset, int lastStartOffset, int lastEndOffset) {
         // 获取上上周的开始时间和结束时间
         String startUpLastWeekTime = DateTime.now().offset(DateField.DAY_OF_YEAR, upLastStartOffset)
-                .setField(DateField.HOUR_OF_DAY,0).setField(DateField.MINUTE,0)
-                .setField(DateField.SECOND,0).setField(DateField.MILLISECOND,0).toString();
+                .setField(DateField.HOUR_OF_DAY, 0).setField(DateField.MINUTE, 0)
+                .setField(DateField.SECOND, 0).setField(DateField.MILLISECOND, 0).toString();
         String endUpLastWeekTime = DateTime.now().offset(DateField.DAY_OF_YEAR, upLastEndOffset)
-                .setField(DateField.HOUR_OF_DAY,23).setField(DateField.MINUTE,59)
-                .setField(DateField.SECOND,59).setField(DateField.MILLISECOND,0).toString();
+                .setField(DateField.HOUR_OF_DAY, 23).setField(DateField.MINUTE, 59)
+                .setField(DateField.SECOND, 59).setField(DateField.MILLISECOND, 0).toString();
         // 获取上周的开始时间和结束时间
         String startLastWeekTime = DateTime.now().offset(DateField.DAY_OF_YEAR, lastStartOffset)
-                .setField(DateField.HOUR_OF_DAY,0).setField(DateField.MINUTE,0)
-                .setField(DateField.SECOND,0).setField(DateField.MILLISECOND,0).toString();
+                .setField(DateField.HOUR_OF_DAY, 0).setField(DateField.MINUTE, 0)
+                .setField(DateField.SECOND, 0).setField(DateField.MILLISECOND, 0).toString();
         String endLastWeekTime = DateTime.now().offset(DateField.DAY_OF_YEAR, lastEndOffset)
-                .setField(DateField.HOUR_OF_DAY,23).setField(DateField.MINUTE,59)
-                .setField(DateField.SECOND,59).setField(DateField.MILLISECOND,0).toString();
+                .setField(DateField.HOUR_OF_DAY, 23).setField(DateField.MINUTE, 59)
+                .setField(DateField.SECOND, 59).setField(DateField.MILLISECOND, 0).toString();
         Map<String, String> maps = new HashMap();
         maps.put("startUpLastWeekTime", startUpLastWeekTime);
         maps.put("endUpLastWeekTime", endUpLastWeekTime);
@@ -243,6 +297,7 @@ public class DateUtil {
         maps.put("endLastWeekTime", endLastWeekTime);
         return maps;
     }
+
     /**
      * yyyy-MM-dd 转换成 Date
      *
@@ -391,6 +446,11 @@ public class DateUtil {
         return LocalDateTime.parse(time, YYYY_MM_DD_HH_MM_SS);
     }
 
+    public static LocalDate parseLocalDate(String time) {
+        return LocalDate.parse(time, YYYY_MM_DD_HH_MM_SS);
+    }
+
+
     public static LocalDate parseDate(long time) {
         return LocalDate.from(parseDateTime(time));
     }
@@ -461,7 +521,9 @@ public class DateUtil {
         return date;
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws ParseException {
+        String lastTwoMonthDate = getLastTwoMonthDateStart();
+        String lastTwoMonthDateEnd = getLastTwoMonthDateEnd();
 //        String s = "2023-12-12";
 //        Date date = DateUtil.stringPatchingStartToDateTime(s);
 //        Date date1 = DateUtil.stringPatchingEndToDateTime(s);
@@ -471,10 +533,31 @@ public class DateUtil {
 //        String lastWeekDateEnd = getLastWeekDateEnd();
 //        System.out.println(lastWeekDateStart);
 //        System.out.println(lastWeekDateEnd);
-        String beforeWeekDate = DateUtil.getBeforeWeekDate(6)+" 00:00:00";
-        String beforeWeekDate1 = DateUtil.getBeforeWeekDate(7)+" 23:59:59";;
-        System.out.println(beforeWeekDate);
-        System.out.println(beforeWeekDate1);
+//        String beforeWeekDate = DateUtil.getBeforeWeekDate(6) + " 00:00:00";
+//        String beforeWeekDate1 = DateUtil.getBeforeWeekDate(7) + " 23:59:59";
+//        ;
+//        System.out.println(beforeWeekDate);
+//        System.out.println(beforeWeekDate1);
+//        DateTime dateTime = lastMonth();
+//        System.out.println(dateTime);
+
+//        // 获取当前日期
+//        LocalDate currentDate = LocalDate.now();
+//        // 计算一年前的日期
+//        LocalDate oneYearAgo = currentDate.minusYears(1);
+//        LocalDateTime localDateTime = oneYearAgo.atStartOfDay();
+//        System.out.println(localDateTime);
+//        LocalDateTime beforeWeekDateEnd = getBeforeWeekDateEnd(6);
+//        System.out.println(beforeWeekDateEnd);
+        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN));
+        System.out.println(format);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN);
+        LocalDateTime parse = LocalDateTime.parse(format, formatter);
+        System.out.println(parse);
+        LocalDateTime lastWeekDateStart = getLastWeekDateStart(6);
+        System.out.println(lastWeekDateStart);
+        LocalDateTime lastWeekDateEnd = getLastWeekDateEnd(6);
+        System.out.println(lastWeekDateEnd);
 
     }
 
@@ -651,31 +734,61 @@ public class DateUtil {
     }
 
     /**
-     * 当前时间的前一个星期
+     * 当前时间的前一个星期[传递6即为一周]
      *
-     * @return
+     * @return 2023-09-12 00:00:00
+     */
+    public static LocalDateTime getLastWeekDateStart(long amount) {
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+//        Calendar c = Calendar.getInstance();
+//        c.add(Calendar.DAY_OF_MONTH, -6);
+//        String start = format.format(c.getTime()) + " 00:00:00";
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN);
+//        LocalDateTime localDateTime = LocalDateTime.parse(start, formatter);
+        LocalDateTime localDateTime = LocalDate.now().minusDays(amount).atStartOfDay();
+        return localDateTime;
+    }
+
+
+    /**
+     * 当前时间的前一个星期 [传递6即为一周]
+     *
+     * @return 2023-09-12 23:59:59
      */
-    public static String getLastWeekDateStart() {
+    public static LocalDateTime getLastWeekDateEnd(int amount) {
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Calendar c = Calendar.getInstance();
-        c.add(Calendar.DAY_OF_MONTH, -6);
-        String start = format.format(c.getTime()) + " 00:00:00";
-//        System.out.println(start);
+        c.add(Calendar.DAY_OF_MONTH, -amount);
+        String start = format.format(c.getTime()) + " 23:59:59";
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN);
+        LocalDateTime parse = LocalDateTime.parse(start, formatter);
+        return parse;
+    }
+
+    /**
+     * 当前时间的前一个星期
+     *
+     * @return
+     */
+    public static String getLastDateStart(Integer type) {
+        Assert.notNull(type, "获取上周/月结束时间,日期类型参数缺失");
+        int days = Objects.equals(type, 1) ? 6 : 29;
+        String start = LocalDate.now().atStartOfDay().minusDays(days).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         return start;
     }
 
 
     /**
-     * 当前时间的前一个星期
+     * 获取当前日期之前的时间
      *
+     * @param amount 往前推多久时间[天为单位]
      * @return
      */
-    public static String getLastWeekDateEnd() {
+    public static String getBeforeWeekDate(int amount) {
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Calendar c = Calendar.getInstance();
-        c.add(Calendar.DAY_OF_MONTH, -6);
-        String start = format.format(c.getTime()) + " 23:59:59";
-//        System.out.println(start);
+        c.add(Calendar.DAY_OF_MONTH, -amount);
+        String start = format.format(c.getTime());
         return start;
     }
 
@@ -685,14 +798,29 @@ public class DateUtil {
      * @param amount 往前推多久时间[天为单位]
      * @return
      */
-    public static String getBeforeWeekDate(int amount) {
+    public static String getBeforeWeekDateStart(int amount) {
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Calendar c = Calendar.getInstance();
         c.add(Calendar.DAY_OF_MONTH, -amount);
-        String start = format.format(c.getTime());
+        String start = format.format(c.getTime()) + " 00:00:00";
         return start;
     }
 
+    /**
+     * 获取当前日期之前的时间
+     *
+     * @param amount 往前推多久时间[天为单位]
+     * @return
+     */
+    public static LocalDateTime getBeforeWeekDateEnd(int amount) {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DAY_OF_MONTH, -amount);
+        String start = format.format(c.getTime()) + " 23:59:59";
+        LocalDateTime parse = LocalDateTime.parse(start);
+        return parse;
+    }
+
 
     /**
      * 当天日期前一个月
@@ -709,6 +837,34 @@ public class DateUtil {
     }
 
 
+    /**
+     * 当天日期前一个月
+     *
+     * @return 2023-09-06 00:00:00
+     */
+    public static String getLastMonthDateStart() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, -1);
+        String start = format.format(c.getTime())+" 00:00:00";
+        System.out.println(start);
+        return start;
+    }
+
+    /**
+     * 当天日期前一个月
+     *
+     * @return 2023-09-06 23:59:59
+     */
+    public static String getLastMonthDateEnd() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, -1);
+        String start = format.format(c.getTime())+" 23:59:59";
+        return start;
+    }
+
+
     /**
      * 获取当前日期之前的时间
      *
@@ -729,13 +885,26 @@ public class DateUtil {
      *
      * @return
      */
-    public static String getLastMonthDate1() {
+    public static String getLastTwoMonthDateStart() {
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Calendar c = Calendar.getInstance();
-        c.setTime(strDateTimeToDateTime(getLastMonthDate()));
+        c.setTime(strDateTimeToDateTime(getLastMonthDateStart()));
+        c.add(Calendar.MONTH, -1);
+        String start = format.format(c.getTime());
+        return start;
+    }
+
+    /**
+     * 当天日期前两个月
+     *
+     * @return
+     */
+    public static String getLastTwoMonthDateEnd() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar c = Calendar.getInstance();
+        c.setTime(strDateTimeToDateTime(getLastMonthDateEnd()));
         c.add(Calendar.MONTH, -1);
         String start = format.format(c.getTime());
-        System.out.println(start);
         return start;
     }
 

+ 20 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsStatisticsService.java

@@ -0,0 +1,20 @@
+package com.sckw.product.api.dubbo;
+
+import com.sckw.product.api.model.GoodsNumStsParam;
+
+/**
+ * @desc: 商品统计相关dubbo接口
+ * @author: yzc
+ * @date: 2023-09-11 14:09
+ */
+public interface GoodsStatisticsService {
+
+    /**
+     * @desc: 根据一级企业和商品单位统计上架商品数量
+     * @author: yzc
+     * @date: 2023-09-11 15:41
+     * @Param param:
+     * @return: java.lang.Long
+     */
+    Long getOnShelfGoodsNum(GoodsNumStsParam param);
+}

+ 40 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsNumStsParam.java

@@ -0,0 +1,40 @@
+package com.sckw.product.api.model;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @desc: 商品数量统计请求参数
+ * @author: yzc
+ * @date: 2023-09-11 15:37
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class GoodsNumStsParam implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 3858363507481858973L;
+
+    /**
+     * 一级企业id
+     */
+    private Long topEntId;
+
+    /**
+     * 商品单位
+     */
+    private String unit;
+
+    /**
+     * 结束日期
+     */
+    private Date endDate;
+
+}

+ 11 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTransportDemandController.java

@@ -176,5 +176,15 @@ public class KwoTransportDemandController {
         return HttpResult.ok(kwoTransportDemandService.demandSquaresList(param));
     }
 
-
+    /**
+     * @desc: 查看联系方式
+     * @author: yzc
+     * @date: 2023-09-12 9:05
+     * @Param id:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @GetMapping("/getContactInfo")
+    public HttpResult getContactInfo(@RequestParam Long id) {
+        return HttpResult.ok(kwoTransportDemandService.getContactInfo(id));
+    }
 }

+ 12 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwpWantBuyController.java

@@ -48,6 +48,18 @@ public class KwpWantBuyController {
         return HttpResult.ok(kwpWantBuyService.buyHallList(wantBuySelectParam));
     }
 
+    /**
+     * @desc: 查看联系方式
+     * @author: yzc
+     * @date: 2023-09-12 9:05
+     * @Param id:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @GetMapping("/getContactInfo")
+    public HttpResult getContactInfo(@RequestParam Long id) {
+        return HttpResult.ok(kwpWantBuyService.getContactInfo(id));
+    }
+
     /**
      * @desc: 新增求购草稿
      * @author: yzc

+ 36 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TransportDemandContactInfoRes.java

@@ -0,0 +1,36 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 运需联系方式信息
+ * @author: yzc
+ * @date: 2023-09-12 9:02
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TransportDemandContactInfoRes implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3167424826112844192L;
+
+    private Long id;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+}

+ 2 - 8
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TransportDemandSquaresListRes.java

@@ -85,15 +85,9 @@ public class TransportDemandSquaresListRes implements Serializable {
      */
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDate deadline;
-
-    /**
-     * 联系人姓名
-     */
-    private String contacts;
-
     /**
-     * 联系电话
+     * 创建时间
      */
-    private String phone;
+    private String createTime;
 
 }

+ 36 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuyContactInfoRes.java

@@ -0,0 +1,36 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 求购联系方式信息
+ * @author: yzc
+ * @date: 2023-09-12 9:02
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class WantBuyContactInfoRes implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3167424826112844192L;
+
+    private Long id;
+
+    /**
+     * 联系人姓名
+     */
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+}

+ 101 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuyHallRes.java

@@ -0,0 +1,101 @@
+package com.sckw.order.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: lt
+ * @Date: 2023-07-26-15:48
+ */
+@Getter
+@Setter
+@ToString
+public class WantBuyHallRes implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8658159273205687254L;
+
+    private Long id;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    private Long entId;
+
+
+    private String entName;
+
+    /**
+     * 商品分类
+     */
+    private String goodsType;
+
+    /**
+     * 商品分类label
+     */
+    private String goodsTypeLabel;
+
+    /**
+     * 规格
+     */
+    private String spec;
+
+    /**
+     * 地址信息
+     */
+    private String addressName;
+    private String cityName;
+    private String detailAddress;
+
+    /**
+     * 支付方式
+     */
+    private String tradings;
+
+    /**
+     * 求购单价
+     */
+    private String price;
+
+    /**
+     * 求购总量
+     */
+    private String amount;
+
+    /**
+     * 常见时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" ,timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+    private String statusLabel;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    //private List<KwoWantBuyTrading> wantBuyTradings;
+    private List<WantBuyTradingRes> wantBuyTradings;
+
+
+}

+ 9 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/WantBuySelectRes.java

@@ -3,7 +3,10 @@ package com.sckw.order.model.vo.res;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
@@ -14,7 +17,12 @@ import java.util.List;
  */
 @Getter
 @Setter
-public class WantBuySelectRes {
+@ToString
+public class WantBuySelectRes implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5987208615378442044L;
+
 
     private Long id;
 

+ 28 - 5
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTransportDemandService.java

@@ -15,6 +15,7 @@ import com.sckw.core.model.vo.TableStatisticRes;
 import com.sckw.core.model.vo.TableTop;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.excel.utils.DateUtil;
@@ -22,6 +23,7 @@ import com.sckw.order.dao.KwoTransportDemandMapper;
 import com.sckw.order.model.KwoTransportDemand;
 import com.sckw.order.model.dto.TransportDemandExport;
 import com.sckw.order.model.vo.req.*;
+import com.sckw.order.model.vo.res.TransportDemandContactInfoRes;
 import com.sckw.order.model.vo.res.TransportDemandDetailRes;
 import com.sckw.order.model.vo.res.TransportDemandListRes;
 import com.sckw.order.model.vo.res.TransportDemandSquaresListRes;
@@ -87,7 +89,7 @@ public class KwoTransportDemandService {
      * @return: com.sckw.order.model.vo.res.TransportDemandDetailRes
      */
     public TransportDemandDetailRes detail(Long id) {
-        KwoTransportDemand transportDemand = getById(id);
+        KwoTransportDemand transportDemand = getById(id, Boolean.FALSE);
         if (Objects.isNull(transportDemand)) {
             throw new BusinessException("数据不存在!");
         }
@@ -105,10 +107,13 @@ public class KwoTransportDemandService {
      * @Param id:
      * @return: com.sckw.order.model.KwoTransportDemand
      */
-    private KwoTransportDemand getById(Long id) {
+    private KwoTransportDemand getById(Long id, Boolean needPermissions) {
         LambdaQueryWrapper<KwoTransportDemand> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwoTransportDemand::getId, id).eq(KwoTransportDemand::getEntId,LoginUserHolder.getEntId())
-                .eq(KwoTransportDemand::getDelFlag, Global.NO).last("LIMIT 1");
+        wrapper.eq(KwoTransportDemand::getId, id);
+        if (needPermissions) {
+            wrapper.eq(KwoTransportDemand::getEntId, LoginUserHolder.getEntId());
+        }
+        wrapper.eq(KwoTransportDemand::getDelFlag, Global.NO).last("LIMIT 1");
         return kwoTransportDemandMapper.selectOne(wrapper);
     }
 
@@ -120,7 +125,7 @@ public class KwoTransportDemandService {
      * @return: void
      */
     public void update(UpdateTransportDemandParam param) {
-        KwoTransportDemand demand = getById(param.getId());
+        KwoTransportDemand demand = getById(param.getId(), true);
         if (Objects.isNull(demand)) {
             throw new BusinessException("数据不存在!");
         }
@@ -428,9 +433,27 @@ public class KwoTransportDemandService {
                     .setTradingLabel(DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), e.getTrading()))
                     .setLoadAddress(e.getLoadAreaName() + e.getLoadDetailAddress())
                     .setUnloadAddress(e.getUnloadAreaName() + e.getUnloadDetailAddress())
+                    .setCreateTime(DateUtils.format(e.getCreateTime()))
                     .setDemandUnit(Objects.nonNull(ent) ? ent.getFirmName() : null);
             result.add(res);
         });
         return PageResult.build(param.getPage(), param.getPageSize(), kwpGoodsPage.getTotal(), result);
     }
+
+    /**
+     * @desc: 查看联系方式
+     * @author: yzc
+     * @date: 2023-09-12 9:06
+     * @Param id:
+     * @return: com.sckw.order.model.vo.res.TransportDemandContactInfoRes
+     */
+    public TransportDemandContactInfoRes getContactInfo(Long id) {
+        KwoTransportDemand transportDemand = getById(id, Boolean.FALSE);
+        if (Objects.isNull(transportDemand)) {
+            throw new BusinessException("数据不存在!");
+        }
+        TransportDemandContactInfoRes res = new TransportDemandContactInfoRes();
+        res.setId(id).setContacts(transportDemand.getContacts()).setPhone(transportDemand.getPhone());
+        return res;
+    }
 }

+ 34 - 14
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwpWantBuyService.java

@@ -25,9 +25,7 @@ import com.sckw.order.model.KwoWantBuyAddress;
 import com.sckw.order.model.KwoWantBuyTrading;
 import com.sckw.order.model.dto.WantBuyExport;
 import com.sckw.order.model.vo.req.*;
-import com.sckw.order.model.vo.res.WantBuyAddressDetailRes;
-import com.sckw.order.model.vo.res.WantBuyDetailRes;
-import com.sckw.order.model.vo.res.WantBuySelectRes;
+import com.sckw.order.model.vo.res.*;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
@@ -63,7 +61,7 @@ public class KwpWantBuyService {
      * @author lt
      * @Date 11:50 2023/8/1 0001
      **/
-    public PageRes<WantBuySelectRes> buyHallList(WantBuySelectParam wantBuySelectParam) {
+    public PageRes<WantBuyHallRes> buyHallList(WantBuySelectParam wantBuySelectParam) {
         // 如果有求购方式的查询条件,需要先查询出求购方式的id
         if (StringUtils.isNotBlank(wantBuySelectParam.getTrading())) {
             List<String> longList = stringToLongList(wantBuySelectParam.getTrading());
@@ -102,10 +100,11 @@ public class KwpWantBuyService {
         if (CollectionUtils.isEmpty(wantBuyDto)) {
             return new PageRes<>();
         }
+        List<WantBuyHallRes> res = BeanUtils.copyToList(wantBuyDto, WantBuyHallRes.class);
 
         // 获取供应企业信息
-        List<Long> supplyEntIds = wantBuyDto.stream()
-                .map(WantBuySelectRes::getEntId)
+        List<Long> supplyEntIds = res.stream()
+                .map(WantBuyHallRes::getEntId)
                 .collect(Collectors.toList());
         // 通过企业id查询企业信息
         List<EntCacheResDto> entList = remoteSystemService.queryEntCacheByIds(supplyEntIds);
@@ -113,17 +112,17 @@ public class KwpWantBuyService {
                 .collect(Collectors.toMap(EntCacheResDto::getId, EntCacheResDto::getFirmName, (k1, k2) -> k1));
 
         // 对求购列表进行数据处理
-        wantBuyDto.forEach(wantBuySelectRes -> {
-            List<String> tradings = wantBuySelectRes.getWantBuyTradings().stream()
-                    .map(wantBuyTradingRes -> DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), wantBuyTradingRes.getTrading()))
+        res.forEach(e -> {
+            List<String> tradings = e.getWantBuyTradings().stream()
+                    .map(f -> DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), f.getTrading()))
                     .collect(Collectors.toList());
-            wantBuySelectRes.setTradings(String.join(Global.COMMA, tradings));
-            wantBuySelectRes.setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), wantBuySelectRes.getGoodsType()));
-            wantBuySelectRes.setStatusLabel(DictEnum.getLabel(DictTypeEnum.GOODS_STATUS.getType(), String.valueOf(wantBuySelectRes.getStatus())));
-            wantBuySelectRes.setEntName(Objects.nonNull(entMap.get(wantBuySelectRes.getEntId())) ? entMap.get(wantBuySelectRes.getEntId()) : null);
+            e.setTradings(String.join(Global.COMMA, tradings));
+            e.setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), e.getGoodsType()));
+            e.setStatusLabel(DictEnum.getLabel(DictTypeEnum.GOODS_STATUS.getType(), String.valueOf(e.getStatus())));
+            e.setEntName(Objects.nonNull(entMap.get(e.getEntId())) ? entMap.get(e.getEntId()) : null);
         });
 
-        return new PageRes<>(new PageInfo<>(wantBuyDto));
+        return new PageRes<>(new PageInfo<>(res));
     }
 
     /**
@@ -504,4 +503,25 @@ public class KwpWantBuyService {
         });
         return result;
     }
+
+    /**
+     * @desc: 查看联系方式
+     * @author: yzc
+     * @date: 2023-09-12 9:24
+     * @Param id:
+     * @return: com.sckw.order.model.vo.res.WantBuyContactInfoRes
+     */
+    public WantBuyContactInfoRes getContactInfo(Long id) {
+        LambdaQueryWrapper<KwoWantBuy> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwoWantBuy::getId, id)
+                .eq(KwoWantBuy::getDelFlag, Global.NO)
+                .last("LIMIT 1");
+        KwoWantBuy wantBuy = kwpWantBuyMapper.selectOne(wrapper);
+        if (Objects.isNull(wantBuy)){
+            throw new BusinessException("求购信息不存在");
+        }
+        WantBuyContactInfoRes res = new WantBuyContactInfoRes();
+        res.setId(id).setContacts(wantBuy.getContacts()).setPhone(wantBuy.getPhone());
+        return res;
+    }
 }

+ 28 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsStatisticsServiceImpl.java

@@ -0,0 +1,28 @@
+package com.sckw.product.dubbo;
+
+import com.sckw.product.api.dubbo.GoodsStatisticsService;
+import com.sckw.product.api.model.GoodsNumStsParam;
+import com.sckw.product.service.KwpGoodsService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+
+/**
+ * @desc: 商品统计相关dubbo接口实现
+ * @author: yzc
+ * @date: 2023-09-11 14:15
+ */
+@DubboService(group = "design", version = "1.0.0")
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsStatisticsServiceImpl implements GoodsStatisticsService {
+
+    private final KwpGoodsService kwpGoodsService;
+
+
+    @Override
+    public Long getOnShelfGoodsNum(GoodsNumStsParam param) {
+        return kwpGoodsService.getOnShelfGoodsNum(param);
+    }
+
+}

+ 22 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -22,6 +22,7 @@ import com.sckw.payment.api.dubbo.PayCenterDubboService;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.payment.api.model.dto.common.R;
+import com.sckw.product.api.model.GoodsNumStsParam;
 import com.sckw.product.dao.KwpGoodsMapper;
 import com.sckw.product.enums.GoodsStatusEnum;
 import com.sckw.product.model.*;
@@ -1096,4 +1097,25 @@ public class KwpGoodsService {
         }
         return Objects.nonNull(price) ? price : notLimit;
     }
+
+
+    /**
+     * @desc: 根据一级企业和商品单位统计上架商品数量
+     * @author: yzc
+     * @date: 2023-09-11 15:42
+     * @Param param:
+     * @return: java.lang.Long
+     */
+    public Long getOnShelfGoodsNum(GoodsNumStsParam param) {
+        LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoods::getEntId, param.getTopEntId())
+                .eq(StringUtils.isNotBlank(param.getUnit()), KwpGoods::getUnit, param.getUnit())
+                .eq(KwpGoods::getStatus, GoodsStatusEnum.PUT_ON_SHELVES.getCode())
+                .eq(KwpGoods::getDelFlag, Global.NO);
+        if (Objects.nonNull(param.getEndDate())) {
+            wrapper.le(KwpGoods::getShelfTime, param.getEndDate());
+        }
+        Long count = kwpGoodsMapper.selectCount(wrapper);
+        return Objects.isNull(count) ? 0L : count;
+    }
 }

+ 5 - 1
sckw-modules/sckw-report/pom.xml

@@ -123,7 +123,11 @@
             <groupId>com.sckw</groupId>
             <artifactId>sckw-contract-api</artifactId>
             <version>1.0.0</version>
-            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-product-api</artifactId>
+            <version>1.0.0</version>
         </dependency>
     </dependencies>
     <build>

+ 38 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/KwOrderStatisticsController.java

@@ -0,0 +1,38 @@
+package com.sckw.report.controller;
+
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.report.model.vo.WbTOrderDataStsParam;
+import com.sckw.report.service.KwOrderStatisticsService;
+import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @desc: 订单统计相关接口
+ * @author: yzc
+ * @date: 2023-09-11 14:31
+ */
+@AllArgsConstructor
+@RestController
+@RequestMapping("/kwOrderStatistics")
+public class KwOrderStatisticsController {
+
+    private final KwOrderStatisticsService kwOrderStatisticsService;
+
+    /**
+     * @desc: 工作台贸易订单数据统计
+     * @author: yzc
+     * @date: 2023-09-11 14:43
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/workbenchData", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody @Validated WbTOrderDataStsParam params) {
+        return HttpResult.ok(kwOrderStatisticsService.workbenchData(params));
+    }
+
+}

+ 47 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/model/dto/WorkbenchOrderStsDTO.java

@@ -0,0 +1,47 @@
+package com.sckw.report.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @desc: 工作台订单统计dto
+ * @author: yzc
+ * @date: 2023-09-11 17:45
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class WorkbenchOrderStsDTO implements Serializable {
+
+    public WorkbenchOrderStsDTO() {
+        this.orderAmount = BigDecimal.ZERO;
+        this.orderPrice = BigDecimal.ZERO;
+        this.orderActualAmount = BigDecimal.ZERO;
+    }
+
+    @Serial
+    private static final long serialVersionUID = -925557546832266552L;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 订单总金额
+     */
+    private BigDecimal orderPrice;
+
+    /**
+     * 订单总实际成交量
+     */
+    private BigDecimal orderActualAmount;
+
+}

+ 61 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/TOrderDataStsResVO.java

@@ -0,0 +1,61 @@
+package com.sckw.report.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @desc: 贸易订单统计数据响应对象
+ * @author: yzc
+ * @date: 2023-09-11 14:58
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TOrderDataStsResVO implements Serializable {
+
+    public TOrderDataStsResVO() {
+        this.goodsNum = 0L;
+        this.orderAmount = BigDecimal.ZERO;
+        this.orderPrice = BigDecimal.ZERO;
+        this.waitCollectedPrice = BigDecimal.ZERO;
+        this.notArrivedAmount = BigDecimal.ZERO;
+    }
+
+
+    @Serial
+    private static final long serialVersionUID = -6132733716009809627L;
+    /**
+     * 商品数量
+     */
+    private Long goodsNum;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderPrice;
+
+    /**
+     * 待付款金额
+     */
+    private BigDecimal waitCollectedPrice;
+
+    /**
+     * 未到货量
+     */
+    private BigDecimal notArrivedAmount;
+
+
+
+}

+ 42 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/WbTOrderDataStsParam.java

@@ -0,0 +1,42 @@
+package com.sckw.report.model.vo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 工作台贸易订单数据统计请求参数
+ * @author: yzc
+ * @date: 2023-09-11 14:42
+ */
+@Getter
+@Setter
+@ToString
+public class WbTOrderDataStsParam implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 4503103839537525731L;
+
+
+    /**
+     * 订单类型(1采购订单、2销售订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+    /**
+     * 商品单位
+     */
+    private String unit;
+    /**
+     * 统计日期类型(1周、2月)
+     */
+    @Range(min = 1, max = 2, message = "非法日期类型")
+    @NotNull(message = "日期类型不能为空")
+    private Integer dateType;
+
+}

+ 66 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/model/vo/WbTOrderDataStsResVO.java

@@ -0,0 +1,66 @@
+package com.sckw.report.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @desc: 工作台贸易订单数据统计响应vo
+ * @author: yzc
+ * @date: 2023-09-11 14:58
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class WbTOrderDataStsResVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -8601548022756611241L;
+
+    public WbTOrderDataStsResVO() {
+        this.tOrderDataStsList = new ArrayList<>();
+        this.goodsNumRingRate = BigDecimal.ZERO;
+        this.orderAmountRingRate = BigDecimal.ZERO;
+        this.orderPriceRingRate = BigDecimal.ZERO;
+        this.waitCollectedPriceRingRate = BigDecimal.ZERO;
+        this.notArrivedAmountRingRate = BigDecimal.ZERO;
+    }
+
+    /**
+     * 贸易订单数据统计列表
+     */
+   private List<TOrderDataStsResVO> tOrderDataStsList;
+
+    /**
+     * 商品数量环比
+     */
+    private BigDecimal goodsNumRingRate;
+
+    /**
+     * 订单总量环比
+     */
+    private BigDecimal orderAmountRingRate;
+
+    /**
+     * 订单金额环比
+     */
+    private BigDecimal orderPriceRingRate;
+
+    /**
+     * 待付款金额环比
+     */
+    private BigDecimal waitCollectedPriceRingRate;
+
+    /**
+     * 未到货量环比
+     */
+    private BigDecimal notArrivedAmountRingRate;
+
+}

+ 164 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderStatisticsService.java

@@ -0,0 +1,164 @@
+package com.sckw.report.service;
+
+import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.mongo.model.SckwTradeOrder;
+import com.sckw.product.api.dubbo.GoodsStatisticsService;
+import com.sckw.product.api.model.GoodsNumStsParam;
+import com.sckw.report.model.dto.WorkbenchOrderStsDTO;
+import com.sckw.report.model.vo.TOrderDataStsResVO;
+import com.sckw.report.model.vo.WbTOrderDataStsParam;
+import com.sckw.report.model.vo.WbTOrderDataStsResVO;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @desc: TODO
+ * @author: yzc
+ * @date: 2023-09-11 14:33
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+public class KwOrderStatisticsService {
+
+    private final MongoTemplate mongoTemplate;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private GoodsStatisticsService goodsStatisticsService;
+
+
+    /**
+     * @desc: 工作台贸易订单数据统计
+     * @author: yzc
+     * @date: 2023-09-11 15:32
+     * @Param params:
+     * @return: com.sckw.report.model.vo.WbTOrderDataStsResVO
+     */
+    public WbTOrderDataStsResVO workbenchData(WbTOrderDataStsParam params) {
+        WbTOrderDataStsResVO res = new WbTOrderDataStsResVO();
+        List<TOrderDataStsResVO> list = new ArrayList<>();
+        Long entId = LoginUserHolder.getEntId();
+        String unit = params.getUnit();
+        Integer orderType = params.getOrderType();
+        Integer dateType = params.getDateType();
+        Date currentStart = DateUtils.getStartTimeByDateType(dateType, LocalDateTime.now());
+        Date lastEnd = DateUtils.getEndTimeByDateType(dateType, LocalDateTime.now());
+        Date lastStart = DateUtils.getStartTimeByDateType(dateType, DateUtils.toLocalDateTime(currentStart));
+        //当前数据
+        TOrderDataStsResVO currentDataSts = new TOrderDataStsResVO();
+        //商品数量
+        GoodsNumStsParam goodsNumStsParam = new GoodsNumStsParam();
+        goodsNumStsParam.setTopEntId(entId).setUnit(unit);
+        Long currentGoodsNum = goodsStatisticsService.getOnShelfGoodsNum(goodsNumStsParam);
+        //订单统计
+        WorkbenchOrderStsDTO currentOrderSts = getOrderStsInfo(orderType, unit, currentStart, null);
+        BigDecimal currentAmount = currentOrderSts.getOrderAmount();
+        BigDecimal currentPrice = currentDataSts.getOrderPrice();
+        currentDataSts.setGoodsNum(currentGoodsNum)
+                .setOrderAmount(currentAmount)
+                .setOrderPrice(currentPrice)
+                .setNotArrivedAmount(currentAmount.subtract(currentOrderSts.getOrderActualAmount()));
+        //todo 待付款金额
+        list.add(currentDataSts);
+
+        //上周/上月数据
+        TOrderDataStsResVO lastDataSts = new TOrderDataStsResVO();
+        //商品数量
+        goodsNumStsParam.setEndDate(lastEnd);
+        Long lastGoodsNum = goodsStatisticsService.getOnShelfGoodsNum(goodsNumStsParam);
+        //订单统计
+        WorkbenchOrderStsDTO lastOrderSts = getOrderStsInfo(orderType, unit, lastStart, lastEnd);
+        BigDecimal lastAmount = lastOrderSts.getOrderAmount();
+        BigDecimal lastPrice = lastOrderSts.getOrderPrice();
+        lastDataSts.setGoodsNum(lastGoodsNum)
+                .setOrderAmount(lastAmount)
+                .setOrderPrice(lastPrice)
+                .setNotArrivedAmount(lastAmount.subtract(lastOrderSts.getOrderActualAmount()));
+        //todo 待付款金额
+        list.add(lastDataSts);
+        res.setTOrderDataStsList(list);
+        //环比数据
+        //商品数量环比
+        BigDecimal goodsNumRingRate = Objects.isNull(lastGoodsNum) || lastGoodsNum == 0L ? NumberConstant.ONE_HUNDRED :
+                new BigDecimal((currentGoodsNum - lastGoodsNum)).divide(new BigDecimal(lastGoodsNum), 2, RoundingMode.HALF_UP);
+        //订单总量环比
+        BigDecimal orderAmountRingRate = lastAmount.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
+                (currentAmount.subtract(lastAmount)).divide(lastAmount, 2, RoundingMode.HALF_UP);
+        //订单总金额环比
+        BigDecimal orderPriceRingRate = lastPrice.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
+                (currentPrice.subtract(lastPrice)).divide(lastPrice, 2, RoundingMode.HALF_UP);
+        //未到货量环比
+        BigDecimal currentNotArrived = currentDataSts.getNotArrivedAmount();
+        BigDecimal lastNotArrived = lastDataSts.getNotArrivedAmount();
+        BigDecimal notArrivedAmountRingRate = lastNotArrived.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
+                (currentNotArrived.subtract(lastNotArrived)).divide(lastNotArrived, 2, RoundingMode.HALF_UP);
+        //待付款金额环比
+        BigDecimal currentWaitPrice = currentDataSts.getWaitCollectedPrice();
+        BigDecimal lastWaitPrice = lastDataSts.getWaitCollectedPrice();
+        BigDecimal waitCollectedPriceRingRate = lastWaitPrice.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
+                (currentWaitPrice.subtract(lastWaitPrice)).divide(lastWaitPrice, 2, RoundingMode.HALF_UP);
+        res.setGoodsNumRingRate(goodsNumRingRate)
+                .setOrderAmountRingRate(orderAmountRingRate)
+                .setOrderPriceRingRate(orderPriceRingRate)
+                .setNotArrivedAmountRingRate(notArrivedAmountRingRate)
+                .setWaitCollectedPriceRingRate(waitCollectedPriceRingRate);
+        return res;
+    }
+
+    /**
+     * @desc: 获取订单统计信息
+     * @author: yzc
+     * @date: 2023-09-11 17:55
+     * @Param orderType:
+     * @Param unit:
+     * @Param start:
+     * @Param end:
+     * @return: com.sckw.report.model.dto.WorkbenchOrderStsDTO
+     */
+    private WorkbenchOrderStsDTO getOrderStsInfo(Integer orderType, String unit, Date start, Date end) {
+        WorkbenchOrderStsDTO dto = new WorkbenchOrderStsDTO();
+        Long entId = LoginUserHolder.getEntId();
+        String topEnt = Objects.equals(orderType, 1) ? "procureTopEntId" : "supplyTopEntId";
+        Criteria criteria = new Criteria();
+        criteria.and(topEnt).is(entId).and("status").nin(0, 2).and("delFlag").is(0);
+        if (StringUtils.isNotBlank(unit)) {
+            criteria.and("unit").is(unit);
+        }
+        if (Objects.nonNull(start)) {
+            criteria.and("createTime").gte(start);
+        }
+        if (Objects.nonNull(end)) {
+            criteria.and("createTime").lte(end);
+        }
+        Aggregation aggregation = Aggregation.newAggregation(
+                Aggregation.match(criteria),
+                Aggregation.group().sum("amount").as("orderAmount")
+                        .sum("price").as("orderPrice")
+                        .sum("actualAmount").as("orderActualAmount"));
+        AggregationResults<WorkbenchOrderStsDTO> aggregate =
+                mongoTemplate.aggregate(aggregation, SckwTradeOrder.class, WorkbenchOrderStsDTO.class);
+        List<WorkbenchOrderStsDTO> mappedResults = aggregate.getMappedResults();
+        if (CollectionUtils.isEmpty(mappedResults)) {
+            return dto;
+        }
+        return mappedResults.get(0);
+    }
+}