فهرست منبع

轮胎红包问题优化

liyuan 1 روز پیش
والد
کامیت
80e65574f4

+ 48 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/CouponReportDto.java

@@ -0,0 +1,48 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Rain
+ */
+@Data
+public class CouponReportDto {
+
+
+	private Long storeId;
+
+	/**
+	 * 门店名称
+	 */
+	private String storeName;
+
+	/**
+	 * 领取日期(仅日期部分,不含时间)
+	 */
+	private Date claimDate;
+
+	/**
+	 * 金额总和(优惠券面值之和)
+	 */
+	private BigDecimal amount;
+
+	/**
+	 * 领取优惠券数量
+	 */
+	private Integer claimedCount;
+
+	/**
+	 * 已使用优惠券数量(status = 1)
+	 */
+	private Integer usedCount;
+
+	/**
+	 * 退货优惠券
+	 */
+	private Integer returnedCouponCount;
+
+
+}

+ 17 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/CouponReturnsItemDto.java

@@ -0,0 +1,17 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class CouponReturnsItemDto {
+
+
+	private Long id;
+
+	private Long customerId;
+
+
+}

+ 23 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/vo/CouponReportVo.java

@@ -0,0 +1,23 @@
+package org.springblade.salesPart.coupon.vo;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class CouponReportVo {
+
+
+	 private String storeName;
+
+	 private String startDate;
+
+	 private String endDate;
+
+
+	 private String tenantId;
+
+
+
+}

+ 3 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java

@@ -430,4 +430,7 @@ public class PjOrderItems implements Serializable {
 	@TableField(exist = false)
 	private BigDecimal redPacketAmount;
 
+	@TableField(exist = false)
+	private Integer redPacketCount;
+
 }

+ 17 - 3
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/controller/TireCouponController.java

@@ -1,11 +1,15 @@
 package org.springblade.salesPart.coupon.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.coupon.dto.CouponReportDto;
 import org.springblade.salesPart.coupon.service.ITireCouponService;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springblade.salesPart.coupon.vo.CouponReportVo;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * @author Rain
@@ -51,5 +55,15 @@ public class TireCouponController {
 		tireCouponService.recordCheckLog();
 	}
 
+	@PostMapping("validateCoupon")
+	public R validateCoupon(@RequestBody List<Long> userCouponIds) {
+		return tireCouponService.validateCoupon(userCouponIds);
+	}
+
+	@GetMapping("/getCouponReportList")
+	public R<IPage<CouponReportDto>> getCouponReportList(CouponReportVo couponReportVo, Query query) {
+		return R.data(tireCouponService.getCouponReportList(couponReportVo, query));
+	}
+
 
 }

+ 21 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireUserCouponMapper.java

@@ -3,8 +3,11 @@ package org.springblade.salesPart.coupon.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.core.tenant.annotation.TenantIgnore;
+import org.springblade.salesPart.coupon.dto.CouponReportDto;
+import org.springblade.salesPart.coupon.dto.CouponReturnsItemDto;
 import org.springblade.salesPart.coupon.dto.TireUserCouponDto;
 import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+import org.springblade.salesPart.coupon.vo.CouponReportVo;
 
 import java.util.List;
 
@@ -51,4 +54,22 @@ public interface TireUserCouponMapper extends BaseMapper<TireUserCoupon> {
 	 */
 	@TenantIgnore
 	List<TireUserCouponDto> getUserCouponNotDateList(@Param("shopId") Long shopId, @Param("tenantId") String tenantId);
+
+	/**
+	 * 获取优惠券报表列表
+	 *
+	 * @param couponReportVo 参数
+	 * @return 结果
+	 */
+	@TenantIgnore
+	List<CouponReportDto> getCouponReportList(CouponReportVo couponReportVo);
+
+	/**
+	 * 查询已使用的订单id
+	 *
+	 * @param customerIds 客户id
+	 * @param tenantId    租户
+	 * @return 结果
+	 */
+	List<CouponReturnsItemDto> getCouponReturnsItemDtoList(@Param("idList") List<Long> customerIds, @Param("tenantId") String tenantId);
 }

+ 46 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireUserCouponMapper.xml

@@ -99,4 +99,50 @@
             tuc.corps_id = #{shopId}
           AND tuc.tenant_id = #{tenantId}
     </select>
