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

Merge remote-tracking branch 'origin/master'

纪新园 4 дней назад
Родитель
Сommit
45a389ba1a
28 измененных файлов с 1109 добавлено и 22 удалено
  1. 0 1
      blade-auth/src/main/java/org/springblade/auth/utils/ImgVerifyCode.java
  2. 24 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/CartCouponRuleDto.java
  3. 25 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/ShortCouponRuleDto.java
  4. 29 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/TireCartCouponDto.java
  5. 39 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/dto/TireUserCouponDto.java
  6. 126 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCoupon.java
  7. 44 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCouponRule.java
  8. 34 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCouponViewLog.java
  9. 82 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireUserCoupon.java
  10. 5 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java
  11. 2 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java
  12. 13 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjShoppingCart.java
  13. 0 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/mapper/ITireCouponService.xml
  14. 55 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/controller/TireCouponController.java
  15. 10 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponMapper.java
  16. 9 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponMapper.xml
  17. 10 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponRuleMapper.java
  18. 7 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponRuleMapper.xml
  19. 10 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponViewLogMapper.java
  20. 9 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireCouponViewLogMapper.xml
  21. 43 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireUserCouponMapper.java
  22. 84 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/mapper/TireUserCouponMapper.xml
  23. 46 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/service/ITireCouponService.java
  24. 228 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/coupon/service/impl/TireCouponServiceImpl.java
  25. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  26. 46 7
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  27. 19 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/controller/ShoppingCartController.java
  28. 109 13
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/service/impl/ShoppingCartServiceImpl.java

+ 0 - 1
blade-auth/src/main/java/org/springblade/auth/utils/ImgVerifyCode.java

@@ -1,6 +1,5 @@
 package org.springblade.auth.utils;
 
-import sun.misc.BASE64Encoder;
 
 import javax.imageio.ImageIO;
 import java.awt.*;

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

@@ -0,0 +1,24 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+import org.springblade.salesPart.coupon.entity.TireCouponRule;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+@Data
+public class CartCouponRuleDto {
+
+
+	/**
+	 * 优惠券模板ID
+	 */
+	private Long couponId;
+
+
+	private List<ShortCouponRuleDto> tireCouponRuleList;
+
+
+}

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

@@ -0,0 +1,25 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class ShortCouponRuleDto {
+
+
+	private Integer couponType;
+
+	/**
+	 * 规则值:品牌名称/规格条件(如17寸以上)
+	 */
+	private String ruleValue;
+
+	/**
+	 * 规则条件
+	 */
+	private String ruleCondition;
+
+
+}

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

@@ -0,0 +1,29 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+import org.springblade.salesPart.coupon.entity.TireCouponRule;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+@Data
+public class TireCartCouponDto {
+
+
+	/**
+	 * 优惠券规则
+	 */
+	private List<TireCouponRule> tireCouponRuleList;
+
+	/**
+	 * 用户优惠券
+	 */
+	private List<TireUserCouponDto> tireUserCouponDtoList;
+
+
+	private List<CartCouponRuleDto> cartCouponRuleDtoList;
+
+
+}

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

@@ -0,0 +1,39 @@
+package org.springblade.salesPart.coupon.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.salesPart.coupon.entity.TireCouponRule;
+import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TireUserCouponDto extends TireUserCoupon {
+
+
+
+	/**
+	 * 优惠券标题
+	 */
+	private String title;
+
+	/**
+	 * 优惠券说明
+	 */
+	private String explanation;
+
+
+	/**
+	 * 优惠值: 满减金额/折扣比例
+	 */
+	private BigDecimal couponValue;
+
+
+
+
+}

+ 126 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCoupon.java

@@ -0,0 +1,126 @@
+package org.springblade.salesPart.coupon.entity;
+import lombok.Data;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 轮胎优惠券实体类
+ * 对应数据库表: tire_coupon
+ * @author Rain
+ */
+@Data
+public class TireCoupon {
+
+	/**
+	 * 主键ID
+	 */
+	private Long id;
+
+	/**
+	 * 优惠券标题
+	 */
+	private String title;
+
+	/**
+	 * 优惠券说明
+	 */
+	private String explanation;
+
+	/**
+	 * 优惠类型
+	 * 1-满减券
+	 * 2-折扣券
+	 * 3-无门槛券
+	 */
+	private Integer couponType;
+
+	/**
+	 * 优惠值: 满减金额/折扣比例(如0.85代表85折)
+	 */
+	private BigDecimal value;
+
+	/**
+	 * 使用门槛(满多少元可用)
+	 */
+	private BigDecimal conditionAmount;
+
+	/**
+	 * 最大优惠金额(针对折扣券)
+	 */
+	private BigDecimal maxDiscount;
+
+	/**
+	 * 总发行数量
+	 */
+	private Integer totalCount;
+
+	/**
+	 * 已领取数量
+	 */
+	private Integer receivedCount;
+
+	/**
+	 * 已使用数量
+	 */
+	private Integer usedCount;
+
+	/**
+	 * 有效期开始时间
+	 */
+	private Date validFrom;
+
+	/**
+	 * 有效期结束时间
+	 */
+	private Date validTo;
+
+	/**
+	 * 使用说明
+	 */
+	private String usageInstructions;
+
+	/**
+	 * 状态: 1-生效 2-失效
+	 */
+	private Integer status;
+
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+
+	/**
+	 * 租户
+	 */
+	private String tenantId;
+
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	private Integer isDeleted;
+
+	/**
+	 * 创建人
+	 */
+	private Long createUser;
+
+	/**
+	 * 修改人
+	 */
+	private Long updateUser;
+
+	/**
+	 * 创建部门
+	 */
+	private Long createDept;
+
+	/**
+	 * 备注
+	 */
+	private String remarks;
+}

+ 44 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCouponRule.java

@@ -0,0 +1,44 @@
+package org.springblade.salesPart.coupon.entity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 优惠券使用规则实体类
+ * 对应数据库表: tire_coupon_rule
+ * @author Rain
+ */
+@Data
+public class TireCouponRule {
+
+	/**
+	 * 主键ID
+	 */
+	private Long id;
+
+	/**
+	 * 关联优惠券ID
+	 */
+	private Long couponId;
+
+	/**
+	 * 规则类型:0-轮胎品牌, 1-轮胎规格
+	 */
+	private Integer ruleType;
+
+	/**
+	 * 规则值:品牌名称/规格条件(如17寸以上)
+	 */
+	private String ruleValue;
+
+	/**
+	 * 规则条件
+	 */
+	private String ruleCondition;
+
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+
+}

