|
@@ -1,33 +1,38 @@
|
|
|
package com.sckw.report.service;
|
|
package com.sckw.report.service;
|
|
|
|
|
|
|
|
import com.sckw.core.common.enums.NumberConstant;
|
|
import com.sckw.core.common.enums.NumberConstant;
|
|
|
|
|
+import com.sckw.core.common.enums.enums.DictEnum;
|
|
|
|
|
+import com.sckw.core.common.enums.enums.DictTypeEnum;
|
|
|
|
|
+import com.sckw.core.utils.BeanUtils;
|
|
|
import com.sckw.core.utils.CollectionUtils;
|
|
import com.sckw.core.utils.CollectionUtils;
|
|
|
import com.sckw.core.utils.DateUtils;
|
|
import com.sckw.core.utils.DateUtils;
|
|
|
import com.sckw.core.utils.StringUtils;
|
|
import com.sckw.core.utils.StringUtils;
|
|
|
import com.sckw.core.web.context.LoginUserHolder;
|
|
import com.sckw.core.web.context.LoginUserHolder;
|
|
|
import com.sckw.mongo.model.SckwTradeOrder;
|
|
import com.sckw.mongo.model.SckwTradeOrder;
|
|
|
|
|
+import com.sckw.payment.api.dubbo.PaymentDubboService;
|
|
|
|
|
+import com.sckw.payment.api.model.dto.SettlementMoney;
|
|
|
import com.sckw.product.api.dubbo.GoodsStatisticsService;
|
|
import com.sckw.product.api.dubbo.GoodsStatisticsService;
|
|
|
import com.sckw.product.api.model.GoodsNumStsParam;
|
|
import com.sckw.product.api.model.GoodsNumStsParam;
|
|
|
import com.sckw.report.model.dto.WorkbenchOrderStsDTO;
|
|
import com.sckw.report.model.dto.WorkbenchOrderStsDTO;
|
|
|
import com.sckw.report.model.vo.TOrderDataStsResVO;
|
|
import com.sckw.report.model.vo.TOrderDataStsResVO;
|
|
|
import com.sckw.report.model.vo.WbTOrderDataStsParam;
|
|
import com.sckw.report.model.vo.WbTOrderDataStsParam;
|
|
|
import com.sckw.report.model.vo.WbTOrderDataStsResVO;
|
|
import com.sckw.report.model.vo.WbTOrderDataStsResVO;
|
|
|
|
|
+import com.sckw.report.model.vo.WorkbenchPurchaseVO;
|
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
|
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
|
|
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
|
|
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
|
|
|
import org.springframework.data.mongodb.core.query.Criteria;
|
|
import org.springframework.data.mongodb.core.query.Criteria;
|
|
|
|
|
+import org.springframework.data.mongodb.core.query.Query;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.Date;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.Objects;
|
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @desc: TODO
|
|
* @desc: TODO
|
|
@@ -43,6 +48,8 @@ public class KwOrderStatisticsService {
|
|
|
|
|
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
private GoodsStatisticsService goodsStatisticsService;
|
|
private GoodsStatisticsService goodsStatisticsService;
|
|
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
|
|
+ private PaymentDubboService paymentDubboService;
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -68,6 +75,9 @@ public class KwOrderStatisticsService {
|
|
|
GoodsNumStsParam goodsNumStsParam = new GoodsNumStsParam();
|
|
GoodsNumStsParam goodsNumStsParam = new GoodsNumStsParam();
|
|
|
goodsNumStsParam.setTopEntId(entId).setUnit(unit);
|
|
goodsNumStsParam.setTopEntId(entId).setUnit(unit);
|
|
|
Long currentGoodsNum = goodsStatisticsService.getOnShelfGoodsNum(goodsNumStsParam);
|
|
Long currentGoodsNum = goodsStatisticsService.getOnShelfGoodsNum(goodsNumStsParam);
|
|
|
|
|
+ //待付款金额
|
|
|
|
|
+ SettlementMoney settlement = Objects.equals(orderType, 1) ?
|
|
|
|
|
+ paymentDubboService.countPurchase(entId, dateType) : paymentDubboService.countSell(entId, dateType);
|
|
|
//订单统计
|
|
//订单统计
|
|
|
WorkbenchOrderStsDTO currentOrderSts = getOrderStsInfo(orderType, unit, currentStart, null);
|
|
WorkbenchOrderStsDTO currentOrderSts = getOrderStsInfo(orderType, unit, currentStart, null);
|
|
|
BigDecimal currentAmount = BigDecimal.valueOf(currentOrderSts.getOrderAmount());
|
|
BigDecimal currentAmount = BigDecimal.valueOf(currentOrderSts.getOrderAmount());
|
|
@@ -76,8 +86,8 @@ public class KwOrderStatisticsService {
|
|
|
.setGoodsNum(currentGoodsNum)
|
|
.setGoodsNum(currentGoodsNum)
|
|
|
.setOrderAmount(currentAmount)
|
|
.setOrderAmount(currentAmount)
|
|
|
.setOrderPrice(currentPrice)
|
|
.setOrderPrice(currentPrice)
|
|
|
|
|
+ .setWaitCollectedPrice(new BigDecimal(settlement.getCurrent()))
|
|
|
.setNotArrivedAmount(currentAmount.subtract(BigDecimal.valueOf(currentOrderSts.getOrderActualAmount())));
|
|
.setNotArrivedAmount(currentAmount.subtract(BigDecimal.valueOf(currentOrderSts.getOrderActualAmount())));
|
|
|
- //todo 待付款金额
|
|
|
|
|
list.add(currentDataSts);
|
|
list.add(currentDataSts);
|
|
|
|
|
|
|
|
//上周/上月数据
|
|
//上周/上月数据
|
|
@@ -93,45 +103,27 @@ public class KwOrderStatisticsService {
|
|
|
.setGoodsNum(lastGoodsNum)
|
|
.setGoodsNum(lastGoodsNum)
|
|
|
.setOrderAmount(lastAmount)
|
|
.setOrderAmount(lastAmount)
|
|
|
.setOrderPrice(lastPrice)
|
|
.setOrderPrice(lastPrice)
|
|
|
|
|
+ .setWaitCollectedPrice(new BigDecimal(settlement.getBefore()))
|
|
|
.setNotArrivedAmount(lastAmount.subtract(BigDecimal.valueOf(lastOrderSts.getOrderActualAmount())));
|
|
.setNotArrivedAmount(lastAmount.subtract(BigDecimal.valueOf(lastOrderSts.getOrderActualAmount())));
|
|
|
- //todo 待付款金额
|
|
|
|
|
list.add(lastDataSts);
|
|
list.add(lastDataSts);
|
|
|
res.setTOrderDataStsList(list);
|
|
res.setTOrderDataStsList(list);
|
|
|
- //环比数据
|
|
|
|
|
//商品数量环比
|
|
//商品数量环比
|
|
|
- BigDecimal goodsNumRingRate = Objects.isNull(lastGoodsNum) || lastGoodsNum == 0L ? NumberConstant.ONE_HUNDRED :
|
|
|
|
|
- new BigDecimal((currentGoodsNum - lastGoodsNum)).multiply(NumberConstant.ONE_HUNDRED)
|
|
|
|
|
- .divide(new BigDecimal(lastGoodsNum), 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal goodsNumRingRate = getRingRate(new BigDecimal(currentGoodsNum), new BigDecimal(lastGoodsNum));
|
|
|
boolean goodsNumFlag = goodsNumRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
boolean goodsNumFlag = goodsNumRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
|
goodsNumRingRate = goodsNumRingRate.abs();
|
|
goodsNumRingRate = goodsNumRingRate.abs();
|
|
|
//订单总量环比
|
|
//订单总量环比
|
|
|
- BigDecimal orderAmountRingRate = lastAmount.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
|
|
|
|
|
- (currentAmount.subtract(lastAmount)).multiply(NumberConstant.ONE_HUNDRED)
|
|
|
|
|
- .divide(lastAmount, 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal orderAmountRingRate = getRingRate(currentAmount, lastAmount);
|
|
|
boolean orderAmountFlag = orderAmountRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
boolean orderAmountFlag = orderAmountRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
|
orderAmountRingRate = orderAmountRingRate.abs();
|
|
orderAmountRingRate = orderAmountRingRate.abs();
|
|
|
//订单总金额环比
|
|
//订单总金额环比
|
|
|
- BigDecimal orderPriceRingRate = lastPrice.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
|
|
|
|
|
- (currentPrice.subtract(lastPrice)).multiply(NumberConstant.ONE_HUNDRED)
|
|
|
|
|
- .divide(lastPrice, 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal orderPriceRingRate = getRingRate(currentPrice, lastPrice);
|
|
|
boolean orderPriceFlag = orderPriceRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
boolean orderPriceFlag = orderPriceRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
|
orderPriceRingRate = orderPriceRingRate.abs();
|
|
orderPriceRingRate = orderPriceRingRate.abs();
|
|
|
//未到货量环比
|
|
//未到货量环比
|
|
|
- BigDecimal currentNotArrived = currentDataSts.getNotArrivedAmount();
|
|
|
|
|
- BigDecimal lastNotArrived = lastDataSts.getNotArrivedAmount();
|
|
|
|
|
- BigDecimal notArrivedAmountRingRate = lastNotArrived.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
|
|
|
|
|
- (currentNotArrived.subtract(lastNotArrived)).multiply(NumberConstant.ONE_HUNDRED)
|
|
|
|
|
- .divide(lastNotArrived, 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
+ BigDecimal notArrivedAmountRingRate = getRingRate(currentDataSts.getNotArrivedAmount(), lastDataSts.getNotArrivedAmount());
|
|
|
boolean notArrivedAmountFlag = notArrivedAmountRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
boolean notArrivedAmountFlag = notArrivedAmountRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
|
notArrivedAmountRingRate = notArrivedAmountRingRate.abs();
|
|
notArrivedAmountRingRate = notArrivedAmountRingRate.abs();
|
|
|
- //待付款金额环比
|
|
|
|
|
- BigDecimal currentWaitPrice = currentDataSts.getWaitCollectedPrice();
|
|
|
|
|
- BigDecimal lastWaitPrice = lastDataSts.getWaitCollectedPrice();
|
|
|
|
|
- BigDecimal waitCollectedPriceRingRate = lastWaitPrice.compareTo(BigDecimal.ZERO) == 0 ? NumberConstant.ONE_HUNDRED :
|
|
|
|
|
- (currentWaitPrice.subtract(lastWaitPrice)).multiply(NumberConstant.ONE_HUNDRED)
|
|
|
|
|
- .divide(lastWaitPrice, 2, RoundingMode.HALF_UP);
|
|
|
|
|
- boolean waitCollectedPriceFlag = waitCollectedPriceRingRate.compareTo(BigDecimal.ZERO) >= 0;
|
|
|
|
|
- waitCollectedPriceRingRate = waitCollectedPriceRingRate.abs();
|
|
|
|
|
|
|
+
|
|
|
res.setGoodsNumRingRate(goodsNumRingRate)
|
|
res.setGoodsNumRingRate(goodsNumRingRate)
|
|
|
.setGoodsNumFlag(goodsNumFlag)
|
|
.setGoodsNumFlag(goodsNumFlag)
|
|
|
.setOrderAmountRingRate(orderAmountRingRate)
|
|
.setOrderAmountRingRate(orderAmountRingRate)
|
|
@@ -140,8 +132,18 @@ public class KwOrderStatisticsService {
|
|
|
.setOrderPriceFlag(orderPriceFlag)
|
|
.setOrderPriceFlag(orderPriceFlag)
|
|
|
.setNotArrivedAmountRingRate(notArrivedAmountRingRate)
|
|
.setNotArrivedAmountRingRate(notArrivedAmountRingRate)
|
|
|
.setNotArrivedAmountFlag(notArrivedAmountFlag)
|
|
.setNotArrivedAmountFlag(notArrivedAmountFlag)
|
|
|
- .setWaitCollectedPriceRingRate(waitCollectedPriceRingRate)
|
|
|
|
|
- .setWaitCollectedPriceFlag(waitCollectedPriceFlag);
|
|
|
|
|
|
|
+ .setWaitCollectedPriceRingRate(new BigDecimal(settlement.getPercent().replace("%", "")))
|
|
|
|
|
+ .setWaitCollectedPriceFlag(Objects.equals(settlement.getFlag(), 1));
|
|
|
|
|
+ return res;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private BigDecimal getRingRate(BigDecimal current, BigDecimal last) {
|
|
|
|
|
+ BigDecimal res;
|
|
|
|
|
+ if (last.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
|
+ res = (current.subtract(last)).compareTo(BigDecimal.ZERO) != 0 ? NumberConstant.ONE_HUNDRED : BigDecimal.ZERO;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ res = (current.subtract(last)).multiply(NumberConstant.ONE_HUNDRED).divide(last, 2, RoundingMode.HALF_UP);
|
|
|
|
|
+ }
|
|
|
return res;
|
|
return res;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -184,4 +186,34 @@ public class KwOrderStatisticsService {
|
|
|
}
|
|
}
|
|
|
return mappedResults.get(0);
|
|
return mappedResults.get(0);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @desc: 工作台采购订单列表
|
|
|
|
|
+ * @author: yzc
|
|
|
|
|
+ * @date: 2023-09-13 19:37
|
|
|
|
|
+ * @return: java.util.List<com.sckw.report.model.vo.WorkbenchPurchaseVO>
|
|
|
|
|
+ */
|
|
|
|
|
+ public List<WorkbenchPurchaseVO> workbenchPurchaseList() {
|
|
|
|
|
+ Long entId = LoginUserHolder.getEntId();
|
|
|
|
|
+ Criteria criteria = new Criteria();
|
|
|
|
|
+ criteria.and("procureTopEntId").is(entId)
|
|
|
|
|
+ .and("status").nin(0, 2, 7)
|
|
|
|
|
+ .and("delFlag").is(0);
|
|
|
|
|
+ Query query = new Query();
|
|
|
|
|
+ query.addCriteria(criteria)
|
|
|
|
|
+ .with(Sort.by(Sort.Direction.DESC, "createTime"))
|
|
|
|
|
+ .limit(10);
|
|
|
|
|
+ List<SckwTradeOrder> orders = mongoTemplate.find(query, SckwTradeOrder.class);
|
|
|
|
|
+ if (CollectionUtils.isEmpty(orders)) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ List<WorkbenchPurchaseVO> result = new ArrayList<>();
|
|
|
|
|
+ orders.forEach(e -> {
|
|
|
|
|
+ WorkbenchPurchaseVO vo = BeanUtils.copyProperties(e, WorkbenchPurchaseVO.class);
|
|
|
|
|
+ vo.setUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), e.getUnit()))
|
|
|
|
|
+ .setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), e.getGoodsType()));
|
|
|
|
|
+ result.add(vo);
|
|
|
|
|
+ });
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|