+    <select id="getCouponReportList" resultType="org.springblade.salesPart.coupon.dto.CouponReportDto"
+            parameterType="org.springblade.salesPart.coupon.vo.CouponReportVo">
+        SELECT
+        p.id AS storeId,
+        p.cname AS storeName,
+        u.acquire_time AS claimDate,
+        SUM(c.value) AS amount,
+        COUNT(*) AS claimedCount,
+        COUNT(CASE WHEN u.status = 1 THEN 1 END) AS usedCount
+        FROM tire_user_coupon u
+        INNER JOIN tire_coupon c ON u.coupon_id = c.id
+        INNER JOIN pjpf_corps_desc p ON u.corps_id = p.id
+        WHERE u.acquire_time IS NOT NULL
+        AND c.is_deleted = 0
+        and u.tenant_id = #{tenantId}
+        and p.tenant_id = #{tenantId}
+        <if test="storeName != null and storeName != ''">
+            AND p.cname LIKE CONCAT('%', #{storeName}, '%')
+        </if>
+        <if test="startDate != null">
+            AND DATE(u.acquire_time) >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            AND DATE(u.acquire_time) &lt;= #{endDate}
+        </if>
+        GROUP BY p.cname, DATE(u.acquire_time)
+    </select>
+    <select id="getCouponReturnsItemDtoList"
+            resultType="org.springblade.salesPart.coupon.dto.CouponReturnsItemDto">
+        SELECT DISTINCT
+            po.customer_id,
+            po.id
+        FROM
+            tire_user_coupon u
+                INNER JOIN pjpf_order po ON u.order_id = po.id
+        WHERE
+            u.acquire_time IS NOT NULL
+          AND u.STATUS = 1
+          AND po.returns_status != '无'
+        and u.tenant_id = #{tenantId}
+        and po.tenant_id = #{tenantId}
+        and u.corps_id in
+        <foreach collection="idList" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 24 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/service/ITireCouponService.java

@@ -1,8 +1,14 @@
 package org.springblade.salesPart.coupon.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.coupon.dto.CouponReportDto;
 import org.springblade.salesPart.coupon.entity.TireCoupon;
+import org.springblade.salesPart.coupon.vo.CouponReportVo;
+
+import java.util.List;
 
 /**
  * @author Rain
@@ -40,7 +46,24 @@ public interface ITireCouponService extends IService<TireCoupon> {
 
 	/**
 	 * 记录查看记录
-	 *
 	 */
 	void recordCheckLog();
+
+	/**
+	 * 校验优惠券
+	 *
+	 * @param userCouponIds 用户优惠券id
+	 * @return 结果
+	 */
+	R validateCoupon(List<Long> userCouponIds);
+
+
+	/**
+	 * 获取优惠券报表列表
+	 *
+	 * @param couponReportVo 参数
+	 * @param query          分页
+	 * @return 结果
+	 */
+	IPage<CouponReportDto> getCouponReportList(CouponReportVo couponReportVo, Query query);
 }

+ 87 - 8
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/service/impl/TireCouponServiceImpl.java

@@ -3,8 +3,11 @@ package org.springblade.salesPart.coupon.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
 import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.TenantIgnore;
@@ -12,10 +15,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.salesPart.corps.mapper.CorpsAttnMapper;
-import org.springblade.salesPart.coupon.dto.CartCouponRuleDto;
-import org.springblade.salesPart.coupon.dto.ShortCouponRuleDto;
-import org.springblade.salesPart.coupon.dto.TireCartCouponDto;
-import org.springblade.salesPart.coupon.dto.TireUserCouponDto;
+import org.springblade.salesPart.coupon.dto.*;
 import org.springblade.salesPart.coupon.entity.TireCoupon;
 import org.springblade.salesPart.coupon.entity.TireCouponRule;
 import org.springblade.salesPart.coupon.entity.TireCouponViewLog;
@@ -25,10 +25,17 @@ import org.springblade.salesPart.coupon.mapper.TireCouponRuleMapper;
 import org.springblade.salesPart.coupon.mapper.TireCouponViewLogMapper;
 import org.springblade.salesPart.coupon.mapper.TireUserCouponMapper;
 import org.springblade.salesPart.coupon.service.ITireCouponService;
+import org.springblade.salesPart.coupon.vo.CouponReportVo;
 import org.springblade.salesPart.entity.PjCorpsAttn;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.order.mapper.OrderItemsMapper;
+import org.springblade.salesPart.order.mapper.OrderMapper;
+import org.springblade.salesPart.util.PageHelperUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -48,6 +55,10 @@ public class TireCouponServiceImpl extends ServiceImpl<TireCouponMapper, TireCou
 
 	private final CorpsAttnMapper corpsAttnMapper;
 
+	private final OrderMapper orderMapper;
+
+	private final OrderItemsMapper orderItemsMapper;
+
 
 	@Override
 	@TenantIgnore
@@ -95,7 +106,7 @@ public class TireCouponServiceImpl extends ServiceImpl<TireCouponMapper, TireCou
 		tireCouponViewLog.setClaimStatus(1);
 		tireCouponViewLog.setCorpsId(nowShopUser.getPid());
 		tireCouponViewLogMapper.insert(tireCouponViewLog);