+ 34 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireCouponViewLog.java

@@ -0,0 +1,34 @@
+package org.springblade.salesPart.coupon.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Rain
+ */
+@Data
+public class TireCouponViewLog {
+
+
+	private Long id;
+
+
+	private String tenantId;
+
+	private Long userId;
+
+	private Date checkTime;
+
+	/**
+	 * 0未领取,1已领取
+	 */
+	private Integer claimStatus;
+
+	/**
+	 * 门店id
+	 */
+	private Long corpsId;
+
+
+}

+ 82 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/coupon/entity/TireUserCoupon.java

@@ -0,0 +1,82 @@
+package org.springblade.salesPart.coupon.entity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户优惠券记录实体类
+ * 对应数据库表: tire_user_coupon
+ * @author Rain
+ */
+@Data
+public class TireUserCoupon {
+
+	/**
+	 * 主键ID
+	 */
+	private Long id;
+
+	/**
+	 * 用户ID
+	 */
+	private Long userId;
+
+
+	/**
+	 * 门店id
+	 */
+	private Long corpsId;
+
+	/**
+	 * 优惠券模板ID
+	 */
+	private Long couponId;
+
+	/**
+	 * 状态:0-未使用 1-已使用 2-已过期
+	 */
+	private Integer status;
+
+	/**
+	 * 领取时间
+	 */
+	private Date acquireTime;
+
+	/**
+	 * 使用时间
+	 */
+	private Date usedTime;
+
+	/**
+	 * 使用的订单ID
+	 */
+	private Long orderId;
+
+	/**
+	 * 实际生效时间
+	 */
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date effectiveStart;
+
+	/**
+	 * 实际失效时间
+	 */
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date effectiveEnd;
+
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+
+
+	/**
+	 * 租户
+	 */
+	private String tenantId;
+}

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

