Переглянути джерело

盲票实时毛利、终极毛利后台展示

zhangkaikai 1 рік тому
батько
коміт
8d198730d4
18 змінених файлів з 468 додано та 33 видалено
  1. 107 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java
  2. 115 6
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  3. 8 0
      mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java
  4. 34 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxGrossProfitParam.java
  5. 17 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxGrossProfitVO.java
  6. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java
  7. 6 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java
  8. 31 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserHitPrizeVO.java
  9. 3 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserPrizeStorageVO.java
  10. 5 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserPrizeStorageMapper.java
  11. 11 4
      mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java
  12. 5 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserPrizeStorageService.java
  13. 13 11
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  14. 10 3
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java
  15. 15 5
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  16. 1 1
      mp-service/src/main/resources/mapper/user/UserCouponMapper.xml
  17. 18 0
      mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml
  18. 63 0
      mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

+ 107 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/IndexMgrController.java

@@ -7,19 +7,24 @@ import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.IndexTicketSiteTopQueryParam;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelCommission;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.service.IChannelCommissionService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.utils.DateUtils;
-import com.qs.mp.user.domain.UserTicketOrder;
-import com.qs.mp.user.service.IUserTicketOrderService;
-import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.user.domain.*;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
+import com.qs.mp.user.service.*;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,7 +54,50 @@ public class IndexMgrController extends BaseApiController {
 	@Autowired
 	private IChannelOrderService channelOrderService;
 
+	@Autowired
+	private IChannelCommissionService commissionService;
+
+	@Autowired
+	private IUserPrizeStorageService userPrizeStorageService;
+
+	@Autowired
+	private IUserCouponService  userCouponService;
+
+	@Autowired
+	private IUserCoinLogService userCoinLogService;
+
+	/**
+	 * 查询实时毛利
+	 *
+	 */
+	@PostMapping("/pay/gross")
+	public AjaxResult  listPayGrossData(@RequestBody IndexQueryParam indeQueryParam) {
+		IndexQueryParam queryParam = getQueryParam(indeQueryParam);
 
+		List<IndexVO> list = new ArrayList<IndexVO>();
+		List<IndexVO> channelOrderTodayList = new ArrayList<>();
+
+		QueryWrapper<UserTicketOrder> queryWrapper1 = new QueryWrapper<>();
+		queryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		queryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		queryWrapper1.gt("t1.`status`", 0);
+		list = userTicketOrderService.selectIndexDailyInfoList(queryWrapper1);
+
+		QueryWrapper<ChannelOrder> channelOrderQueryWrapper1 = new QueryWrapper<>();
+		channelOrderQueryWrapper1.ge(null != queryParam && null != queryParam.getStartTime(), "t1.created_time", queryParam.getStartTime());
+		channelOrderQueryWrapper1.le(null != queryParam && null != queryParam.getEndTime(), "t1.created_time", queryParam.getEndTime());
+		channelOrderQueryWrapper1.gt("t1.`status`", 0);
+		channelOrderQueryWrapper1.gt("t1.type" , 1);
+		channelOrderTodayList = channelOrderService.selectIndexChannelOrderDailyInfoList(channelOrderQueryWrapper1);
+		list = addPrePayOrderInfo(list, channelOrderTodayList);
+		for (IndexVO indexVO : list) {
+			IndexQueryParam queryParam1 = new IndexQueryParam();
+			queryParam1.setStartTime(DateUtils.parseStrToDate(indexVO.getTime(),DateUtils.YYYYMMDD));
+			queryParam1.setEndTime(DateUtils.getEndTimeOfNow(queryParam1.getStartTime()));
+			indexVO.setPayAmt(indexVO.getPayAmt() - handelCost(queryParam1));
+		}
+		return  AjaxResult.success(getPayAmtList(list, queryParam));
+	}
 
 	/**
 	 * 查询统计交易金额
@@ -622,18 +670,25 @@ public class IndexMgrController extends BaseApiController {
 	@SuppressWarnings("unused")
 	private Map<String,Object> calcDailyInfoData(List<IndexVO> todayList, List<IndexVO> yetodayList,  List<IndexVO> todaySiteList, List<IndexVO> yetodaySiteList){
 		Map<String,Object> payAmt = new HashMap<String,Object>();
+		Map<String,Object> realPayAmt = new HashMap<String,Object>();
 		Map<String,Object> payUser = new HashMap<String,Object>();
 		Map<String,Object> ticketNum = new HashMap<String,Object>();
 		Map<String,Object> newSite = new HashMap<String,Object>();
 
 		String today = DateUtils.parseDateToStr(DateUtils.YYYYMMDD,new Date());
 
+		IndexQueryParam queryParam = new IndexQueryParam();
+		queryParam.setStartTime(DateUtils.getPreDayOfNowZero(0));  // 今天0点
+		queryParam.setEndTime(new Date());  // 今天
+
 		int todayPayAmt = 0;
+		int realTodayPayAmt = 0;
 		int todayPayUserCnt = 0;
 		int todayTicketNum = 0;
 		int todayNewSiteCnt = 0;
 
 		int yesterdayPayAmt = 0;
+		int realYesterdayPayAmt = 0;
 		int yesterdayPayUserCnt = 0;
 		int yesterdayTicketNum = 0;
 		int yesterdayNewSiteCnt = 0;
@@ -649,6 +704,11 @@ public class IndexMgrController extends BaseApiController {
 			}
 		}
 
+		Integer todayCost = handelCost(queryParam);
+
+		realTodayPayAmt = todayPayAmt - todayCost;
+
+
 		if(null != yetodayList && yetodayList.size() > 0) {
 			for(IndexVO indexVo : yetodayList) {
 				if(null != indexVo) {
@@ -659,6 +719,12 @@ public class IndexMgrController extends BaseApiController {
 			}
 		}
 
+		// 昨天
+		queryParam.setStartTime(DateUtils.getPreDayOfNowZero(1));  // 昨天0点
+		queryParam.setEndTime(DateUtils.getPreDayOfNow(1));  // 今天减去24小时
+		Integer yesterdayCost = handelCost(queryParam);
+		realYesterdayPayAmt = yesterdayPayAmt - yesterdayCost;
+
 		if(null != todaySiteList && todaySiteList.size() > 0) {
 			for(IndexVO indexVo : todaySiteList) {
 				if(null != indexVo
@@ -679,6 +745,8 @@ public class IndexMgrController extends BaseApiController {
 
 		payAmt.put("today", todayPayAmt);
 		payAmt.put("yesterday", yesterdayPayAmt);
+		realPayAmt.put("realTodayPayAmt", realTodayPayAmt);
+		realPayAmt.put("realYesterdayPayAmt", realYesterdayPayAmt);
 		payUser.put("today", todayPayUserCnt);
 		payUser.put("yesterday", yesterdayPayUserCnt);
 		ticketNum.put("today", todayTicketNum);
@@ -688,12 +756,48 @@ public class IndexMgrController extends BaseApiController {
 
 		Map<String,Object> map = new HashMap<String,Object>();
 		map.put("payAmt", payAmt);
+		map.put("realPayAmt", realPayAmt);
 		map.put("payUser", payUser);
 		map.put("ticketNum", ticketNum);
 		map.put("newSite", newSite);
 		return map;
 	}
 
+	private Integer handelCost(IndexQueryParam queryParam) {
+		// 佣金成本
+		List<ChannelCommission> commissions = commissionService.list(new QueryWrapper<ChannelCommission>()
+				.between(null != queryParam.getStartTime() && null != queryParam.getEndTime(),"created_time", queryParam.getStartTime(), queryParam.getEndTime()));
+		int commAmt = 0;
+		if (CollectionUtils.isNotEmpty(commissions)) {
+			commAmt = commissions.stream().mapToInt(ChannelCommission::getCommAmt).sum();
+		}
+
+		// 奖品普通商品成本和盲票关联商品成本
+		List<UserPrizeStorageVO> allPrizeStorageGoodsList = userPrizeStorageService.listAllPrizeStorageGoodsCost(
+				new QueryWrapper<UserPrizeStorage>().in("t1.in_type", PrizeStorageInTypeEnum.TICKET_CASHED.getValue(), PrizeStorageInTypeEnum.TICKET_GOODS.getValue())
+						.eq("t1.status", PrizeStorageStatusEnum.HAS_DISTRIBUTED.getValue())
+						.between(null != queryParam.getStartTime() && null != queryParam.getEndTime(), "t1.created_time", queryParam.getStartTime(), queryParam.getEndTime()));
+		int allPrizeStorageGoodsCost = allPrizeStorageGoodsList.stream().mapToInt(UserPrizeStorageVO::getCost).sum();
+
+		// 奖品优惠劵成本
+		List<UserCouponVO> userCouponVOS = userCouponService.listUserCouponVO(
+				new QueryWrapper<UserCoupon>().eq("t1.status", UserCouponStatusEnum.USED)
+						.between(null != queryParam.getStartTime() && null != queryParam.getEndTime(), "t1.created_time", queryParam.getStartTime(), queryParam.getEndTime()));
+		AtomicReference<Integer> couponCost = new AtomicReference<>(0);
+		userCouponVOS.forEach(u -> {
+			if (CouponTypeEnum.SITE_CONSUME.equals(u.getType())) {
+				couponCost.updateAndGet(v1 -> v1 + u.getDiscount() * (100 - u.getChannelSharedRate()) / 100);
+			}
+		});
+
+		// 盲豆成本
+		List<UserCoinLog> userCoins = userCoinLogService.list(
+				new QueryWrapper<UserCoinLog>().between(null != queryParam.getStartTime() && null != queryParam.getEndTime(), "created_time", queryParam.getStartTime(), queryParam.getEndTime()));
+		int userCoinCost = userCoins.stream().filter(c -> c.getLogMoney() > 0 && c.getType().getValue().equals(CoinLogTypeEnum.PRIZE.getValue())).mapToInt(UserCoinLog::getLogMoney).sum() * 10;
+
+		return commAmt + allPrizeStorageGoodsCost + couponCost.get() + userCoinCost;
+	}
+
 	/**
 	 * 查询统计统计票组销售TOP10
 	 * @return

+ 115 - 6
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -10,13 +10,13 @@ import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
 import com.qs.mp.admin.domain.*;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.*;
-import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
-import com.qs.mp.admin.domain.vo.TicketAwardsVO;
-import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.*;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelCommission;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.service.IChannelCommissionService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelService;
@@ -27,12 +27,19 @@ import com.qs.mp.common.enums.*;
 import com.qs.mp.common.pulsar.PulsarClientService;
 import com.qs.mp.common.utils.AESUtil;
 import com.qs.mp.common.utils.RSAUtil;
+import com.qs.mp.user.domain.UserHitPrize;
+import com.qs.mp.user.domain.UserPrizeStorage;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.domain.vo.UserHitPrizeVO;
+import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
+import com.qs.mp.user.service.IUserPrizeStorageService;
+import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.*;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
@@ -87,6 +94,27 @@ public class TicketBoxMgrController extends BaseApiController {
     @Autowired
     private IChannelOrderService channelOrderService;
 
+    @Autowired
+    private IUserTicketOrderService userTicketOrderService;
+
+    @Autowired
+    private ICouponService couponService;
+
+    @Autowired
+    private ICouponPkgItemService couponPkgItemService;
+
+    @Autowired
+    private IChannelCommissionService commissionService;
+
+    @Autowired
+    private IUserPrizeStorageService userPrizeStorageService;
+
+    @Autowired
+    private IGoodsService goodsService;
+
+    @Autowired
+    private IPrizeRecoveryService  prizeRecoveryService;
+
     @Value("${mp.exportUrl}")
     private String exportUrl;
 
@@ -126,9 +154,89 @@ public class TicketBoxMgrController extends BaseApiController {
         }
         queryWrapper.orderByAsc("FIELD(`status`, 'wait', 'doing', 'done', 'on', 'off','stop')").orderByDesc("box_id");
         List<TicketBox> list = ticketBoxService.list(queryWrapper);
+        for (TicketBox ticketBox : list) {
+            handleRealTimeGrossProfitAndFinalGrossProfit(ticketBox);
+        }
         return getDataTable(list);
     }
 
+    private void handleRealTimeGrossProfitAndFinalGrossProfit(TicketBox box) {
+        TicketBoxGrossProfitParam ticketBoxGrossProfitParam = new TicketBoxGrossProfitParam();
+        ticketBoxGrossProfitParam.setBoxId(box.getBoxId());
+        ticketBoxGrossProfitParam.setTicketOrderStatus(0);
+        ticketBoxGrossProfitParam.setChannelOrderStatus(0);
+        ticketBoxGrossProfitParam.setChannelOrderType(1);
+        TicketBoxGrossProfitVO boxGrossProfit = userTicketOrderService.selectTicketBoxGrossProfitByTicketOrderAndChannelOrder(ticketBoxGrossProfitParam);
+        // 佣金成本
+        List<ChannelCommission> commissions = commissionService.list(new QueryWrapper<ChannelCommission>().eq("box_id", box.getBoxId()));
+        int commAmt = 0;
+        if (CollectionUtils.isNotEmpty(commissions)) {
+            commAmt = commissions.stream().mapToInt(ChannelCommission::getCommAmt).sum();
+        }
+        // 奖品成本
+        List<UserHitPrizeVO> userhitPrizeVOList = userTicketOrderService.listUserHitPrize(
+                new QueryWrapper<UserTicketOrder>()
+                        .eq("t2.box_id", box.getBoxId())
+                        .gt("t2.status", 0)
+        );
+        // 普通商品奖品
+        List<String> userHitPrizeIdList = userhitPrizeVOList.stream().filter(v -> TicketPrizeTypeEnum.GOODS.equals(v.getPrizeType())).map(UserHitPrize::getId).collect(Collectors.toList());
+        List<UserPrizeStorageVO> userPrizeStorageVOList = new ArrayList<>();
+        for (String userHitPrizeId : userHitPrizeIdList) {
+            List<UserPrizeStorageVO> prizeStorageVOS = userPrizeStorageService.listGoodsPrizeCost(new QueryWrapper<UserHitPrize>().eq("t1.ref_id", userHitPrizeId));
+            userPrizeStorageVOList.addAll(prizeStorageVOS);
+        }
+        // 未提货的奖品价值总和
+        int notDistributedPrizeGoodsCost = userPrizeStorageVOList.stream().filter(v -> PrizeStorageStatusEnum.NOT_DISTRIBUTED.equals(v.getStatus())).mapToInt(UserPrizeStorageVO::getCost).sum();
+        // 已提货的奖品价值总和
+        int hasDistributedPrizeGoodsCost = userPrizeStorageVOList.stream().filter(v -> PrizeStorageStatusEnum.HAS_DISTRIBUTED.equals(v.getStatus())).mapToInt(UserPrizeStorageVO::getCost).sum();
+        // 回收奖品价值总和(转换成盲豆)
+        int recoveryGoodsCost = 0;
+        List<String> storageIdList = userPrizeStorageVOList.stream().filter(v -> PrizeStorageStatusEnum.RECOVERY.equals(v.getStatus())).map(UserPrizeStorage::getStorageId).collect(Collectors.toList());
+        for (String storageId : storageIdList) {
+            PrizeRecovery prizeRecovery = prizeRecoveryService.getOne(new QueryWrapper<PrizeRecovery>().eq("storage_id", storageId));
+            recoveryGoodsCost += prizeRecovery.getReturnCoin() * 10;
+        }
+
+        // 优惠劵奖品
+        List<UserHitPrizeVO> userHitPrizeCouponVOList = userhitPrizeVOList.stream().filter(v -> TicketPrizeTypeEnum.COUPON.equals(v.getPrizeType())).collect(Collectors.toList());
+        AtomicReference<Integer> couponCost = new AtomicReference<>(0);
+        userHitPrizeCouponVOList.forEach(v -> {
+            Coupon coupon = couponService.getById(v.getRefId());
+            if (CouponTypeEnum.SITE_CONSUME.equals(coupon.getType())) {
+                // 指定门店消费优惠劵
+                couponCost.updateAndGet(v1 -> v1 + coupon.getDiscount() * (100 - coupon.getChannelSharedRate()) / 100);
+            }
+        });
+        List<UserHitPrizeVO> userHitPrizeCouponPkgVOList = userhitPrizeVOList.stream().filter(v -> TicketPrizeTypeEnum.COUPON_PKG.equals(v.getPrizeType())).collect(Collectors.toList());
+        userHitPrizeCouponPkgVOList.forEach(v -> {
+            List<Coupon> couponList = couponPkgItemService.listCouponByPkgId(v.getRefId());
+            for (Coupon coupon : couponList) {
+                if (CouponTypeEnum.SITE_CONSUME.equals(coupon.getType())) {
+                    // 卷包内有门店消费优惠劵
+                    couponCost.updateAndGet(v1 -> (v1 + coupon.getDiscount() * (100 - coupon.getChannelSharedRate()) / 100));
+                } else {
+                    couponCost.updateAndGet(v1 -> (v1 + coupon.getDiscount()));
+                }
+            }
+        });
+
+        // 盲豆奖品
+        AtomicReference<Integer> coinCost = new AtomicReference<>(0);
+        List<UserHitPrizeVO> userHitPrizeCoinVOList = userhitPrizeVOList.stream().filter(v -> TicketPrizeTypeEnum.COIN.equals(v.getPrizeType())).collect(Collectors.toList());
+        userHitPrizeCoinVOList.forEach(v -> coinCost.updateAndGet(v1 -> v1 + v.getValue() * 10));
+
+        // 盲票关联商品成本
+        int ticketBoxGodsCost = 0;
+        List<TicketBoxGoodsVO> ticketBoxGoodsVOS = ticketBoxGoodsService.listByQueryWrapper(new QueryWrapper<TicketBoxGoods>().eq("box_id", box.getBoxId()));
+        if (CollectionUtils.isNotEmpty(ticketBoxGoodsVOS)) {
+            ticketBoxGodsCost += ticketBoxGoodsVOS.get(0).getCost() * userhitPrizeVOList.size();
+        }
+        Integer payAmt = boxGrossProfit != null ? boxGrossProfit.getPayAmt() : 0;
+        box.setRealTimeGrossProfit(payAmt - commAmt - hasDistributedPrizeGoodsCost - recoveryGoodsCost - couponCost.get() - coinCost.get() - ticketBoxGodsCost);
+        box.setFinalGrossProfit(payAmt - commAmt - notDistributedPrizeGoodsCost - hasDistributedPrizeGoodsCost - recoveryGoodsCost - couponCost.get() - coinCost.get() - ticketBoxGodsCost);
+    }
+
     @PostMapping("/update")
     @PreAuthorize("@ss.hasPermi('business:ticket:edit')")
     @ApiOperation("更新盲票信息")
@@ -163,6 +271,7 @@ public class TicketBoxMgrController extends BaseApiController {
             return AjaxResult.error("参数异常,盲票组ID缺失");
         }
         TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+        handleRealTimeGrossProfitAndFinalGrossProfit(ticketBox);
         TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
 
         // 设置关联商品信息

+ 8 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/TicketBox.java

@@ -231,6 +231,14 @@ public class TicketBox implements Serializable {
   @Version
   private Date updatedTime;
 
+  @ApiModelProperty("实时毛利")
+  @TableField(exist = false)
+  private Integer realTimeGrossProfit;
+
+  @ApiModelProperty("终极毛利")
+  @TableField(exist = false)
+  private Integer finalGrossProfit;
+
 
   @ApiModelProperty("预付票包价格")
   public Integer getPkgPrePrice() {

+ 34 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/TicketBoxGrossProfitParam.java

@@ -0,0 +1,34 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-26 3:14 PM
+ **/
+
+@ApiModel("查询毛利参数")
+@Data
+public class TicketBoxGrossProfitParam {
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("盲票订单状态")
+    private Integer ticketOrderStatus;
+
+    @ApiModelProperty("经销商订单状态")
+    private Integer channelOrderStatus;
+
+    @ApiModelProperty("经销商订单类型")
+    private Integer channelOrderType;
+
+    @ApiModelProperty(value = "自定义开始时间",required=false)
+    private Date startTime;
+
+    @ApiModelProperty(value = "自定义截止时间",required=false)
+    private Date endTime;
+}

+ 17 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxGrossProfitVO.java

@@ -0,0 +1,17 @@
+package com.qs.mp.admin.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-26 3:21 PM
+ **/
+@Data
+@ApiModel("盲票毛利")
+public class TicketBoxGrossProfitVO {
+
+    @ApiModelProperty("利润")
+    private Integer payAmt;
+}

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/TicketBoxVO.java

@@ -44,6 +44,12 @@ public class TicketBoxVO extends TicketBox {
   @ApiModelProperty("经销商分佣百分比")
   private BigDecimal channelCommRate;
 
+  @ApiModelProperty("实时毛利")
+  private Integer realTimeGrossProfit;
+
+  @ApiModelProperty("终极毛利")
+  private Integer finalGrossProfit;
+
   @ApiModelProperty("分佣金额")
   public Integer getSaleCommPrice() {
     if (Objects.isNull(super.getSaleCommRate()) || Objects.isNull(super.getSalePrice()) || Objects.isNull(this.channelCommRate)) {

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java

@@ -100,5 +100,11 @@ public class UserCouponVO extends UserCoupon {
     @ApiModelProperty("关联门店总数")
     private Integer channelTotal;
 
+    /**
+     * 渠道代金券,渠道承担比例
+     */
+    @ApiModelProperty("渠道代金券,渠道承担比例")
+    private Integer channelSharedRate;
+
 
 }

+ 31 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserHitPrizeVO.java

@@ -0,0 +1,31 @@
+package com.qs.mp.user.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
+import com.qs.mp.user.domain.UserHitPrize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-31 6:00 PM
+ **/
+@ApiModel("用户中奖信息")
+@Data
+public class UserHitPrizeVO extends UserHitPrize {
+
+    @ApiModelProperty("奖品类型 1 实物商品 2优惠券 3平台代币")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private TicketPrizeTypeEnum prizeType;
+
+    @ApiModelProperty("奖品价值")
+    private Integer value;
+
+    @ApiModelProperty("中奖奖品所属票组")
+    private String boxId;
+
+    @ApiModelProperty("关联id,goodsId,couponId")
+    private String refId;
+}

+ 3 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserPrizeStorageVO.java

@@ -37,4 +37,7 @@ public class UserPrizeStorageVO extends UserPrizeStorage {
 
     @ApiModelProperty("回收开关")
     private boolean recovery = false;
+
+    @ApiModelProperty("商品成本")
+    private Integer cost;
 }

+ 5 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserPrizeStorageMapper.java

@@ -2,6 +2,7 @@ package com.qs.mp.user.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
@@ -22,4 +23,8 @@ public interface UserPrizeStorageMapper extends BaseMapper<UserPrizeStorage> {
      * @return
      */
     List<UserPrizeStorageVO> listByQueryWrapper(@Param(Constants.WRAPPER) QueryWrapper<UserPrizeStorage> queryWrapper);
+
+    List<UserPrizeStorageVO> listGoodsPrizeCost(@Param(Constants.WRAPPER) QueryWrapper<UserHitPrize> queryWrapper);
+
+    List<UserPrizeStorageVO> listAllPrizeStorageGoodsCost(@Param(Constants.WRAPPER) QueryWrapper<UserPrizeStorage> queryWrapper);
 }

+ 11 - 4
mp-service/src/main/java/com/qs/mp/user/mapper/UserTicketOrderMapper.java

@@ -3,16 +3,15 @@ package com.qs.mp.user.mapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.IndexTicketSiteTopQueryParam;
-import com.qs.mp.admin.domain.vo.IndexVO;
-import com.qs.mp.admin.domain.vo.TicketCntVO;
-import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
-import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
+import com.qs.mp.admin.domain.param.TicketBoxGrossProfitParam;
+import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 
 import java.util.List;
 
+import com.qs.mp.user.domain.vo.UserHitPrizeVO;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -119,4 +118,12 @@ public interface UserTicketOrderMapper extends BaseMapper<UserTicketOrder> {
     List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(@Param("param") IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam);
 
     long getPromoterTicketSaleCnt(@Param("channelNo") String channelNo,@Param("days") int days);
+
+	TicketBoxGrossProfitVO selectTicketBoxGrossProfitByTicketOrderAndChannelOrder(@Param("param") TicketBoxGrossProfitParam ticketBoxGrossProfitParam);
+
+	List<TicketAwardsPrizeVO> listPrizeCost(QueryWrapper<UserTicketOrder> queryWrapper);
+
+	List<UserHitPrizeVO> listUserHitPrize(@Param(Constants.WRAPPER) QueryWrapper<UserTicketOrder> queryWrapper);
+
+	List<IndexVO> selectTicketBoxGrossProfitByTicketOrderAndChannelOrderDaily(TicketBoxGrossProfitParam param);
 }

+ 5 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserPrizeStorageService.java

@@ -3,6 +3,7 @@ package com.qs.mp.user.service;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
+import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
@@ -34,4 +35,8 @@ public interface IUserPrizeStorageService extends IService<UserPrizeStorage> {
    * @return
    */
   List<UserPrizeStorageVO> listByQueryWrapper(QueryWrapper<UserPrizeStorage> queryWrapper);
+
+  List<UserPrizeStorageVO> listGoodsPrizeCost(QueryWrapper<UserHitPrize> queryWrapper);
+
+  List<UserPrizeStorageVO> listAllPrizeStorageGoodsCost(QueryWrapper<UserPrizeStorage> queryWrapper);
 }

+ 13 - 11
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -3,25 +3,17 @@ package com.qs.mp.user.service;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.IndexTicketSiteTopQueryParam;
-import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
-import com.qs.mp.admin.domain.vo.IndexVO;
-import com.qs.mp.admin.domain.vo.TicketCntVO;
-import com.qs.mp.admin.domain.vo.UserTicketOrderDetailVO;
-import com.qs.mp.admin.domain.vo.UserTicketOrderListVO;
-import com.qs.mp.channel.domain.ChannelOrder;
-import com.qs.mp.channel.domain.ChannelOrderDetail;
+import com.qs.mp.admin.domain.param.TicketBoxGrossProfitParam;
+import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.pay.domain.PayOrder;
-import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserHitPrizeVO;
 import com.qs.mp.user.domain.vo.UserShareVO;
 import java.util.List;
 
-import org.apache.ibatis.annotations.Param;
-
 /**
  * <p>
  * 用户盲票订单 服务类
@@ -175,4 +167,14 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
     List<IndexVO> selectIndexTicketSiteTopByTicketOrderAndChannelOrder(IndexTicketSiteTopQueryParam indexTicketSiteTopQueryParam);
 
     long getPromoterTicketSaleCnt(String channelNo, Integer days);
+
+    /**
+     * 统计某组票毛利
+     * @param ticketBoxGrossProfitParam
+     * @return
+     */
+    TicketBoxGrossProfitVO selectTicketBoxGrossProfitByTicketOrderAndChannelOrder(TicketBoxGrossProfitParam ticketBoxGrossProfitParam);
+
+    List<UserHitPrizeVO> listUserHitPrize(QueryWrapper<UserTicketOrder> queryWrapper);
+
 }

+ 10 - 3
mp-service/src/main/java/com/qs/mp/user/service/impl/UserPrizeStorageServiceImpl.java

@@ -1,12 +1,10 @@
 package com.qs.mp.user.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.system.service.id.BizIdGenerator;
+import com.qs.mp.user.domain.UserHitPrize;
 import com.qs.mp.user.domain.UserPrizeStorage;
 import com.qs.mp.user.domain.vo.UserPrizeStorageVO;
 import com.qs.mp.user.mapper.UserPrizeStorageMapper;
@@ -36,6 +34,15 @@ public class UserPrizeStorageServiceImpl extends ServiceImpl<UserPrizeStorageMap
         return getBaseMapper().listByQueryWrapper(queryWrapper);
     }
 
+    @Override
+    public List<UserPrizeStorageVO> listGoodsPrizeCost(QueryWrapper<UserHitPrize> queryWrapper) {
+        return getBaseMapper().listGoodsPrizeCost(queryWrapper);
+    }
+
+    public List<UserPrizeStorageVO> listAllPrizeStorageGoodsCost(QueryWrapper<UserPrizeStorage> queryWrapper) {
+        return getBaseMapper().listAllPrizeStorageGoodsCost(queryWrapper);
+    }
+
     @Override
   public void takeInStorage(Long userId, String title, String picUrl, String goodsId, PrizeStorageInTypeEnum inTypeEnum, String refId) {
       UserPrizeStorage userPrizeStorage = new UserPrizeStorage();

+ 15 - 5
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -11,10 +11,9 @@ import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketBoxGoods;
-import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.domain.param.IndexTicketBoxTopQueryParam;
 import com.qs.mp.admin.domain.param.IndexTicketSiteTopQueryParam;
-import com.qs.mp.admin.domain.param.UserTicketOrderQueryParam;
+import com.qs.mp.admin.domain.param.TicketBoxGrossProfitParam;
 import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.ICouponPkgService;
 import com.qs.mp.admin.service.ICouponService;
@@ -44,6 +43,7 @@ import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserCoupon4OrderVO;
+import com.qs.mp.user.domain.vo.UserHitPrizeVO;
 import com.qs.mp.user.domain.vo.UserShareVO;
 import com.qs.mp.user.mapper.UserTicketOrderMapper;
 import com.qs.mp.user.service.IUserCouponService;
@@ -56,11 +56,8 @@ import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.http.util.Asserts;
-import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.framework.AopContext;
@@ -786,6 +783,19 @@ public class UserTicketOrderServiceImpl extends
         return getBaseMapper().getPromoterTicketSaleCnt(channelNo, days == 1?0:days);
     }
 
+    @Override
+    public TicketBoxGrossProfitVO selectTicketBoxGrossProfitByTicketOrderAndChannelOrder(
+            TicketBoxGrossProfitParam ticketBoxGrossProfitParam) {
+        return getBaseMapper().selectTicketBoxGrossProfitByTicketOrderAndChannelOrder(ticketBoxGrossProfitParam);
+    }
+
+
+    @Override
+    public List<UserHitPrizeVO> listUserHitPrize(QueryWrapper<UserTicketOrder> queryWrapper) {
+        return getBaseMapper().listUserHitPrize(queryWrapper);
+    }
+
+
     @Override
     public UserTicketOrderDetailVO detail(String orderId) {
         QueryWrapper<UserTicketOrder> queryWrapper = new QueryWrapper<>();

+ 1 - 1
mp-service/src/main/resources/mapper/user/UserCouponMapper.xml

@@ -24,7 +24,7 @@
     </sql>
 
     <select id="listUserCouponVO" resultType="com.qs.mp.user.domain.vo.UserCouponVO">
-        select t1.*, t2.coupon_id, t2.title, t2.type, t2.pic_url, t2.description, t2.discount_type, t2.discount, t2.min_order_amt, t2.use_area, t2.distribute_type, t2.composite_use
+        select t1.*, t2.coupon_id, t2.title, t2.type, t2.pic_url, t2.description, t2.discount_type, t2.discount, t2.min_order_amt, t2.use_area, t2.distribute_type, t2.composite_use,t2.channel_shared_rate
         from mp_user_coupon t1
         left join mp_coupon t2 on t1.coupon_id = t2.coupon_id
             ${ew.customSqlSegment}

+ 18 - 0
mp-service/src/main/resources/mapper/user/UserPrizeStorageMapper.xml

@@ -39,4 +39,22 @@
         LEFT JOIN mp_ticket_box t5 on t4.box_id = t5.box_id
         ${ew.customSqlSegment}
     </select>
+    <select id="listGoodsPrizeCost" resultType="com.qs.mp.user.domain.vo.UserPrizeStorageVO">
+        SELECT
+            t2.cost,
+            t1.*
+        FROM
+            mp_user_prize_storage t1
+            LEFT JOIN mp_goods t2 ON t1.goods_id = t2.goods_id
+            ${ew.customSqlSegment}
+    </select>
+    <select id="listAllPrizeStorageGoodsCost" resultType="com.qs.mp.user.domain.vo.UserPrizeStorageVO">
+        SELECT
+            t2.cost,
+            t1.*
+        FROM
+            mp_user_prize_storage t1
+                LEFT JOIN mp_goods t2 ON t1.goods_id = t2.goods_id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 63 - 0
mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

@@ -246,4 +246,67 @@
 			where (t2.channel_no like concat(#{channelNo},'.%') or t2.channel_no = #{channelNo})
 				AND t1.created_time > DATE_SUB(CURDATE(),INTERVAL #{days} DAY);
   </select>
+	<select id="selectTicketBoxGrossProfitByTicketOrderAndChannelOrder"
+			resultType="com.qs.mp.admin.domain.vo.TicketBoxGrossProfitVO">
+		select SUM(a.pay_amt) as payAmt
+		from (select SUM(t1.pay_amt) AS pay_amt
+			  from `mp_user_ticket_order` t1
+			  where t1.box_id = #{param.boxId}
+				and t1.status > #{param.ticketOrderStatus}
+
+			  union
+
+			  select sum(a1.pay_amt) as pay_amt
+			  from mp_channel_order a1
+					   left join mp_channel_order_item a2
+								 on a1.order_id = a2.order_id
+			  where a2.box_id = #{param.boxId}
+				and a1.status > #{param.channelOrderStatus}
+				and  a1.type > #{param.channelOrderType}
+			  ) a
+	</select>
+	<select id="listPrizeCost" resultType="com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO">
+		select t1.*,t3.prize_type as type
+		from mp_user_hit_prize t1
+				 left join mp_user_ticket_order t2 on t1.order_id = t2.order_id
+				 left join mp_ticket_awards_prize t3 on t3.prize_id = t2.prize_id
+				 left join mp_goods t4 on t3.ref_id = t4.goods_id
+			${ew.customSqlSegment}
+	</select>
+	<select id="listUserHitPrize" resultType="com.qs.mp.user.domain.vo.UserHitPrizeVO">
+		select t1.*,t3.prize_type,t3.value,t2.box_id,t3.ref_id
+		from mp_user_hit_prize t1
+				 left join mp_user_ticket_order t2 on t2.order_id = t1.order_id
+				 left join mp_ticket_awards_prize t3 on t3.prize_id = t1.prize_id
+			${ew.customSqlSegment}
+	</select>
+	<select id="selectTicketBoxGrossProfitByTicketOrderAndChannelOrderDaily"
+			resultType="com.qs.mp.admin.domain.vo.IndexVO">
+		select SUM(a.pay_amt) as payAmt,
+			   b.title,
+			   a.box_id
+		from (select t1.box_id,
+					 SUM(t1.pay_amt) AS pay_amt
+			  from `mp_user_ticket_order` t1
+			  where t1.created_time between #{param.startTime} and #{param.endTime}
+				and t1.status > #{param.ticketOrderStatus}
+			  group by t1.box_id
+
+			  union
+
+			  select a2.box_id,
+					 sum(a1.pay_amt) as pay_amt
+			  from mp_channel_order a1
+					   left join mp_channel_order_item a2
+								 on a1.order_id = a2.order_id
+			  where a1.created_time between #{param.startTime} and #{param.endTime}
+				and a1.status > #{param.channelOrderStatus}
+				and  a1.type > #{param.channelOrderType}
+			  group by a2.box_id) a
+				 left join mp_ticket_box b on a.box_id = b.box_id
+		group by a.box_id, b.title
+		ORDER BY payAmt DESC
+	</select>
+
+
 </mapper>