-		return R.success("恭喜您成功领取路本轮胎价值百元的优惠券");
+		return R.success("恭喜您成功领取路本轮胎价值百元的优惠券");
 	}
 
 	@Override
@@ -159,15 +170,15 @@ public class TireCouponServiceImpl extends ServiceImpl<TireCouponMapper, TireCou
 				.eq(TireUserCoupon::getCorpsId, nowShopUser.getPid()).in(TireUserCoupon::getId, expiredIdList).eq(TireUserCoupon::getTenantId, searchUser.getTenantId()));
 		}
 		tireUserCouponDtoList.sort(Comparator.comparing(TireUserCouponDto::getStatus).thenComparing(
-				TireUserCouponDto::getCouponValue,
-				Comparator.nullsLast(Comparator.reverseOrder())));
+			TireUserCouponDto::getCouponValue,
+			Comparator.nullsLast(Comparator.reverseOrder())));
 		return R.data(tireUserCouponDtoList);
 	}
 
 	@Override
 	@TenantIgnore
 	public R getCartCouponList() {
-		TireCartCouponDto  tireCartCouponDto = new TireCartCouponDto();
+		TireCartCouponDto tireCartCouponDto = new TireCartCouponDto();
 		BladeUser searchUser = AuthUtil.getUser();
 		LocalDate today = LocalDate.now();
 		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
@@ -235,4 +246,72 @@ public class TireCouponServiceImpl extends ServiceImpl<TireCouponMapper, TireCou
 		tireCouponViewLog.setCorpsId(Objects.isNull(nowShopUser) ? 0 : nowShopUser.getId());
 		tireCouponViewLogMapper.insert(tireCouponViewLog);
 	}
+
+	@Override
+	public R validateCoupon(List<Long> userCouponIds) {
+		if (CollectionUtil.isEmpty(userCouponIds)) {
+			return R.data(true);
+		}
+		BladeUser validateUser = AuthUtil.getUser();
+		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, validateUser.getTenantId()).eq(PjCorpsAttn::getUserId, validateUser.getUserId()).last("limit 1"));
+		if (Objects.isNull(nowShopUser)) {
+			return R.data(true);
+		}
+		List<TireUserCouponDto> tireUserCouponDtoList = tireUserCouponMapper.getUserCouponList(nowShopUser.getPid(), validateUser.getTenantId());
+		if (CollectionUtil.isEmpty(tireUserCouponDtoList)) {
+			return R.data(false);
+		}
+		long count = tireUserCouponDtoList.stream().filter(cd -> userCouponIds.contains(cd.getId())).count();
+		return R.data(userCouponIds.size() == count);
+	}
+
+	@Override
+	public IPage<CouponReportDto> getCouponReportList(CouponReportVo couponReportVo, Query query) {
+		couponReportVo.setTenantId(AuthUtil.getTenantId());
+		PageHelper.startPage(query.getCurrent(), query.getSize());
+		List<CouponReportDto> couponReportDtoList = tireUserCouponMapper.getCouponReportList(couponReportVo);
+		if (CollectionUtil.isEmpty(couponReportDtoList)) {
+			return PageHelperUtil.getPageInfo(couponReportDtoList);
+		}
+		List<Long> customerIds = couponReportDtoList.stream().map(CouponReportDto::getStoreId).collect(Collectors.toList());
+		List<CouponReturnsItemDto> couponReturnsItemDtoList = tireUserCouponMapper.getCouponReturnsItemDtoList(customerIds, couponReportVo.getTenantId());
+		if (CollectionUtil.isEmpty(couponReturnsItemDtoList)) {
+			return PageHelperUtil.getPageInfo(couponReportDtoList);
+		}
+		List<Long> orderIds = couponReturnsItemDtoList.stream().map(CouponReturnsItemDto::getId).collect(Collectors.toList());
+		List<PjOrderItems> orderItemsList = orderItemsMapper.selectList(new LambdaQueryWrapper<PjOrderItems>()
+			.select(PjOrderItems::getId, PjOrderItems::getPid, PjOrderItems::getCouponIds, PjOrderItems::getGoodsNum, PjOrderItems::getSendNum, PjOrderItems::getReturnsNumber)
+			.in(PjOrderItems::getPid, orderIds).eq(PjOrderItems::getIsDeleted, 0).isNotNull(PjOrderItems::getCouponIds));
+		if (CollectionUtil.isEmpty(orderItemsList)) {
+			return PageHelperUtil.getPageInfo(couponReportDtoList);
+		}
+		for (CouponReportDto couponReportDto : couponReportDtoList) {
+			List<Long> customerOrderIds = couponReturnsItemDtoList.stream().filter(rid -> rid.getCustomerId().equals(couponReportDto.getStoreId())).map(CouponReturnsItemDto::getId).collect(Collectors.toList());
+			couponReportDto.setReturnedCouponCount(0);
+			if (CollectionUtil.isEmpty(customerOrderIds)) {
+				continue;
+			}
+			List<PjOrderItems> customerOrderItemList = orderItemsList.stream().filter(ois -> customerOrderIds.contains(ois.getPid())).collect(Collectors.toList());
+			if (CollectionUtil.isEmpty(customerOrderItemList)) {
+				continue;
+			}
+			int returnedCouponCount = 0;
+			for (PjOrderItems orderItems : customerOrderItemList) {
+				List<Long> useCouponIds = Arrays.stream(orderItems.getCouponIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
+				int numStatus = orderItems.getGoodsNum().compareTo(orderItems.getReturnsNumber());
+				int useCouponSize = useCouponIds.size();
+				if (numStatus <= 0) {
+					// 全退
+					returnedCouponCount += useCouponSize;
+				} else {
+					BigDecimal useCouponSizeDecimal = new BigDecimal(useCouponSize);
+					BigDecimal remainingQuantity = orderItems.getReturnsNumber().subtract(orderItems.getReturnsNumber());
+					returnedCouponCount += remainingQuantity.compareTo(useCouponSizeDecimal) >= 0 ? 0 : useCouponSizeDecimal.subtract(remainingQuantity).intValue();
+				}
+			}
+			couponReportDto.setReturnedCouponCount(returnedCouponCount);
+		}
+		return PageHelperUtil.getPageInfo(couponReportDtoList);
+	}
 }