@@ -560,6 +560,11 @@ public class PjOrder implements Serializable {
 	private BigDecimal rebateAmount;
 
 	/**
+	 * 红包金额
+	 */
+	private BigDecimal redPacketAmount;
+
+	/**
 	 * 默认不显示已完成
 	 */
 	@TableField(exist = false)

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

@@ -425,4 +425,6 @@ public class PjOrderItems implements Serializable {
 	@TableField(exist = false)
 	private List<PjHistory> historyList;
 
+	private String couponIds;
+
 }

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

@@ -310,4 +310,17 @@ public class PjShoppingCart implements Serializable {
 	@ApiModelProperty(value = "是否是积分商品")
 	private String whetherIntegral;
 
+	/**
+	 * 尺寸
+	 */
+	@ApiModelProperty(value = "尺寸")
+	@TableField(exist = false)
+	private String goodsSize;
+
+	/**
+	 * 优惠券id
+	 */
+	@TableField(exist = false)
+	private List<Long> itemCouponIds;
+
 }

+ 0 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/mapper/AuditPathsLevelsMapper.xml → blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/mapper/ITireCouponService.xml


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

@@ -0,0 +1,55 @@
+package org.springblade.salesPart.coupon.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+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;
+
+/**
+ * @author Rain
+ */
+@RestController
+@RequestMapping("/tire/coupon/")
+@AllArgsConstructor
+public class TireCouponController {
+
+
+	private final ITireCouponService tireCouponService;
+
+
+	/**
+	 * 当前默认给用户发放 二十个五块、十个十块的优惠券
+	 *
+	 * @return msg
+	 */
+	@PostMapping("receiveCoupon")
+	public R receiveCoupon() {
+		return tireCouponService.receiveCoupon();
+	}
+
+
+	@PostMapping("checkUserCoupon")
+	public R checkUserCoupon() {
+		return tireCouponService.checkUserCoupon();
+	}
+
+	@PostMapping("getUserCouponList")
+	public R getUserCouponList() {
+		return tireCouponService.getUserCouponList();
+	}
+
+
+	@PostMapping("getCartCouponList")
+	public R getCartCouponList() {
+		return tireCouponService.getCartCouponList();
+	}
+
+	@PostMapping("recordCheckLog")
+	public void recordCheckLog() {
+		tireCouponService.recordCheckLog();
+	}
+
+
+}

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

@@ -0,0 +1,10 @@
+package org.springblade.salesPart.coupon.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.salesPart.coupon.entity.TireCoupon;
+
+/**
+ * @author Rain
+ */
+public interface TireCouponMapper extends BaseMapper<TireCoupon> {
+}

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

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="org.springblade.salesPart.coupon.mapper.TireCouponMapper">
+
+
+
+
+</mapper>

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

@@ -0,0 +1,10 @@
+package org.springblade.salesPart.coupon.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.salesPart.coupon.entity.TireCouponRule;
+
+/**
+ * @author Rain
+ */
+public interface TireCouponRuleMapper extends BaseMapper<TireCouponRule> {
+}

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

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="org.springblade.salesPart.coupon.mapper.TireCouponRuleMapper">
+
+
+</mapper>

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

@@ -0,0 +1,10 @@
+package org.springblade.salesPart.coupon.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.salesPart.coupon.entity.TireCouponViewLog;
+
+/**
+ * @author Rain
+ */
+public interface TireCouponViewLogMapper extends BaseMapper<TireCouponViewLog> {
+}

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

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="org.springblade.salesPart.coupon.mapper.TireCouponViewLogMapper">
+
+
+
+
+</mapper>

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

@@ -0,0 +1,43 @@
+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.TireUserCouponDto;
+import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ */
+public interface TireUserCouponMapper extends BaseMapper<TireUserCoupon> {
+
+	/**
+	 * 批量保存
+	 *
+	 * @param insertList 数据
+	 * @return 结果
+	 */
+	int saveBatch(@Param("dtoList") List<TireUserCoupon> insertList);
+
+	/**
+	 * 获取用户优惠券列表
+	 *
+	 * @param shopId   用户ID
+	 * @param tenantId 租户ID
+	 * @return 结果
+	 */
+	@TenantIgnore
+	List<TireUserCouponDto> getUserCouponList(@Param("shopId") Long shopId, @Param("tenantId") String tenantId);
+
+	/**
+	 * 复原优惠券
+	 *
+	 * @param id       优惠券id
+	 * @param status   状态
+	 * @param tenantId 租户
+	 * @return 结果
+	 */
+	int restoreCoupon(@Param("id") Long id, @Param("status") int status, @Param("tenantId") String tenantId);
+}

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

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="org.springblade.salesPart.coupon.mapper.TireUserCouponMapper">
+
+    <resultMap id="userCouponResultMap" type="org.springblade.salesPart.coupon.dto.TireUserCouponDto">
+        <id property="id" column="id"/>
+        <result property="userId" column="user_id"/>
+        <result property="couponId" column="coupon_id"/>
+        <result property="status" column="status"/>
+        <result property="acquireTime" column="acquire_time"/>
+        <result property="usedTime" column="used_time"/>
+        <result property="orderId" column="order_id"/>
+        <result property="effectiveStart" column="effective_start"/>
+        <result property="effectiveEnd" column="effective_end"/>
+        <result property="createTime" column="create_time"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="corpsId" column="corps_id"/>
+        <result property="title" column="title"/>
+        <result property="explanation" column="explanation"/>
+        <result property="couponValue" column="couponValue"/>
+    </resultMap>
+
+
+    <insert id="saveBatch">
+        INSERT INTO tire_user_coupon (
+        id,
+        user_id,
+        coupon_id,
+        status,
+        acquire_time,
+        used_time,
+        order_id,
+        effective_start,
+        effective_end,
+        create_time,
+        corps_id,
+        tenant_id
+        ) VALUES
+        <foreach collection="dtoList" item="item" separator=",">
+            (
+            #{item.id},
+            #{item.userId},
+            #{item.couponId},
+            #{item.status},
+            #{item.acquireTime},
+            #{item.usedTime},
+            #{item.orderId},
+            #{item.effectiveStart},
+            #{item.effectiveEnd},
+            #{item.createTime},
+            #{item.corpsId},
+            #{item.tenantId}
+            )
+        </foreach>
+    </insert>
+    <update id="restoreCoupon">
+        UPDATE tire_user_coupon
+        SET order_id = null,
+            used_time = null,
+            STATUS = #{status}
+        WHERE
+            tenant_id = #{tenantId}
+          AND id = #{id}
+    </update>
+    <select id="getUserCouponList" resultMap="userCouponResultMap">
+        SELECT
+            tuc.id,
+            tuc.user_id,
+            tuc.coupon_id,
+            tuc.effective_start,
+            tuc.effective_end,
+            tc.title,
+            tc.`value` AS couponValue
+        FROM
+            tire_user_coupon tuc
+                INNER JOIN tire_coupon tc ON tuc.coupon_id = tc.id
+        WHERE
+            tuc.corps_id = #{shopId}
+          AND tuc.tenant_id = #{tenantId}
+          AND tuc.`status` = 0
+          AND  CURDATE() BETWEEN tuc.effective_start AND tuc.effective_end;
+    </select>
+</mapper>

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

@@ -0,0 +1,46 @@
+package org.springblade.salesPart.coupon.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.coupon.entity.TireCoupon;
+
+/**
+ * @author Rain
+ */
+public interface ITireCouponService extends IService<TireCoupon> {
+
+	/**
+	 * 领取优惠券
+	 * 当前默认给用户发放 二十个五块、十个十块的优惠券
+	 *
+	 * @return msg
+	 */
+	R receiveCoupon();
+
+	/**
+	 * 检查用户是否领取优惠券
+	 *
+	 * @return msg
+	 */
+	R checkUserCoupon();
+
+	/**
+	 * 获取用户优惠券列表
+	 *
+	 * @return msg
+	 */
+	R getUserCouponList();
+
+	/**
+	 * 获取购物车优惠券列表
+	 *
+	 * @return msg
+	 */
+	R getCartCouponList();
+
+	/**
+	 * 记录查看记录
+	 *
+	 */
+	void recordCheckLog();
+}

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

@@ -0,0 +1,228 @@
+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.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tenant.annotation.TenantIgnore;
+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.entity.TireCoupon;
+import org.springblade.salesPart.coupon.entity.TireCouponRule;
+import org.springblade.salesPart.coupon.entity.TireCouponViewLog;
+import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+import org.springblade.salesPart.coupon.mapper.TireCouponMapper;
+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.entity.PjCorpsAttn;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Rain
+ */
+@Service
+@AllArgsConstructor
+public class TireCouponServiceImpl extends ServiceImpl<TireCouponMapper, TireCoupon> implements ITireCouponService {
+
+	private final TireCouponRuleMapper tireCouponRuleMapper;
+
+	private final TireUserCouponMapper tireUserCouponMapper;
+
+	private final TireCouponViewLogMapper tireCouponViewLogMapper;
+
+	private final CorpsAttnMapper corpsAttnMapper;
+
+
+	@Override
+	@TenantIgnore
+	@Transactional(rollbackFor = Exception.class)
+	public R receiveCoupon() {
+		List<TireCoupon> tireCouponList = baseMapper.selectList(new LambdaQueryWrapper<TireCoupon>().eq(TireCoupon::getStatus, 1)
+			.eq(TireCoupon::getIsDeleted, 0).eq(TireCoupon::getTenantId, "000000"));
+		if (CollectionUtil.isEmpty(tireCouponList)) {
+			return R.fail("没有优惠券");
+		}
+		BladeUser nowReceiveUser = AuthUtil.getUser();
+		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, nowReceiveUser.getTenantId()).eq(PjCorpsAttn::getUserId, nowReceiveUser.getUserId()).last("limit 1"));
+		if (Objects.isNull(nowShopUser)) {
+			return R.fail("您不是门店用户无法领取优惠券");
+		}
+		Date nowDate = new Date();
+		List<TireUserCoupon> insertList = new ArrayList<>();
+		for (TireCoupon coupon : tireCouponList) {
+			for (int i = 0; i < coupon.getTotalCount(); i++) {
+				TireUserCoupon userCoupon = new TireUserCoupon();
+				userCoupon.setId(IdUtil.getSnowflakeNextId());
+				userCoupon.setUserId(nowReceiveUser.getUserId());
+				userCoupon.setCouponId(coupon.getId());
+				userCoupon.setStatus(0);
+				userCoupon.setAcquireTime(nowDate);
+				userCoupon.setEffectiveStart(coupon.getValidFrom());
+				userCoupon.setEffectiveEnd(coupon.getValidTo());
+				userCoupon.setTenantId(nowReceiveUser.getTenantId());
+				userCoupon.setCorpsId(nowShopUser.getPid());
+				insertList.add(userCoupon);
+			}
+		}
+		int insert = tireUserCouponMapper.saveBatch(insertList);
+		if (insert <= 0) {
+			return R.fail("领取失败");
+		}
+		TireCouponViewLog tireCouponViewLog = new TireCouponViewLog();
+		tireCouponViewLog.setTenantId(nowReceiveUser.getTenantId());
+		tireCouponViewLog.setUserId(nowReceiveUser.getUserId());
+		tireCouponViewLog.setClaimStatus(1);
+		tireCouponViewLog.setCorpsId(nowShopUser.getPid());
+		tireCouponViewLogMapper.insert(tireCouponViewLog);
+		return R.success("恭喜您成功领取路本轮胎价值三百元的优惠券");
+	}
+
+	@Override
+	public R checkUserCoupon() {
+		List<TireUserCoupon> userCouponList = tireUserCouponMapper.selectList(new LambdaQueryWrapper<TireUserCoupon>().eq(TireUserCoupon::getUserId, AuthUtil.getUserId()));
+		return R.data(CollectionUtil.isEmpty(userCouponList));
+	}
+
+	@Override
+	@TenantIgnore
+	public R getUserCouponList() {
+		BladeUser searchUser = AuthUtil.getUser();
+		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, searchUser.getTenantId()).eq(PjCorpsAttn::getUserId, searchUser.getUserId()).last("limit 1"));
+		if (Objects.isNull(nowShopUser)) {
+			return R.fail("未查找到您的门店信息");
+		}
+		List<TireUserCoupon> userCouponList = tireUserCouponMapper.selectList(new LambdaQueryWrapper<TireUserCoupon>()
+			.eq(TireUserCoupon::getCorpsId, nowShopUser.getPid()).eq(TireUserCoupon::getTenantId, searchUser.getTenantId()));
+		if (CollectionUtil.isEmpty(userCouponList)) {
+			return R.data(new ArrayList<>(1));
+		}
+		List<Long> couponIdList = userCouponList.stream().map(TireUserCoupon::getCouponId).distinct().collect(Collectors.toList());
+		List<TireCoupon> couponList = baseMapper.selectBatchIds(couponIdList);
+		if (CollectionUtil.isEmpty(couponList)) {
+			return R.data(new ArrayList<>(1));
+		}
+		List<TireUserCouponDto> tireUserCouponDtoList = new ArrayList<>();
+		long now = System.currentTimeMillis();
+		List<Long> expiredIdList = new ArrayList<>();
+		for (TireUserCoupon userCoupon : userCouponList) {
+			long end = userCoupon.getEffectiveEnd().getTime();
+			if (now > end) {
+				// 过期的
+				expiredIdList.add(userCoupon.getId());
+				userCoupon.setStatus(2);
+			}
+			TireUserCouponDto userCouponDto = BeanUtil.copy(userCoupon, TireUserCouponDto.class);
+			if (Objects.isNull(userCouponDto)) {
+				continue;
+			}
+			tireUserCouponDtoList.add(userCouponDto);
+			TireCoupon coupon = couponList.stream().filter(coupon1 -> coupon1.getId().equals(userCoupon.getCouponId())).findFirst().orElse(null);
+			if (coupon == null) {
+				continue;
+			}
+			userCouponDto.setTitle(coupon.getTitle());
+			userCouponDto.setExplanation(coupon.getExplanation());
+			userCouponDto.setCouponValue(coupon.getValue());
+		}
+		if (!CollectionUtil.isEmpty(expiredIdList)) {
+			TireUserCoupon updateUserCoupon = new TireUserCoupon();
+			updateUserCoupon.setStatus(2);
+			int updateCount = tireUserCouponMapper.update(updateUserCoupon, new LambdaQueryWrapper<TireUserCoupon>()
+				.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())));
+		return R.data(tireUserCouponDtoList);
+	}
+
+	@Override
+	@TenantIgnore
+	public R getCartCouponList() {
+		TireCartCouponDto  tireCartCouponDto = new TireCartCouponDto();
+		BladeUser searchUser = AuthUtil.getUser();
+		LocalDate today = LocalDate.now();
+		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, searchUser.getTenantId()).eq(PjCorpsAttn::getUserId, searchUser.getUserId()).last("limit 1"));
+		if (Objects.isNull(nowShopUser)) {
+			return R.fail("未查找到您的门店信息");
+		}
+		List<TireUserCoupon> userCouponList = tireUserCouponMapper.selectList(new LambdaQueryWrapper<TireUserCoupon>()
+			.eq(TireUserCoupon::getCorpsId, nowShopUser.getPid()).eq(TireUserCoupon::getTenantId, searchUser.getTenantId())
+			.le(TireUserCoupon::getEffectiveStart, today).ge(TireUserCoupon::getEffectiveEnd, today).eq(TireUserCoupon::getStatus, 0));
+		if (CollectionUtil.isEmpty(userCouponList)) {
+			return R.data(null);
+		}
+		List<Long> couponIdList = userCouponList.stream().map(TireUserCoupon::getCouponId).distinct().collect(Collectors.toList());
+		List<TireCoupon> couponList = baseMapper.selectBatchIds(couponIdList);
+		if (CollectionUtil.isEmpty(couponList)) {
+			return R.data(null);
+		}
+		List<Long> couponIds = couponList.stream().map(TireCoupon::getId).collect(Collectors.toList());
+		List<TireCouponRule> couponRuleList = tireCouponRuleMapper.selectList(new LambdaQueryWrapper<TireCouponRule>().in(TireCouponRule::getCouponId, couponIds));
+		if (!CollectionUtil.isEmpty(couponRuleList)) {
+			Map<Long, List<TireCouponRule>> couponRuleMap = couponRuleList.stream().collect(Collectors.groupingBy(TireCouponRule::getCouponId));
+			List<CartCouponRuleDto> cartCouponRuleDtoList = new ArrayList<>();
+			for (Map.Entry<Long, List<TireCouponRule>> couponRuleMapEntry : couponRuleMap.entrySet()) {
+				CartCouponRuleDto cartCouponRuleDto = new CartCouponRuleDto();
+				cartCouponRuleDto.setCouponId(couponRuleMapEntry.getKey());
+				cartCouponRuleDto.setTireCouponRuleList(couponRuleMapEntry.getValue().stream().map(cr -> {
+					ShortCouponRuleDto shortCouponRuleDto = new ShortCouponRuleDto();
+					shortCouponRuleDto.setCouponType(cr.getRuleType());
+					shortCouponRuleDto.setRuleValue(cr.getRuleValue());
+					shortCouponRuleDto.setRuleCondition(cr.getRuleCondition());
+					return shortCouponRuleDto;
+				}).collect(Collectors.toList()));
+				cartCouponRuleDtoList.add(cartCouponRuleDto);
+			}
+			tireCartCouponDto.setCartCouponRuleDtoList(cartCouponRuleDtoList);
+		}
+		List<TireUserCouponDto> tireUserCouponDtoList = new ArrayList<>();
+		for (TireUserCoupon userCoupon : userCouponList) {
+			TireUserCouponDto userCouponDto = BeanUtil.copy(userCoupon, TireUserCouponDto.class);
+			if (Objects.isNull(userCouponDto)) {
+				continue;
+			}
+			tireUserCouponDtoList.add(userCouponDto);
+			TireCoupon coupon = couponList.stream().filter(coupon1 -> coupon1.getId().equals(userCoupon.getCouponId())).findFirst().orElse(null);
+			if (coupon == null) {
+				continue;
+			}
+			userCouponDto.setTitle(coupon.getTitle());
+			userCouponDto.setExplanation(coupon.getExplanation());
+			userCouponDto.setCouponValue(coupon.getValue());
+		}
+		tireCartCouponDto.setTireUserCouponDtoList(tireUserCouponDtoList);
+		return R.data(tireCartCouponDto);
+	}
+
+	@Override
+	public void recordCheckLog() {
+		BladeUser searchUser = AuthUtil.getUser();
+		PjCorpsAttn nowShopUser = corpsAttnMapper.selectOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, searchUser.getTenantId()).eq(PjCorpsAttn::getUserId, searchUser.getUserId()).last("limit 1"));
+		TireCouponViewLog tireCouponViewLog = new TireCouponViewLog();
+		tireCouponViewLog.setTenantId(searchUser.getTenantId());
+		tireCouponViewLog.setUserId(searchUser.getUserId());
+		tireCouponViewLog.setCorpsId(Objects.isNull(nowShopUser) ? 0 : nowShopUser.getId());
+		tireCouponViewLogMapper.insert(tireCouponViewLog);
+	}
+}

