Selaa lähdekoodia

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

lengfaqiang 2 vuotta sitten
vanhempi
commit
8b7a6d373a

+ 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() {
     }
 }

+ 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;
+
+}

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TransportDemandSquaresListRes.java

@@ -96,4 +96,9 @@ public class TransportDemandSquaresListRes implements Serializable {
      */
     private String phone;
 
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
 }

+ 2 - 0
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;
@@ -428,6 +429,7 @@ 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);
         });

+ 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);
+    }
+}