+ 5 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -1550,7 +1550,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 							throw new NullPointerException("该订单使用的红包,但无法找到红包数据,故不能生成退货单");
 						}
 						BigDecimal userCouponAmount = useCouponList.stream().map(TireUserCouponDto::getCouponValue).reduce(BigDecimal.ZERO, BigDecimal::add);
-						item.setReturnsAmount(item.getReturnsAmount().subtract(userCouponAmount));
+						BigDecimal oneCouponAmount = userCouponAmount.divide(new BigDecimal(useCouponList.size()), RoundingMode.HALF_UP);
+						BigDecimal sizeDecimal = new BigDecimal(useCouponIds.size());
+						item.setReturnsAmount(item.getReturnsAmount().subtract(oneCouponAmount.multiply(item.getReturnsNumber().compareTo(sizeDecimal) >= 0 ? sizeDecimal : item.getReturnsNumber())));
 					}
 					//获得商品
 					PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
@@ -2476,8 +2478,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						throw new NullPointerException("该订单使用的红包,但无法找到红包数据,故不能生成退货单");
 					}
 					BigDecimal userCouponAmount = useCouponList.stream().map(TireUserCouponDto::getCouponValue).reduce(BigDecimal.ZERO, BigDecimal::add);
-					pjOrderItems.setRedPacketAmount(Objects.nonNull(order.getRedPacketAmount()) && BigDecimal.ZERO.compareTo(userCouponAmount) < 0 ? userCouponAmount.divide(new BigDecimal(useCouponList.size()), RoundingMode.HALF_UP) : userCouponAmount);
+					pjOrderItems.setRedPacketAmount(Objects.nonNull(detail.getRedPacketAmount()) && BigDecimal.ZERO.compareTo(userCouponAmount) < 0 ? userCouponAmount.divide(new BigDecimal(useCouponList.size()), RoundingMode.HALF_UP) : userCouponAmount);
 					pjOrderItems.setReturnsAmount(pjOrderItems.getReturnsAmount().subtract(userCouponAmount));
+					pjOrderItems.setRedPacketCount(useCouponIds.size());
 				}
 				pjOrderItemsList.add(pjOrderItems);
 			}

+ 1 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/service/impl/ShoppingCartServiceImpl.java

@@ -289,7 +289,7 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 						order.setSharedCompanyId(shoppingCartList.get(0).getSharedCompanyId() + "");
 						order.setSharedCompanyName(shoppingCartList.get(0).getSharedCompanyName());
 						if (redPacketAmount.compareTo(BigDecimal.ZERO) != 0) {
-							order.setSalesAmount(totalMoney.subtract(redPacketAmount));
+//							order.setSalesAmount(totalMoney.subtract(redPacketAmount));
 							order.setTotalMoney(order.getTotalMoney().subtract(redPacketAmount));
 							order.setRedPacketAmount(redPacketAmount);
 							TireUserCoupon updateUserCoupon = new TireUserCoupon();