+ 1 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java

@@ -110,7 +110,7 @@ public class OrderController extends BladeController {
 				PjOrder::getGoodsTotalShipAmount, PjOrder::getOutGoodsTotalShipNum, PjOrder::getOutGoodsTotalShipAmount,
 				PjOrder::getGoodsTotalShipNum, PjOrder::getSalesAmount, PjOrder::getRefno, PjOrder::getPrimaryGoodsTotalNum,
 				PjOrder::getPrimaryFundingAmount, PjOrder::getUseAdvanceChargeAmount, PjOrder::getProduceAdvanceChargeAmount, PjOrder::getVersion,
-				PjOrder::getDeliveryBusinesDate, PjOrder::getSalesCompanyId, PjOrder::getBillType, PjOrder::getRemarks,
+				PjOrder::getDeliveryBusinesDate, PjOrder::getSalesCompanyId, PjOrder::getBillType, PjOrder::getRemarks, PjOrder::getRedPacketAmount,
 				PjOrder::getPaymentRecoveredBalance, PjOrder::getGenerateTask)
 			.eq(PjOrder::getTenantId, selectedUser.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)

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

@@ -28,7 +28,9 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.pay.tonglianPayment.entity.Parameters;
 import org.springblade.pay.tonglianPayment.entity.WechatMark;
 import org.springblade.pay.tonglianPayment.fegin.IPaymentClient;
