zoujiajian před 2 roky
rodič
revize
d7da937836
19 změnil soubory, kde provedl 475 přidání a 322 odebrání
  1. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java
  3. 6 1
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java
  4. 4 1
      netflix-dao/src/main/java/com/cyksj/model/entity/BackInfoTranslations.java
  5. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java
  6. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  7. 45 0
      netflix-dao/src/main/java/com/cyksj/model/views/CouponReceiptDetailView.java
  8. 59 0
      netflix-dao/src/main/java/com/cyksj/model/views/CouponUsedDetailView.java
  9. 4 1
      netflix-dao/src/main/java/com/cyksj/model/views/CouponView.java
  10. 7 0
      netflix-dao/src/main/resources/mapper/CouponMapper.xml
  11. 63 31
      netflix-dao/src/main/resources/mapper/CouponUserMapper.xml
  12. 6 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  13. 7 11
      netflix-service/src/main/java/com/cyksj/service/coupon/CouponFontService.java
  14. 35 11
      netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java
  15. 57 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  16. 10 0
      netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsFrontService.java
  17. 68 5
      netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsFrontServiceImpl.java
  18. 25 146
      netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java
  19. 63 114
      netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -49,4 +49,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	OrderDonCustomerServiceRelate selectOrderRelate(Long orderId);
 
 	String selectMaxRefundGoodsName(@Param("operator") String operator, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	BigDecimal getCouponUsedMoney(Long couponId);
 }

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.dto.CouponPopularizeDto;
 import com.cyksj.model.entity.Coupon;
 import com.cyksj.model.entity.CouponUser;
+import com.cyksj.model.entity.GoodsDonSku;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
@@ -29,4 +30,6 @@ public interface CouponMapper extends BaseMapper<Coupon> {
 
 	@Select("select name from coupon where id = #{couponId}")
 	String getCouponNameById(Long couponId);
+
+	List<GoodsDonSku> getCouponSku(Long couponId);
 }

+ 6 - 1
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponUserMapper.java

@@ -10,6 +10,7 @@ import com.cyksj.model.views.CouponUserView;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /*
  *项目名: netflix
@@ -24,7 +25,11 @@ public interface CouponUserMapper extends BaseMapper<CouponUser> {
 
 	Page<CouponActiveView> couponCenterList(@Param("userId") Long userId, IPage<CouponUserView> page);
 
-	Page<CouponUserView> couponPersonalList(@Param("userId") Long userId, @Param("page") Page<CouponUserView> page);
+	Page<CouponUserView> couponPersonalList(@Param("userId") Long userId, @Param("page") Page<CouponUserView> page, @Param("couponId") Long couponId);
 
 	CouponUserView getNewUserWelfareCouponsByUserId(@Param("userId") long userId, @Param("channel") CouponUser.Channel channel, @Param("now") DateTime now);
+
+	Map<String, Long> selectCouponUserNumData(Long couponId);
+
+	CouponUserView getCouponDetailById(@Param("userId") long userId, @Param("couponId") Long couponId);
 }

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/BackInfoTranslations.java

@@ -39,7 +39,10 @@ public class BackInfoTranslations extends BaseEntity{
 	public enum Type {
 		goods("商品"),
 		sku("规格"),
-		spec("一级规格");
+		spec("一级规格"),
+		coupon("优惠券"),
+		coupon_classification("优惠券分类"),
+		;
 		String remark;
 
 		Type(String remark) {

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java

@@ -3,6 +3,7 @@ package com.cyksj.model.entity;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /*
@@ -41,6 +42,11 @@ public class CouponUser extends BaseEntity {
 	 */
 	private Channel channel;
 