@@ -47,6 +49,8 @@ import org.springblade.salesPart.check.service.IAuditPathsActsService;
 import org.springblade.salesPart.check.service.IAuditPathsLevelsService;
 import org.springblade.salesPart.check.service.IAuditProecessService;
 import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
+import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+import org.springblade.salesPart.coupon.mapper.TireUserCouponMapper;
 import org.springblade.salesPart.dto.FinancingProcurement;
 import org.springblade.salesPart.dto.SaleDetail;
 import org.springblade.salesPart.dto.SaleDetailDto;
@@ -66,6 +70,7 @@ import org.springblade.salesPart.goods.mapper.GoodsTypeMapper;
 import org.springblade.salesPart.goods.service.IGoodsFilesService;
 import org.springblade.salesPart.history.mapper.HistoryMapper;
 import org.springblade.salesPart.history.service.IHistoryService;
+import org.springblade.salesPart.order.mapper.OrderItemsMapper;
 import org.springblade.salesPart.order.mapper.OrderMapper;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderRecordService;
@@ -120,6 +125,7 @@ import java.util.concurrent.Executors;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static org.springblade.core.secure.utils.AuthUtil.getUser;
 
@@ -198,6 +204,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 
 	private final IReservoirAreaRecordService reservoirAreaRecordService;
 