+	/**
+	 * 折扣卷折扣 用于分销
+	 */
+	private BigDecimal discount;
+
 	/**
 	 * 优惠券使用状态
 	 */

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -59,6 +59,11 @@ public class OrderDon extends BaseEntity implements Serializable {
     @DbIgnore
     private BigDecimal dpMoney;
 
+    /**
+     * 主平台订单金额 用于加购订单分销
+     */
+    private BigDecimal oriMoney;
+
     /**
      * 货币单位
      */

+ 45 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponReceiptDetailView.java

@@ -0,0 +1,45 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.CouponUser;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CouponReceiptDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/16 16:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select id,name from coupon where deleted is true :cid:) c inner join coupon_user cu on cu.coupon_id = c.id inner join user u on u.id = cu.user_id")
+public class CouponReceiptDetailView {
+
+	@DbField("cu.id")
+	private Long id;
+
+	@DbField("c.id")
+	private Long couponId;
+
+	@DbField("c.name")
+	private String name;
+
+	@DbField("u.id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("cu.status")
+	private CouponUser.Status status;
+
+	@DbField("cu.created_time")
+	private Date receiptTime;
+
+	@DbField("cu.valid_end_time")
+	private Date expiryTime;
+}

+ 59 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CouponUsedDetailView.java

@@ -0,0 +1,59 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CouponUsedDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/16 17:05
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select id,name from coupon where deleted is true :cid:) c inner join coupon_user cu on cu.coupon_id = c.id inner join user u on u.id = cu.user_id" +
+		" inner join order_don o on o.coupon_user_id = cu.id and o.status not in ('close','noPayment','refund')" +
+		" left join goods_don g on g.id = o.goods_id" +
+		" left join goods_don_sku sku on sku.id = o.sku_id")
+public class CouponUsedDetailView {
+
+	@DbField("cu.id")
+	private Long id;
+
+	@DbField("c.id")
+	private Long couponId;
+
+	@DbField("c.name")
+	private String name;
+
+	@DbField("u.id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("cu.created_time")
+	private Date receiptTime;
+
+	@DbField("sku.id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String goodsName;
+
+	@DbField("o.created_time")
+	private Date usedTime;
+}

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/views/CouponView.java

@@ -124,6 +124,9 @@ public class CouponView {
 	@DbIgnore
 	private Integer usedNum;
 
+	@DbIgnore
+	private Integer receiptNum;
+
 	/**
 	 * 发放状态
 	 */
@@ -147,4 +150,4 @@ public class CouponView {
 
 	@DbField("c.created_time")
 	private Date createdTime;
-}
+}

+ 7 - 0
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -41,4 +41,11 @@
         where cp.deleted is true
           and (cp.ex_code = #{couponExCode} or cdp.ex_code = #{couponExCode}) limit 1
     </select>
+
+    <select id="getCouponSku" resultType="com.cyksj.model.entity.GoodsDonSku">
+        select sku.id, sku.goods_id, sku.spec_val
+        from `coupon_sku` ck
+                 left join `goods_don_sku` gdk on gdk.id = ck.sku_id
+        where ck.coupon_id = #{couponId}
+    </select>
 </mapper>

+ 63 - 31
netflix-dao/src/main/resources/mapper/CouponUserMapper.xml

@@ -139,10 +139,49 @@
 
     <select id="couponPersonalList" resultType="com.cyksj.model.views.CouponUserView">
         select s.* from (select cu.id,
-               cu.channel,
-               cu.user_id,
-               c.id                     as couponId,
-               ca.id                    as couponActiveId,
+        cu.channel,
+        cu.user_id,
+        c.id                     as couponId,
+        ca.id                    as couponActiveId,
+        c.name,
+        c.goods_type,
+        c.type,
+        c.reduce_condition,
+        c.reduce_money,
+        c.discount,
+        c.use_scope,
+        c.goods_sku_ids,
+        c.is_valid_time,
+        cu.valid_start_time,
+        c.valid_days,
+        c.valid_hours,
+        cu.valid_end_time,
+        (case
+        when cu.status = 'used' then 'used'
+        when cu.valid_end_time &lt; now() then 'expired'
+        when ca.id is not null and ca.expiry_status = 0 then 'invalid'
+        when cu.valid_start_time > now() then 'notEffective'
+        else cu.status end) as couponUserStatus,
+        (case
+        when cu.status = 'used' then 4
+        when cu.valid_end_time &lt; now() then 2
+        when ca.id is not null and ca.expiry_status = 0 then 3
+        when cu.valid_start_time > now() then 1
+        when cu.status = 'unused' then 0
+        end)                 as orderby
+        from `coupon_user` cu
+        left join `coupon` c on c.id = cu.coupon_id
+        left join `coupon_active` ca on ca.id = cu.coupon_active_id
+        where cu.user_id = #{userId}
+        <if test="couponId !=null">
+            and cu.coupon_id = #{couponId}
+        </if>
+        and cu.channel != 'exCode'
+        order by `orderby`)s where s.couponUserStatus != 'expired' and s.couponUserStatus != 'invalid'
+    </select>
+
+    <select id="getNewUserWelfareCouponsByUserId" resultType="com.cyksj.model.views.CouponUserView">
+        select cu.*,
                c.name,
                c.goods_type,
                c.type,
@@ -151,33 +190,28 @@
                c.discount,
                c.use_scope,
                c.goods_sku_ids,
-               c.is_valid_time,
                cu.valid_start_time,
-               c.valid_days,
-               c.valid_hours,
                cu.valid_end_time,
-               (case
-                    when cu.status = 'used' then 'used'
-                    when cu.valid_end_time &lt; now() then 'expired'
-                    when ca.id is not null and ca.expiry_status = 0 then 'invalid'
-                    when cu.valid_start_time > now() then 'notEffective'
-                    else cu.status end) as couponUserStatus,
-               (case
-                    when cu.status = 'used' then 4
-                    when cu.valid_end_time &lt; now() then 2
-                    when ca.id is not null and ca.expiry_status = 0 then 3
-                    when cu.valid_start_time > now() then 1
-                    when cu.status = 'unused' then 0
-                   end)                 as orderby
-        from `coupon_user` cu
-                 left join `coupon` c on c.id = cu.coupon_id
-                 left join `coupon_active` ca on ca.id = cu.coupon_active_id
-        where cu.user_id = #{userId}
-          and cu.channel != 'exCode'
-        order by `orderby`)s where s.couponUserStatus != 'expired' and s.couponUserStatus != 'invalid'
+               unix_timestamp(cu.valid_end_time) * 1000 as validEndTimestamp
+        from (select coupon_id,
+                     valid_start_time,
+                     valid_end_time,
+                     status as couponUserStatus
+              from `coupon_user`
+              where channel = #{channel}
+                and user_id = #{userId}
+                and valid_end_time > #{now}
+                 and status = 'unused' limit 1) cu
+                 inner join coupon c on c.id = cu.coupon_id
     </select>
 
-    <select id="getNewUserWelfareCouponsByUserId" resultType="com.cyksj.model.views.CouponUserView">
+    <select id="selectCouponUserNumData" resultType="java.util.Map">
+        select count(if(status = 'used', 1, NULL)) usedNum, count(*) receiptNum
+        from coupon_user
+        where coupon_id = #{couponId}
+    </select>
+
+    <select id="getCouponDetailById" resultType="com.cyksj.model.views.CouponUserView">
         select cu.*,
                c.name,
                c.goods_type,
@@ -195,10 +229,8 @@
                      valid_end_time,
                      status as couponUserStatus
               from `coupon_user`
-              where channel = #{channel}
-                and user_id = #{userId}
-                and valid_end_time > #{now}
-                 and status = 'unused' limit 1) cu
+              where user_id = #{userId}
+                and coupon_id = #{couponId} limit 1) cu
                  inner join coupon c on c.id = cu.coupon_id
     </select>
 </mapper>

+ 6 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -190,4 +190,10 @@
         group by o.goods_id
         order by count(*) desc limit 1
     </select>
+
+    <select id="getCouponUsedMoney" resultType="java.math.BigDecimal">
+        select sum(money) - sum(ifnull(refund_money, 0))
+        from (select id from coupon_user where coupon_id = #{couponId}) cu
+                 inner join order_don o on o.coupon_user_id = cu.id and o.status not in ('close', 'noPayment')
+    </select>
 </mapper>

+ 7 - 11
netflix-service/src/main/java/com/cyksj/service/coupon/CouponFontService.java

@@ -20,20 +20,10 @@ public interface CouponFontService {
 	 */
 	void collectCoupon(CouponCollectReq couponCollectReq, Long userId);
 
-	/**
-	 * 领取推荐优惠券
-	 */
-	void collectRecommendCoupon(CouponCollectReq couponCollectReq, Long userId);
-
-	/**
-	 * 一键领取推荐优惠券
-	 */
-	void collectWholeRecommendCoupon(Long userId);
-
 	/**
 	 * 可用/不可用优惠券
 	 */
-	Page<CouponUserView> getAvailableCouponList(Long skuId, Long couponId, Long userId, Boolean isRenew, Long start, Long limit);
+	Page<CouponUserView> getAvailableCouponList(Long skuId, Long couponId, Long userId, Boolean isRenew, Long start, Long limit, String lang);
 
 	/**
 	 * 优惠券状态
@@ -66,4 +56,10 @@ public interface CouponFontService {
 	 * 新用户福利优惠券
 	 */
 	CouponUserView getNewUserWelfareCoupons(long userId, DateTime now);
+
+	CouponUserView getCouponDetailById(long userId, Long couponId, String lang);
+
+	CouponUserView receiveCoupon(long userId, Long couponId, String lang);
+
+	String setCouponSkuLanguage(Long couponId, String lang);
 }

+ 35 - 11
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -19,6 +19,7 @@ import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.coupon.CouponFontService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
@@ -62,6 +63,8 @@ public class CouponFontServiceImpl implements CouponFontService {
 
 	private final UserMapper userMapper;
 
+	private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void collectCoupon(CouponCollectReq couponCollectReq, Long userId) {
@@ -124,7 +127,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 	}
 
 	@Override
-	public Page<CouponUserView> getAvailableCouponList(Long skuId, Long couponId, Long userId, Boolean isRenew, Long start, Long limit) {
+	public Page<CouponUserView> getAvailableCouponList(Long skuId, Long couponId, Long userId, Boolean isRenew, Long start, Long limit, String lang) {
 		DateTime now = DateTime.now();
 		Long goodsId = null;
 		//实物还是虚物
@@ -137,10 +140,9 @@ public class CouponFontServiceImpl implements CouponFontService {
 			goodsId = goodsDonSkuView.getGoodsId();
 		}
 		Page<CouponUserView> availableCouponList = couponUserMapper.getAvailableCouponList(skuId, couponId, goodsId, userId, isRenew, new Page<>(start, limit));
-		Optional.ofNullable(availableCouponList).ifPresent(page->{
-			page.getRecords().stream().forEach(data->{
-				String str = couponSkuMapper.selectGoodsSkuStr(data.getCouponId());
-				data.setGoodsSkuStr(str.replaceAll(",", "/").replaceAll(";", ""));
+		Optional.ofNullable(availableCouponList).ifPresent(page -> {
+			page.getRecords().stream().forEach(data -> {
+				data.setGoodsSkuStr(backInfoTranslationsFrontService.setCouponGoodsSkuStrLanguage(data.getCouponId(), lang));
 				List<CouponSkuView> couponSkus = couponSkuMapper.getGoodsSkuByCouponId(data.getCouponId());
 				try {
 					data.setGoodsSkuIds(Jsons.toJson(couponSkus));
@@ -149,12 +151,6 @@ public class CouponFontServiceImpl implements CouponFontService {
 				}
 
 				if (!data.getIsAvailable()) {
-//					data.setReason(String.format("仅限%s", data.getGoodsSkuStr()));
-//					if (data.getUseScope() == Coupon.UseScope.renew) {
-//						data.setReason(String.format("%s续费时可使用", data.getReason()));
-//					} else if (data.getUseScope() == Coupon.UseScope.orders) {
-//						data.setReason(String.format("%s下单时可使用", data.getReason()));
-//					}
 					if (data.getUseScope() == Coupon.UseScope.renew) {
 						data.setReason(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_renew_error"));
 					} else if (data.getUseScope() == Coupon.UseScope.orders) {
@@ -372,4 +368,32 @@ public class CouponFontServiceImpl implements CouponFontService {
 	public CouponUserView getNewUserWelfareCoupons(long userId, DateTime now) {
 		return couponUserMapper.getNewUserWelfareCouponsByUserId(userId, CouponUser.Channel.new_welfare, now);
 	}
+
+	@Override
+	public String setCouponSkuLanguage(Long couponId, String lang) {
+		return backInfoTranslationsFrontService.setCouponGoodsSkuStrLanguage(couponId, lang);
+	}
+
+	@Override
+	public CouponUserView getCouponDetailById(long userId, Long couponId, String lang) {
+		CouponUserView couponUserView = couponUserMapper.getCouponDetailById(userId, couponId);
+		if (couponUserView != null) {
+			//多语言
+			backInfoTranslationsFrontService.setFieldLanguage(CouponUserView.class, couponUserView, BackInfoTranslations.Type.coupon.ordinal(), couponUserView.getCouponId(), lang);
+
+			String goodsSkuStr = backInfoTranslationsFrontService.setCouponGoodsSkuStrLanguage(couponId, lang);
+			couponUserView.setGoodsSkuStr(goodsSkuStr);
+		}
+		return couponUserView;
+	}
+
+	@Override
+	public CouponUserView receiveCoupon(long userId, Long couponId, String lang) {
+		try {
+			receiveCouponUser(couponId, userId, CouponUser.Channel.manual);
+		} catch (Exception e) {
+			return null;
+		}
+		return getCouponDetailById(userId, couponId, lang);
+	}
 }

+ 57 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -297,7 +297,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setPopularizeId(payRequest.getPopularizeId());
 		}
 		//扣除使用优惠券、余额的订单金额
-//		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType());
+		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType());
 
 		orderDon.setSkuId(payRequest.getSkuId());
 		orderDon.setRelationId(relationId);
@@ -406,6 +406,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					clearUserLockingRelation(groupsRelation, orderDon);
 				}
 			}
+			//返还优惠券
+			if (orderDon.getCouponUserId() != 0) {
+				couponFontService.updateOrderDonCouponStatus(orderDon);
+			}
 		}
 	}
 
@@ -1292,4 +1296,56 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		return user;
 	}
+
+
+	/**
+	 * 使用优惠营销 订单金额抵扣
+	 */
+	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, Integer goodsType) {
+		BigDecimal first_money = orderDon.getMoney();
+		//存在优惠券
+		if (couponUser != null) {
+			Long couponId = couponUser.getCouponId();
+			Coupon coupon = couponMapper.getCouponById(couponId);
+			BigDecimal couponMoney = null;
+			BigDecimal payMoney = orderDon.getMoney();
+			BigDecimal needDeductMoney = payMoney;
+			if (orderDon.getOriMoney() == null) {
+				orderDon.setOriMoney(payMoney);
+			}
+			if (orderDon.getIsDp() != null && orderDon.getIsDp()) {
+				needDeductMoney = needDeductMoney.subtract(orderDon.getDpMoney());
+			}
+			if (coupon.getType() == Coupon.Type.discount) {
+				couponMoney = needDeductMoney.multiply(BigDecimal.valueOf(1).subtract(coupon.getDiscount()));
+				//需支付金额
+				orderDon.setMoney(payMoney.subtract(couponMoney));
+
+				orderDon.setOriMoney(orderDon.getOriMoney().multiply(coupon.getDiscount()));
+				//记录折扣 用于分销
+				couponUser.setDiscount(coupon.getDiscount());
+				couponUserMapper.updateById(couponUser);
+			} else if (coupon.getType() == Coupon.Type.reduce) {
+				//设备
+				if (goodsType == 2) {
+					if (skuMoney.compareTo(coupon.getReduceCondition()) < 0) {
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
+					}
+				}
+				BigDecimal subtractMoney = payMoney.subtract(coupon.getReduceMoney());
+				orderDon.setMoney(subtractMoney);
+				couponMoney = coupon.getReduceMoney();
+
+				orderDon.setOriMoney(orderDon.getOriMoney().subtract(coupon.getReduceMoney()));
+			}
+			if (couponMoney != null && couponMoney.compareTo(first_money) >= 0) {
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_money_error"));
+			}
+			orderDon.setCouponMoney(couponMoney);
+			orderDon.setCouponUserId(couponUser.getId());
+		}
+
+		//存在余额
+//		deductBalancePayOrderMoney(orderDon, balance, user);
+	}
 }

+ 10 - 0
netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsFrontService.java

@@ -2,6 +2,7 @@ package com.cyksj.service.translations;
 
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.manage.views.GoodsDonViewer;
+import com.cyksj.model.views.CouponView;
 import com.cyksj.model.views.GoodsFrontListCategoryView;
 import com.cyksj.model.views.GoodsFrontListView;
 
@@ -27,4 +28,13 @@ public interface BackInfoTranslationsFrontService {
 	String setSpecVal(Long skuId, String lang);
 
 	String setGoodsTitle(Long goodsId, String lang);
+
+	void setCouponLanguage(CouponView couponView, String lang);
+
+	void setFieldLanguage(Class<?> tclass, Object obj, Integer type, Long funcId, String lang);
+
+	/**
+	 * 设置优惠券规格展示多语言
+	 */
+	String setCouponGoodsSkuStrLanguage(Long couponId, String lang);
 }

+ 68 - 5
netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsFrontServiceImpl.java

@@ -4,19 +4,21 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.mapper.BackInfoTranslationsMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
+import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.model.entity.BackInfoTranslations;
 import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.UserPageLanguage;
 import com.cyksj.model.manage.views.GoodsDonViewer;
-import com.cyksj.model.views.GoodsDonSkuFrontView;
-import com.cyksj.model.views.GoodsDonSpecFrontView;
-import com.cyksj.model.views.GoodsFrontListCategoryView;
-import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.*;
 import com.cyksj.service.translations.BackInfoTranslationsFrontService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Field;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 项目名: yhlxj2
@@ -29,6 +31,10 @@ import java.util.List;
 public class BackInfoTranslationsFrontServiceImpl implements BackInfoTranslationsFrontService {
 	private final BackInfoTranslationsMapper backInfoTranslationsMapper;
 
+	private final CouponMapper couponMapper;
+
+	private final CouponSkuMapper couponSkuMapper;
+
 	@Override
 	public void setGoodsDetailLanguage(GoodsFrontListView views, String lang) {
 		if (views == null) {
@@ -112,8 +118,24 @@ public class BackInfoTranslationsFrontServiceImpl implements BackInfoTranslation
 		return null;
 	}
 
+	@Override
+	public void setCouponLanguage(CouponView couponView, String lang) {
+		setFieldLanguage(couponView.getClass(), couponView, BackInfoTranslations.Type.coupon.ordinal(), couponView.getId(), lang);
+		if (couponView.getClassificationId() != null) {
+			BackInfoTranslations classificationTranslation = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+					.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.coupon_classification.ordinal())
+					.eq(BackInfoTranslations::getLang, lang)
+					.eq(BackInfoTranslations::getFuncId, couponView.getClassificationId())
+					.eq(BackInfoTranslations::getFieldName, "name"));
+			if (classificationTranslation != null) {
+				couponView.setCouponClassificationName(classificationTranslation.getDesp());
+			}
+		}
+	}
+
+	@Override
 	public void setFieldLanguage(Class<?> tclass, Object obj, Integer type, Long funcId, String lang) {
-		if (StrUtil.isEmpty(lang)) {
+		if (StrUtil.isEmpty(lang) || StrUtil.equals(UserPageLanguage.Language.zh_HK.name(), lang)) {
 			return;
 		}
 		List<BackInfoTranslations> backInfoTranslations = backInfoTranslationsMapper.selectList(Wrappers.lambdaQuery(BackInfoTranslations.class)
@@ -134,4 +156,45 @@ public class BackInfoTranslationsFrontServiceImpl implements BackInfoTranslation
 			});
 		}
 	}
+
+
+	@Override
+	public String setCouponGoodsSkuStrLanguage(Long couponId, String lang) {
+		if (StrUtil.isEmpty(lang) || StrUtil.equals(UserPageLanguage.Language.zh_HK.name(), lang)) {
+			String str = couponSkuMapper.selectGoodsSkuStr(couponId);
+			str = str.replaceAll(",", "/").replaceAll(";", "");
+			return str;
+		}
+
+		List<GoodsDonSku> goodsDonSkus = couponMapper.getCouponSku(couponId);
+		StringBuilder skuGoodsStrSb = new StringBuilder(128);
+		Map<Long, String> map = new HashMap<>();
+		goodsDonSkus.forEach(sku -> {
+			String title = map.get(sku.getGoodsId());
+			if (StrUtil.isEmpty(title)) {
+				BackInfoTranslations backGoodsInfoTranslations = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+						.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.goods.ordinal())
+						.eq(BackInfoTranslations::getLang, lang)
+						.eq(BackInfoTranslations::getFieldName, "title")
+						.eq(BackInfoTranslations::getFuncId, sku.getGoodsId()));
+				if (backGoodsInfoTranslations != null) {
+					title = backGoodsInfoTranslations.getDesp();
+					map.put(sku.getGoodsId(), title);
+				}
+			}
+			BackInfoTranslations backSkuInfoTranslations = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+					.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.sku.ordinal())
+					.eq(BackInfoTranslations::getLang, lang)
+					.eq(BackInfoTranslations::getFieldName, "specVal")
+					.eq(BackInfoTranslations::getFuncId, sku.getId()));
+			if (skuGoodsStrSb.length() > 0) {
+				skuGoodsStrSb.append("/");
+			}
+			if (backSkuInfoTranslations != null) {
+				skuGoodsStrSb.append(title).append(" ").append(backSkuInfoTranslations.getDesp());
+			}
+		});
+
+		return skuGoodsStrSb.toString();
+	}
 }

+ 25 - 146
netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java

@@ -4,7 +4,6 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
@@ -12,14 +11,12 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
-import com.cyksj.mapper.manage.coupon.CouponRecommendMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.model.dto.CouponPopularizeDto;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.request.ChannelPopularizeCouponReq;
 import com.cyksj.model.request.CouponCollectReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
@@ -29,9 +26,9 @@ import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -60,47 +57,25 @@ public class CouponFrontController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
-	private final CouponRecommendMapper couponRecommendMapper;
+	private final HttpServletRequest request;
 
 	private final UserDistributeSharedMapper userDistributeSharedMapper;
 
 	private final UserMapper userMapper;
-
-	/**
-	 * 优惠券领取中心列表
-	 */
-	@GetMapping("/center/list")
-	public Result<Page<CouponActiveView>> couponCenterList(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit) {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		Page<CouponActiveView> page = couponUserMapper.couponCenterList(userId, new Page<>(start, limit));
-		page.getRecords().forEach(data -> {
-			String str = couponSkuMapper.selectGoodsSkuStr(data.getCouponId());
-			data.setGoodsSkuStr(str.replaceAll(",", "/").replaceAll(";", ""));
-			List<CouponSkuView> couponSkus = couponSkuMapper.getGoodsSkuByCouponId(data.getCouponId());
-			try {
-				data.setGoodsSkuIds(Jsons.toJson(couponSkus));
-			} catch (Exception e) {
-
-			}
-		});
-		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
-	}
-
 	/**
 	 * 个人优惠券列表
 	 */
 	@GetMapping("/personal/list")
-	public Result<Page<CouponUserView>> couponPersonalList(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit) {
+	public Result<Page<CouponUserView>> couponPersonalList(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit, Long couponId) {
+		String lang = request.getHeader("lang");
 		Long userId = StpUserUtil.getLoginIdAsLong();
-		Page<CouponUserView> page = couponUserMapper.couponPersonalList(userId, new Page<>(start, limit));
+		Page<CouponUserView> page = couponUserMapper.couponPersonalList(userId, new Page<>(start, limit), couponId);
 		page.getRecords().forEach(data -> {
-			String str = couponSkuMapper.selectGoodsSkuStr(data.getCouponId());
-			data.setGoodsSkuStr(str.replaceAll(",", "/").replaceAll(";", ""));
+			data.setGoodsSkuStr(couponFontService.setCouponSkuLanguage(data.getCouponId(), lang));
 			List<CouponSkuView> couponSkus = couponSkuMapper.getGoodsSkuByCouponId(data.getCouponId());
 			try {
 				data.setGoodsSkuIds(Jsons.toJson(couponSkus));
 			} catch (Exception e) {
-
 			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
@@ -138,65 +113,12 @@ public class CouponFrontController {
 
 	@GetMapping("/available/list")
 	public Result<Page<CouponUserView>> availableCouponList(Long skuId, Long couponId, Boolean isRenew, @RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit) {
+		String lang = request.getHeader("lang");
 		Long userId = StpUserUtil.getLoginIdAsLong();
-		Page<CouponUserView> couponActiveViewList = couponFontService.getAvailableCouponList(skuId, couponId, userId, isRenew, start, limit);
+		Page<CouponUserView> couponActiveViewList = couponFontService.getAvailableCouponList(skuId, couponId, userId, isRenew, start, limit, lang);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponActiveViewList);
 	}
 
-	/**
-	 * 推荐优惠券列表
-	 */
-	@GetMapping("/recommend/list")
-	public Result<Page<CouponRecommendView>> getRecommendList(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit) {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-		Boolean isNewUser = true;
-		if (couponNewUserView != null) {
-			isNewUser = false;
-		}
-		Page<CouponRecommendView> page = couponRecommendMapper.getRecommendCouponViewList(userId, isNewUser, new Page<>(start, limit));
-		page.getRecords().forEach(data -> {
-			if (data.getCouponStatus() == CouponActiveView.CouponStatus.received) {
-				data.setValidStartTime(data.getUserValidStartTime());
-				data.setValidEndTime(data.getUserValidEndTime());
-			}
-			String str = couponSkuMapper.selectGoodsSkuStr(data.getCouponId());
-			data.setGoodsSkuStr(str.replaceAll(",", "/").replaceAll(";", ""));
-			List<CouponSkuView> couponSkus = couponSkuMapper.getGoodsSkuByCouponId(data.getCouponId());
-			try {
-				data.setGoodsSkuIds(Jsons.toJson(couponSkus));
-			} catch (Exception e) {
-
-			}
-		});
-		return GatewayResponse.SUCCESS.newBuilder().toResult(page);
-	}
-
-	/**
-	 * 一键领取推荐优惠券
-	 */
-	@PostMapping("/collect/recommend/whole")
-	@NoSubmit
-	public Result<String> collectWholeRecommendCoupon() {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		couponFontService.collectWholeRecommendCoupon(userId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
-	}
-
-	/**
-	 * 今日推荐优惠券弹窗已弹
-	 */
-	@GetMapping("/get/recommend/appear")
-	public Result<Boolean> recommendIsAppear() {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		String zero = DateUtil.beginOfDay(DateTime.now()).toString();
-		Object exists = redisService.get(RedisService.key.RECOMMEND_COUPON_DAY.getNameFormat(String.format("%s-%s", zero, userId)));
-		if (exists == null) {
-			redisService.set(RedisService.key.RECOMMEND_COUPON_DAY.getNameFormat(String.format("%s-%s", zero, userId)), userId, RedisService.key.RECOMMEND_COUPON_DAY.getTimeout());
-		}
-		return GatewayResponse.SUCCESS.newBuilder().toResult(exists == null ? false : true);
-	}
-
 	/**
 	 * 领取优惠券
 	 */
@@ -207,31 +129,6 @@ public class CouponFrontController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
-	/**
-	 * 领取推荐优惠券
-	 */
-	@PostMapping("/recommend/collect")
-	public Result<String> collectRecommendCoupon(@RequestBody CouponCollectReq couponCollectReq) {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		couponFontService.collectRecommendCoupon(couponCollectReq, userId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
-	}
-
-	/**
-	 * 查询有可以领取的推荐优惠券
-	 */
-	@GetMapping("/recommend/collect/num")
-	public Result<Integer> collectRecommendCouponNum() {
-		Long userId = StpUserUtil.getLoginIdAsLong();
-		CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-		Boolean isNewUser = true;
-		if (couponNewUserView != null) {
-			isNewUser = false;
-		}
-		Integer num = couponFontService.collectRecommendCouponNum(userId, isNewUser);
-		return GatewayResponse.SUCCESS.newBuilder().toResult(num);
-	}
-
 
 	/**
 	 * 优惠码详情
@@ -245,7 +142,7 @@ public class CouponFrontController {
 		}
 		BigDecimal skuMoney = goodsDonSkuView.getMoney();
 		if (goodsDonSkuView.getType() == 2) {
-			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
+			throw BusinessRuntimeException.getInstance("");
 		}
 		CouponPopularizeDto dto = couponMapper.checkExCode(exCode);
 		if (dto == null) {
@@ -272,10 +169,10 @@ public class CouponFrontController {
 						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 					}
 					CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-					if (couponNewUserView != null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
+					if (couponNewUserView != null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));;
 				}
 				if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(dto.getUserId())) {
-					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_popularize_repeat_use_error"));
+					throw BusinessRuntimeException.getInstance("");
 				}
 			}
 		}
@@ -288,13 +185,13 @@ public class CouponFrontController {
 		if (isRenew != null && isRenew) {
 			Coupon.UseScope useScope = dto.getUseScope();
 			if (useScope == Coupon.UseScope.orders) {
-				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_order_error"));
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_only_order_error"));
 			}
 		}
 		if (isRenew == null || !isRenew) {
 			Coupon.UseScope useScope = dto.getUseScope();
 			if (useScope == Coupon.UseScope.renew) {
-				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_renew_order_error"));
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_only_renew_error"));
 			}
 		}
 		if (dto.getIsValidTime() && dto.getValidStartTime().after(DateTime.now())) {
@@ -308,12 +205,7 @@ public class CouponFrontController {
 				.eq(CouponSku::getCouponId, dto.getCouponId())
 				.select(CouponSku::getId).last("limit 1"));
 		if (couponSku == null) {
-			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
-		}
-		if (goodsDonSkuView.getType() == 2) {
-			if (dto.getType() == Coupon.Type.reduce && skuMoney.compareTo(dto.getReduceCondition()) < 0) {
-				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_reduce_money_not_available_error"));
-			}
+			throw BusinessRuntimeException.getInstance("");
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(dto);
 	}
@@ -328,40 +220,27 @@ public class CouponFrontController {
 		}
 		List<CouponView> couponViews = beanSearcher.searchAll(CouponView.class, MapUtils.builder()
 				.field(CouponView::getId, couponIds).op(Operator.InList)
-				.orderBy(CouponView ::getId).desc()
+				.orderBy(CouponView::getId).desc()
 				.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponViews);
 	}
 
-	/**
-	 * 渠道推广用户领取优惠券
-	 */
-	@PostMapping("/channel/popularize/receive")
-	public Result<String> receiveChannelPopularizeCoupon(@RequestBody @Validated ChannelPopularizeCouponReq req) {
+	@GetMapping("/get/coupon/detail/{couponId}")
+	public Result<CouponUserView> getCouponDetailById(@PathVariable Long couponId) {
+		String lang = request.getHeader("lang");
 		long userId = StpUserUtil.getLoginIdAsLong();
-		req.setUserId(userId);
-		couponFontService.receiveChannelPopularizeCoupon(req);
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
-	}
-
-	/**
-	 * 渠道推广一键领取优惠券
-	 */
-	@PostMapping("/channel/popularize/collectAll/{popularizeId}")
-	public Result<String> collectAllChannelCoupons(@PathVariable Long popularizeId) {
-		long userId = StpUserUtil.getLoginIdAsLong();
-		couponFontService.collectAllChannelCoupons(userId, popularizeId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
+		CouponUserView couponUserView = couponFontService.getCouponDetailById(userId, couponId, lang);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(couponUserView);
 	}
 
 	/**
-	 * 新用户福利 优惠券详情展示
+	 * 领取优惠券
 	 */
-	@GetMapping("/get/newUser/welfare")
-	public Result<CouponUserView> getNewUserWelfare() {
+	@PostMapping("/receive/coupon/{couponId}")
+	public Result<CouponUserView> receiveCoupon(@PathVariable Long couponId) {
+		String lang = request.getHeader("lang");
 		long userId = StpUserUtil.getLoginIdAsLong();
-		DateTime now = DateTime.now();
-		CouponUserView couponUserView = couponFontService.getNewUserWelfareCoupons(userId, now);
+		CouponUserView couponUserView = couponFontService.receiveCoupon(userId, couponId, lang);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(couponUserView);
 	}
 }

+ 63 - 114
netflix-web/src/main/java/com/cyksj/web/controller/manage/coupon/CouponController.java

@@ -1,8 +1,8 @@
 package com.cyksj.web.controller.manage.coupon;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
-import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
@@ -12,9 +12,10 @@ import com.cyksj.mapper.manage.coupon.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.CouponActiveReq;
 import com.cyksj.model.request.CouponClassificationReq;
-import com.cyksj.model.request.CouponDistributeReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.coupon.CouponCommonService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
+import com.cyksj.service.translations.BackInfoTranslationsService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
@@ -27,8 +28,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.validation.constraints.Min;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /*
@@ -60,6 +64,10 @@ public class CouponController {
 
 	private final CouponClassificationMapper couponClassificationMapper;
 
+	private final BackInfoTranslationsService backInfoTranslationsService;
+
+	private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
+
 	private final OrderDonMapper orderDonMapper;
 
 	private final HttpServletRequest request;
@@ -95,7 +103,12 @@ public class CouponController {
 	@PutMapping
 	@Log(module = "优惠券/编辑优惠券", businessType = BusinessType.PUT, isSaveRequestData = true)
 	public Result<String> putCoupon(@RequestBody @Validated Coupon coupon) throws Exception {
-		couponCommonService.updateCoupon(coupon);
+		String lang = request.getHeader("lang");
+		if (!StrUtil.equals(UserPageLanguage.Language.zh_HK.name(), lang)) {
+			backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.coupon, coupon.getId(), coupon, lang);
+		} else {
+			couponCommonService.updateCoupon(coupon);
+		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult("修改优惠券成功");
 	}
 
@@ -109,71 +122,26 @@ public class CouponController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("发放优惠券成功");
 	}
 
-	/**
-	 * 优惠券 设置为推荐优惠券
-	 */
-	@PutMapping("/set/hot/{couponId}")
-	@Log(module = "优惠券/推荐优惠券", businessType = BusinessType.POST)
-	public Result<String> setHotCoupon(@PathVariable @Min(value = 1) Long couponId) {
-		couponCommonService.setHotCoupon(couponId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("推荐优惠券成功");
-	}
-
-	/**
-	 * 优惠券关联固定推广者
-	 */
-	@PostMapping("/set/relation")
-	public Result<String> setPopularizeRelation(@RequestBody CouponDistributeReq couponDistributeReq) {
-		couponCommonService.setPopularizeRelation(couponDistributeReq);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("优惠券关联固定推广者成功");
-	}
-
-	/**
-	 * 设置固定推广者兑换码
-	 */
-	@PutMapping("/set/relation/exCode")
-	public Result<String> setPopularizeRelationCode(@RequestBody CouponDistributePopularize couponDistributePopularize) {
-		couponCommonService.setPopularizeRelationCode(couponDistributePopularize);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("设置固定推广者兑换码成功");
-	}
-
-	/**
-	 * 关联某优惠券列表
-	 */
-	@GetMapping("/get/relation/list")
-	public Result<SearchResult<CouponDistributePopularizeView>> getRelationList(HttpServletRequest request) {
-		SearchResult<CouponDistributePopularizeView> search = beanSearcher.search(CouponDistributePopularizeView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		search.getDataList().forEach(data -> {
-			Integer usedNum = orderDonMapper.selectCouponCodeUserNum(data.getId(), Constant.noOrderAllStatus);
-			data.setUsedNum(usedNum);
-		});
-		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-	}
-
-	/**
-	 * 删除固定推广者关联
-	 */
-	@DeleteMapping("/relation/del/{relationId}")
-	public Result<String> deleteRelationById(@PathVariable Long relationId) {
-		couponDistributePopularizeMapper.deleteById(relationId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("删除推广者关联成功");
-	}
-
 	/**
 	 * 优惠券列表
 	 */
 	@GetMapping
 	public Result<SearchResult<CouponView>> couponList(HttpServletRequest request) {
+		String lang = request.getHeader("lang");
 		SearchResult<CouponView> search = beanSearcher.search(CouponView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
 			data.setRelationNum(couponDistributePopularizeMapper.selectCount(Wrappers.lambdaQuery(CouponDistributePopularize.class).eq(CouponDistributePopularize::getCouponId, data.getId())));
 
-			Integer usedNum = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
-					.eq(CouponUser::getCouponId, data.getId()).eq(CouponUser::getStatus, CouponUser.Status.used));
+			Map<String, Long> couponUserNumData = couponUserMapper.selectCouponUserNumData(data.getId());
+			Integer usedNum = Integer.parseInt(couponUserNumData.get("usedNum").toString());
 			data.setUsedNum(usedNum);
-
+			Integer receiptNum = Integer.parseInt(couponUserNumData.get("receiptNum").toString());
+			data.setReceiptNum(receiptNum);
 			List<GoodsDonSkuView> skuViewList = couponSkuMapper.selectGoodsSkuViewList(data.getId());
 			data.setSkuViewList(skuViewList);
+			if (!StrUtil.equals(UserPageLanguage.Language.zh_HK.name(), lang)) {
+				backInfoTranslationsFrontService.setCouponLanguage(data, lang);
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -245,62 +213,6 @@ public class CouponController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("失效发放优惠券成功");
 	}
 
-
-	/**
-	 * 推荐发放列表
-	 */
-	@GetMapping("/recommend/list")
-	public Result<SearchResult<CouponRecommendView>> couponRecommendList(HttpServletRequest request) {
-		SearchResult<CouponRecommendView> search = beanSearcher.search(CouponRecommendView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		search.getDataList().forEach(data -> {
-			Integer usedNum = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
-					.eq(CouponUser::getRecommendId, data.getId()).eq(CouponUser::getStatus, CouponUser.Status.used));
-			Integer receiptNum = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
-					.eq(CouponUser::getRecommendId, data.getId()));
-			data.setReceiptNum(receiptNum);
-			data.setUsedNum(usedNum);
-
-			List<GoodsDonSkuView> skuViewList = couponSkuMapper.selectGoodsSkuViewList(data.getCouponId());
-			data.setSkuViewList(skuViewList);
-		});
-		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-	}
-
-	/**
-	 * 推荐优惠券设置/取消推荐
-	 */
-	@PutMapping("/recommend/putStatus/{recommendId}")
-	public Result<String> putRecommendStatusById(@PathVariable Long recommendId) {
-		CouponRecommend couponRecommend = couponRecommendMapper.selectById(recommendId);
-		if (couponRecommend == null || !couponRecommend.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该推荐优惠券不存在");
-		}
-		couponRecommend.setStatus(!couponRecommend.getStatus());
-		couponRecommendMapper.updateById(couponRecommend);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
-	}
-
-	/**
-	 * 删除推荐优惠券
-	 */
-	@DeleteMapping("/recommend/del/{recommendId}")
-	public Result<String> deleteRecommendById(@PathVariable Long recommendId) {
-		CouponRecommend couponRecommend = couponRecommendMapper.selectById(recommendId);
-		if (couponRecommend == null || !couponRecommend.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该推荐优惠券不存在");
-		}
-		if (couponRecommend.getStatus()) {
-			throw BusinessRuntimeException.getInstance("取消推荐优惠券,才可删除");
-		}
-		couponRecommendMapper.deleteById(recommendId);
-		Coupon coupon = couponMapper.selectById(couponRecommend.getCouponId());
-		if (coupon != null && coupon.getDeleted()) {
-			coupon.setHotStatus(false);
-			couponMapper.updateById(coupon);
-		}
-		return GatewayResponse.SUCCESS.newBuilder().toResult("删除推荐优惠券成功");
-	}
-
 	/**
 	 * 新增优惠券分类
 	 */
@@ -358,13 +270,19 @@ public class CouponController {
 	 */
 	@PutMapping("/update/classification")
 	public Result<String> updateClassification(@RequestBody @Validated CouponClassification classification) {
+		String lang = request.getHeader("lang");
 		Long classificationId = classification.getId();
 		Assert.notNull(classificationId, "分类id为空");
 		CouponClassification couponClassification = couponClassificationMapper.selectById(classificationId);
 		if (couponClassification == null) {
 			throw BusinessRuntimeException.getInstance("该分类不存在");
 		}
-		couponClassificationMapper.updateById(classification);
+		//多语言设置
+		if (!StrUtil.equals(UserPageLanguage.Language.zh_HK.name(), lang)) {
+			backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.coupon_classification, classification.getId(), classification, lang);
+		} else {
+			couponClassificationMapper.updateById(classification);
+		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑分类成功");
 	}
 
@@ -385,4 +303,35 @@ public class CouponController {
 		List<CouponClassification> CouponClassifications = beanSearcher.searchAll(CouponClassification.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(CouponClassifications);
 	}
+
+	/**
+	 * 优惠券领取详情
+	 */
+	@GetMapping("/get/receipt/detail/{couponId}")
+	public Result<SearchResult<CouponReceiptDetailView>> getReceiptDetail(@PathVariable Long couponId) {
+		SearchResult<CouponReceiptDetailView> search = beanSearcher.search(CouponReceiptDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.put("cid",String.format("and id = %s", couponId))
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 优惠券使用详情
+	 */
+	@GetMapping("/get/used/detail/{couponId}")
+	public Result<SearchResult<CouponUsedDetailView>> getUsedDetail(@PathVariable Long couponId) {
+		SearchResult<CouponUsedDetailView> search = beanSearcher.search(CouponUsedDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.put("cid",String.format("and id = %s", couponId))
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 使用优惠券订单金额
+	 */
+	@GetMapping("/get/used/money/{couponId}")
+	public Result<BigDecimal> getUsedMoney(@PathVariable Long couponId) {
+		BigDecimal money = Optional.ofNullable(orderDonMapper.getCouponUsedMoney(couponId)).orElse(BigDecimal.ZERO);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(money.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
+	}
 }