+	private final TireUserCouponMapper tireUserCouponMapper;
+
 
 	/**
 	 * 获取销售订单详情
@@ -4956,6 +4964,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R<String> closeOrder(PjOrder order) {
 		BladeUser bladeUser = AuthUtil.getUser();
 		PjOrder srcOrder = baseMapper.selectOne(new LambdaQueryWrapper<PjOrder>().eq(PjOrder::getId, order.getId()).eq(PjOrder::getTenantId, bladeUser.getTenantId()));
@@ -4965,13 +4974,40 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		if (srcOrder.getIsDeleted().equals(NumberEnum.ONE.number)) {
 			return R.fail("订单已关闭");
 		}
-		srcOrder = new PjOrder();
-		srcOrder.setId(order.getId());
-		srcOrder.setTenantId(bladeUser.getTenantId());
-		srcOrder.setIsDeleted(NumberEnum.ONE.number);
-		srcOrder.setUpdateTime(new Date());
-		srcOrder.setUpdateUser(bladeUser.getUserId());
-		int updateCount = baseMapper.updateById(srcOrder);
+		Date nowDate = new Date();
+		PjOrder updateOrder = new PjOrder();
+		updateOrder.setId(order.getId());
+		updateOrder.setTenantId(bladeUser.getTenantId());
+		updateOrder.setIsDeleted(NumberEnum.ONE.number);
+		updateOrder.setUpdateTime(nowDate);
+		updateOrder.setUpdateUser(bladeUser.getUserId());
+		int updateCount = baseMapper.updateById(updateOrder);
+		existRebateAmount: if (Objects.nonNull(srcOrder.getRedPacketAmount()) && srcOrder.getRedPacketAmount().compareTo(BigDecimal.ZERO) > 0) {
+			// 存在使用红包,取消订单时修改状态
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getPid, srcOrder.getId())
+				.eq(PjOrderItems::getIsDeleted, NumberEnum.Zero.number).eq(PjOrderItems::getTenantId, bladeUser.getTenantId()));
+			if (CollectionUtil.isEmpty(orderItemsList)) {
+				break existRebateAmount;
+			}
+			List<Long> userCouponIdList = orderItemsList.stream().map(PjOrderItems::getCouponIds).filter(StringUtil::isNotBlank)
+				.flatMap(s -> Stream.of(s.split(","))).map(String::trim).filter(s -> !s.isEmpty()).map(Long::parseLong).collect(Collectors.toList());
+			if (CollectionUtil.isEmpty(userCouponIdList)) {
+				break existRebateAmount;
+			}
+			List<TireUserCoupon> tireUserCouponList = tireUserCouponMapper.selectList(new LambdaQueryWrapper<TireUserCoupon>()
+				.eq(TireUserCoupon::getTenantId, bladeUser.getTenantId()).eq(TireUserCoupon::getOrderId, srcOrder.getId()).in(TireUserCoupon::getId, userCouponIdList));
+			if (CollectionUtil.isEmpty(tireUserCouponList)) {
+				break existRebateAmount;
+			}
+			for (TireUserCoupon userCoupon : tireUserCouponList) {
+				int status = userCoupon.getEffectiveEnd().getTime() < nowDate.getTime() ? 2 : 0;
+				int updateUserCount = tireUserCouponMapper.restoreCoupon(userCoupon.getId(), status, bladeUser.getTenantId());
+				if (updateUserCount <= 0) {
+					throw new RuntimeException("修改优惠券失败");
+				}
+			}
+
+		}
 		return updateCount > 0 ? R.success("订单已关闭") : R.fail("订单关闭失败");
 	}
 
@@ -5459,6 +5495,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 					order.setRebateCost(order.getOrderItemsList().stream().map(PjOrderItems::getRebateCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 
 				}
+				if (BigDecimal.ZERO.compareTo(order.getRedPacketAmount()) <= 0) {
+					order.setTotalMoney(order.getTotalMoney().subtract(order.getRedPacketAmount()));
+				}
 			} else {
 				order.setNumberRows(0);//行数
 				//总数量

+ 19 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/controller/ShoppingCartController.java

@@ -10,18 +10,22 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.common.enums.CommonEnum;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.pay.tonglianPayment.entity.Parameters;
 import org.springblade.pay.tonglianPayment.fegin.IPaymentClient;
+import org.springblade.salesPart.entity.PjGoodsDesc;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjProductLaunchFiles;
 import org.springblade.salesPart.entity.PjShoppingCart;
+import org.springblade.salesPart.goods.service.IGoodsDescService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchFilesService;
 import org.springblade.salesPart.shoppingCart.service.IShoppingCartService;
 import org.springblade.salesPart.vo.ShoppingCartVO;
@@ -49,6 +53,9 @@ public class ShoppingCartController extends BladeController {
 
 	private final IPaymentClient paymentClient;
 
+
+	private final IGoodsDescService goodsDescService;
+
 	/**
 	 * 详情
 	 */
@@ -75,6 +82,18 @@ public class ShoppingCartController extends BladeController {
 			.eq(PjShoppingCart::getCreateUser, AuthUtil.getUserId());
 		List<PjShoppingCart> list = shoppingCartService.list(lambdaQueryWrapper);
 
+		if (CommonEnum.ZERO.info.equals(shoppingCart.getWhetherIntegral()) && CollectionUtil.isNotEmpty(list)) {
+			List<Long> goodsIds = list.stream().map(PjShoppingCart::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> goodsDescList = goodsDescService.list(new LambdaQueryWrapper<PjGoodsDesc>().select(PjGoodsDesc::getId, PjGoodsDesc::getGoodsSize).eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.in(PjGoodsDesc::getId, goodsIds).eq(PjGoodsDesc::getIsDeleted, 0));
+			for (PjShoppingCart cart : list) {
+				PjGoodsDesc goodsDesc = goodsDescList.stream().filter(item -> item.getId().equals(cart.getGoodsId())).findFirst().orElse(null);
+				if (goodsDesc == null) {
+					continue;
+				}
+				cart.setGoodsSize(goodsDesc.getGoodsSize());
+			}
+		}
 		//按照所属公司分组
 		Map<String, List<PjShoppingCart>> map = list.stream().filter(item -> StringUtils.isNotBlank(item.getSharedCompanyName()))
 			.collect(Collectors.groupingBy(PjShoppingCart::getSharedCompanyName));

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

@@ -17,11 +17,15 @@ import org.springblade.common.enums.NumberEnum;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.pay.tonglianPayment.entity.Parameters;
 import org.springblade.pay.tonglianPayment.fegin.IPaymentClient;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
+import org.springblade.salesPart.coupon.dto.TireUserCouponDto;
+import org.springblade.salesPart.coupon.entity.TireUserCoupon;
+import org.springblade.salesPart.coupon.mapper.TireUserCouponMapper;
 import org.springblade.salesPart.entity.*;
 import org.springblade.salesPart.enums.FinalMap;
 import org.springblade.salesPart.enums.OrderTypeEnum;
@@ -48,12 +52,14 @@ import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.feign.IUserSearchClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -79,7 +85,7 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 	private final ISysClient sysClient;
 	private final PayService payService;
 	private IUserSearchClient userSearchClient;
-	private final IMessageClient messageClient;//消息
+	private final IMessageClient messageClient;
 	private IUserClient userClient;
 
 	private final IPjIntegralDetailService integralDetailService;
@@ -92,6 +98,8 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 
 	private final GreenRecyclingRecordMapper greenRecyclingRecordMapper;
 
+	private final TireUserCouponMapper tireUserCouponMapper;
+
 
 	/**
 	 * 保存修改购物车信息
@@ -195,17 +203,20 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 					order.setReceivableType("网络支付");
 					orderService.save(order);
 					ids.append(order.getId()).append(",");
+					// 红包金额
+					BigDecimal redPacketAmount = BigDecimal.ZERO;
+					List<Long> useCouponIdList = new ArrayList<>();
 					//保存销售明细信息
 					if (ObjectUtil.isNotEmpty(shoppingCartList)) {
 						List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
-						shoppingCartList.forEach(e -> {
+						for (PjShoppingCart e : shoppingCartList) {
 							PjOrderItems orderItems = new PjOrderItems();
 							BeanUtils.copyProperties(e, orderItems);
 							if (e.getInventory().compareTo(orderItems.getGoodsNum()) < 0) {
 								throw new RuntimeException("库存不足");
 							}
 							orderItems.setId(null);
-							orderItems.setSendNum(new BigDecimal("0.00"));
+							orderItems.setSendNum(FinalMap.ZERO_POINT_ZERO);
 							orderItems.setCreateUser(bladeUser.getUserId());
 							orderItems.setCreateDept(order.getCreateDept());
 							orderItems.setCreateTime(new Date());
@@ -218,6 +229,24 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 							orderItems.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
 							orderItems.setUrl(ObjectUtils.isNotNull(e.getFilesList()) && !e.getFilesList().isEmpty() ? e.getFilesList().get(0).getUrl() : "");
 							orderItems.setGoodsName(e.getGoodsName());
+							existCoupon: if (CollectionUtil.isNotEmpty(e.getItemCouponIds())) {
+								// 是否有匹配到红包
+								List<TireUserCouponDto> userCouponDtoList = tireUserCouponMapper.getUserCouponList(finalCorpsDesc.getId(), bladeUser.getTenantId());
+								if (CollectionUtil.isEmpty(userCouponDtoList)) {
+									break existCoupon;
+								}
+								List<Long> useCouponIds = userCouponDtoList.stream().map(TireUserCouponDto::getId).filter(id -> e.getItemCouponIds().contains(id) && !useCouponIdList.contains(id)).collect(Collectors.toList());
+								if (useCouponIds.isEmpty()) {
+									break existCoupon;
+								}
+								BigDecimal couponAmount = userCouponDtoList.stream().filter(coupon -> e.getItemCouponIds().contains(coupon.getId()) && !useCouponIdList.contains(coupon.getId())).map(TireUserCouponDto::getCouponValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+								BigDecimal itemAmount = orderItems.getTotalAmount().subtract(couponAmount);
+								orderItems.setTotalAmount(itemAmount);
+								orderItems.setSubTotalMoney(itemAmount);
+								orderItems.setCouponIds(useCouponIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+								redPacketAmount = redPacketAmount.add(couponAmount);
+								useCouponIdList.addAll(useCouponIds);
+							}
 							orderItemsMapper.insert(orderItems);
 							PjGoodsDesc goodsDesc = goodsDescMapper.selectById(orderItems.getGoodsId());
 							if (ObjectUtils.isNotNull(goodsDesc)) {
@@ -236,22 +265,19 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 								}
 								pjProductLaunchList.add(productLaunch);
 							}
-						});
+						}
 						List<Integer> billType = pjProductLaunchList.stream().map(PjProductLaunch::getBillType).distinct().collect(Collectors.toList());
 						if (ObjectUtils.isNotNull(billType) && billType.size() > 1) {
 							throw new RuntimeException("请选择相同仓库的轮胎");
 						} else {
 							order.setBillType(billType.get(0));
 						}
-						BigDecimal totalMoney = BigDecimal.ZERO;
-						order.setNumberRows(shoppingCartList.size());//行数
+						order.setNumberRows(shoppingCartList.size());
 						//明细总数量
 						order.setGoodsTotalNum(shoppingCartList.stream().map(PjShoppingCart::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 
 						//明细总金额
-						totalMoney = shoppingCartList.stream().reduce(BigDecimal.ZERO, (x, y) -> {
-							return x.add(y.getGoodsNum().multiply(y.getPrice()));
-						}, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
+						BigDecimal totalMoney = shoppingCartList.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getGoodsNum().multiply(y.getPrice())), BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
 
 						order.setSalesAmount(totalMoney);
 						order.setTotalMoney(totalMoney);
@@ -259,10 +285,24 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 						BigDecimal freightAmount = WxParamUtil.getFreightByOrder(order.getGoodsTotalNum(), freight);
 						order.setTotalMoney(totalMoney.add(freightAmount));
 						order.setFreight(freightAmount);
-						amount = amount.add(order.getTotalMoney());
 //						order.setPaymentAmountTl(totalMoney);
 						order.setSharedCompanyId(shoppingCartList.get(0).getSharedCompanyId() + "");
 						order.setSharedCompanyName(shoppingCartList.get(0).getSharedCompanyName());
+						if (redPacketAmount.compareTo(BigDecimal.ZERO) != 0) {
+							order.setSalesAmount(totalMoney.subtract(redPacketAmount));
+							order.setTotalMoney(order.getTotalMoney().subtract(redPacketAmount));
+							order.setRedPacketAmount(redPacketAmount);
+							TireUserCoupon updateUserCoupon = new TireUserCoupon();
+							updateUserCoupon.setOrderId(order.getId());
+							updateUserCoupon.setUsedTime(new Date());
+							updateUserCoupon.setStatus(1);
+							int updateUserCouponCount = tireUserCouponMapper.update(updateUserCoupon, new LambdaQueryWrapper<TireUserCoupon>().in(TireUserCoupon::getId, useCouponIdList)
+								.eq(TireUserCoupon::getCorpsId, finalCorpsDesc.getId()).eq(TireUserCoupon::getTenantId, bladeUser.getTenantId()));
+							if (updateUserCouponCount <= 0) {
+								throw new RuntimeException("使用优惠券失败,请重新下单");
+							}
+						}
+						amount = amount.add(order.getTotalMoney());
 					}
 					if (goodsName.length() > 0) {
 						order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));
@@ -613,7 +653,10 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 					//保存销售明细信息
 					if (ObjectUtil.isNotEmpty(shoppingCartList)) {
 						List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
-						shoppingCartList.forEach(e -> {
+						// 红包金额
+						BigDecimal redPacketAmount = BigDecimal.ZERO;
+						List<Long> useCouponIdList = new ArrayList<>();
+						for (PjShoppingCart e : shoppingCartList) {
 							PjOrderItems orderItems = new PjOrderItems();
 							BeanUtils.copyProperties(e, orderItems);
 							if (e.getInventory().compareTo(orderItems.getGoodsNum()) < 0) {
@@ -633,6 +676,24 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 							orderItems.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
 							orderItems.setUrl(ObjectUtils.isNotNull(e.getFilesList()) && !e.getFilesList().isEmpty() ? e.getFilesList().get(0).getUrl() : "");
 							orderItems.setGoodsName(e.getGoodsName());
+							existCoupon: if (CollectionUtil.isNotEmpty(e.getItemCouponIds())) {
+								// 是否有匹配到红包
+								List<TireUserCouponDto> userCouponDtoList = tireUserCouponMapper.getUserCouponList(corpsDesc.getId(), nowOrderUser.getTenantId());
+								if (CollectionUtil.isEmpty(userCouponDtoList)) {
+									break existCoupon;
+								}
+								List<Long> useCouponIds = userCouponDtoList.stream().map(TireUserCouponDto::getId).filter(id -> e.getItemCouponIds().contains(id) && !useCouponIdList.contains(id)).collect(Collectors.toList());
+								if (useCouponIds.isEmpty()) {
+									break existCoupon;
+								}
+								BigDecimal couponAmount = userCouponDtoList.stream().filter(coupon -> e.getItemCouponIds().contains(coupon.getId()) && !useCouponIdList.contains(coupon.getId())).map(TireUserCouponDto::getCouponValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+								BigDecimal itemAmount = orderItems.getTotalAmount().subtract(couponAmount);
+								orderItems.setTotalAmount(itemAmount);
+								orderItems.setSubTotalMoney(itemAmount);
+								orderItems.setCouponIds(useCouponIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+								redPacketAmount = redPacketAmount.add(couponAmount);
+								useCouponIdList.addAll(useCouponIds);
+							}
 							orderItemsMapper.insert(orderItems);
 							PjGoodsDesc goodsDesc = goodsDescMapper.selectById(orderItems.getGoodsId());
 							if (ObjectUtils.isNotNull(goodsDesc)) {
@@ -657,7 +718,7 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 								}
 								pjProductLaunchList.add(productLaunch);
 							}
-						});
+						}
 						List<Integer> billType = pjProductLaunchList.stream().map(PjProductLaunch::getBillType).distinct().collect(Collectors.toList());
 						if (ObjectUtils.isNotNull(billType) && billType.size() > 1) {
 							throw new RuntimeException("请选择相同仓库的轮胎");
@@ -674,7 +735,7 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 						order.setSalesAmount(totalMoney);
 						order.setTotalMoney(totalMoney);
 
-						if (order.getGoodsTotalNum().compareTo(new BigDecimal(1)) == 0) {
+						if (order.getGoodsTotalNum().compareTo(BigDecimal.ONE) == 0) {
 							String freight = sysClient.getParamServiceDWT("freight", corpsDesc.getTenantId());
 							if (ObjectUtils.isNotNull(freight)) {
 								try {
@@ -690,6 +751,19 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 							order.setTotalMoney(totalMoney);
 							order.setFreight(new BigDecimal(5));*/
 						}
+						if (redPacketAmount.compareTo(BigDecimal.ZERO) != 0) {
+							order.setTotalMoney(order.getTotalMoney().subtract(redPacketAmount));
+							order.setRedPacketAmount(redPacketAmount);
+							TireUserCoupon updateUserCoupon = new TireUserCoupon();
+							updateUserCoupon.setOrderId(order.getId());
+							updateUserCoupon.setUsedTime(new Date());
+							updateUserCoupon.setStatus(1);
+							int updateUserCouponCount = tireUserCouponMapper.update(updateUserCoupon, new LambdaQueryWrapper<TireUserCoupon>().in(TireUserCoupon::getId, useCouponIdList)
+								.eq(TireUserCoupon::getCorpsId, corpsDesc.getId()).eq(TireUserCoupon::getTenantId, nowOrderUser.getTenantId()));
+							if (updateUserCouponCount <= 0) {
+								throw new RuntimeException("使用红包失败,请重新下单");
+							}
+						}
 						amount = amount.add(order.getTotalMoney());
 						order.setPaymentDate(new Date());
 						// 额度支付默认已付款
@@ -1280,6 +1354,12 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 		if (ObjectUtil.isEmpty(parametersR.getData())) {
 			return R.fail("未查到支付类型数据");
 		}
+		BladeUser bladeUser = AuthUtil.getUser();
+		PjCorpsAttn nowShopUser = corpsAttnService.getOne(new LambdaQueryWrapper<PjCorpsAttn>().eq(PjCorpsAttn::getIsDeleted, 0)
+			.eq(PjCorpsAttn::getTenantId, bladeUser.getTenantId()).eq(PjCorpsAttn::getUserId, bladeUser.getUserId()).last("limit 1"));
+		if (Objects.isNull(nowShopUser)) {
+			return R.fail("未查找到您的门店信息");
+		}
 		String payType = parametersR.getData().getPayType();
 		PjOrder srcOrder = orderService.getById(order.getId());
 		if (org.springframework.util.ObjectUtils.isEmpty(srcOrder) || srcOrder.getIsDeleted() == 1) {
@@ -1309,6 +1389,11 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 		if (org.springframework.util.CollectionUtils.isEmpty(pjProductLaunchList)) {
 			return R.fail("该订单商品数据已全部下架,请重新下单");
 		}
+
+		LocalDate today = LocalDate.now();
+		List<TireUserCoupon> userCouponList = tireUserCouponMapper.selectList(new LambdaQueryWrapper<TireUserCoupon>()
+			.eq(TireUserCoupon::getCorpsId, nowShopUser.getPid()).eq(TireUserCoupon::getTenantId, bladeUser.getTenantId())
+			.le(TireUserCoupon::getEffectiveStart, today).ge(TireUserCoupon::getEffectiveEnd, today));
 		for (PjOrderItems item : orderItemsList) {
 			ShoppingMallDetail productLaunch = pjProductLaunchList.stream().filter(x -> x.getGoodsId().equals(item.getGoodsId())).findFirst().orElse(null);
 			if (productLaunch == null) {
@@ -1317,6 +1402,17 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 			if (productLaunch.getInventory().compareTo(item.getGoodsNum()) < 0) {
 				return R.fail("该订单商品-“" + item.getGoodsName() + "”-库存不足,请重新下单");
 			}
+			if (StringUtil.isNotBlank(item.getCouponIds()) && CollectionUtil.isNotEmpty(userCouponList)) {
+				// 是否有匹配到红包
+				List<Long> itemCouponIds = Arrays.stream(item.getCouponIds().split(",")).map(Long::parseLong).collect(Collectors.toList());
+				if (CollectionUtils.isEmpty(itemCouponIds)) {
+					return R.fail("该订单存在使用红包,但已过期或不存在,请重新下单");
+				}
+				long couponCount = userCouponList.stream().filter(y -> itemCouponIds.contains(y.getId())).count();
+				if (couponCount != itemCouponIds.size()) {
+					return R.fail("该订单存在使用红包,但已过期或不存在,请重新下单");
+				}
+			}
 		}
 		String orderIdsStr = orderIds.stream().map(String::valueOf).collect(Collectors.joining(","));
 		String orderGoodsNameStr = orderItemsList.stream().map(PjOrderItems::getGoodsName).collect(Collectors.joining(","));