Przeglądaj źródła

Merge branch 'master' into pre

zoujiajian 3 lat temu
rodzic
commit
fe8572cb42
35 zmienionych plików z 588 dodań i 134 usunięć
  1. 12 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/EquipmentUserDistributeTransportBenefitsMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/EquipmentUserPayRecordMapper.java
  4. 7 2
      netflix-dao/src/main/java/com/cyksj/model/dto/EquipmentConfigDto.java
  5. 0 23
      netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserChanceRecord.java
  6. 44 0
      netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserDistributeTransportBenefits.java
  7. 68 0
      netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserPayRecord.java
  8. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  9. 7 1
      netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonSearchView.java
  11. 76 0
      netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeFrontView.java
  12. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/EquipmentUserDistributeDetailView.java
  13. 4 7
      netflix-dao/src/main/java/com/cyksj/model/views/EquipmentUserDistributeViews.java
  14. 3 0
      netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java
  15. 120 54
      netflix-service/src/main/java/com/cyksj/service/distribute/equipment/impl/EquipmentDistributeServiceImpl.java
  16. 53 0
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  17. 19 7
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  18. 1 1
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  19. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  20. 2 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonCommentServiceImpl.java
  21. 1 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java
  22. 32 5
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  23. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/post/PostDataFactory.java
  24. 2 3
      netflix-service/src/main/java/com/cyksj/service/order/post/impl/djPostDataService.java
  25. 1 2
      netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java
  26. 1 1
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  27. 23 3
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  28. 7 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  29. 6 3
      netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java
  30. 12 4
      netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java
  31. 9 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  32. 5 7
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/EquipmentController.java
  33. 6 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  34. 7 3
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  35. 23 1
      netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

+ 12 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -134,4 +134,16 @@ public interface Constant {
 	 * 特殊格式平台邮箱
 	 */
 	String SPECIAL_GOODS_ACCOUNT_IMPORT_KEY = "special_goods_account_import_key";
+
+	String BALANCE_NOTIFY_MSG = "恭喜您 %s元余额已到账 购买时可抵现 快去使用吧!【银河录像局】";
+
+	/**
+	 * 360渠道名称
+	 */
+	String CHANNEL_NAME_360 = "360";
+
+	/**
+	 * 360渠道折扣
+	 */
+	String CHANNEL_360_DISCOUNT = "channel_360_discount";
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/EquipmentUserDistributeTransportBenefitsMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.equipment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.EquipmentUserDistributeTransportBenefits;
+
+/*
+ *项目名: netflix
+ *文件名: EquipmentUserDistributeTransportBenefitsMapper
+ *创建者: JavaZou
+ *创建时间:2023/8/9 10:05
+ */
+public interface EquipmentUserDistributeTransportBenefitsMapper extends BaseMapper<EquipmentUserDistributeTransportBenefits> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/EquipmentUserPayRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.equipment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.EquipmentUserPayRecord;
+
+/*
+ *项目名: netflix
+ *文件名: EquipmentUserPayRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/8/9 18:27
+ */
+public interface EquipmentUserPayRecordMapper extends BaseMapper<EquipmentUserPayRecord> {
+}

+ 7 - 2
netflix-dao/src/main/java/com/cyksj/model/dto/EquipmentConfigDto.java

@@ -4,7 +4,7 @@ import com.cyksj.model.entity.GoodsDonSku;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.List;
+import java.math.BigDecimal;
 import java.util.Set;
 
 /*
@@ -24,5 +24,10 @@ public class EquipmentConfigDto {
 	/**
 	 * 车票时长权益配置
 	 */
-	private List<GoodsDonSku> skuList;
+	private Set<GoodsDonSku> skuList;
+
+	/**
+	 * 余额
+	 */
+	private BigDecimal balance;
 }

+ 0 - 23
netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserChanceRecord.java

@@ -1,14 +1,8 @@
 package com.cyksj.model.entity;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
-import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Date;
-
 /*
  *项目名: netflix
  *文件名: EquipmentUserChanceRecord
@@ -17,38 +11,21 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "equipment_user_chance_record er")
 public class EquipmentUserChanceRecord extends BaseEntity{
 	/**
 	 * 受益人id
 	 */
-	@DbField("er.share_id")
 	private Long shareId;
 
 	/**
 	 * 被邀请人id
 	 */
-	@DbField("er.user_id")
 	private Long userId;
 
-	@DbField("er.order_id")
 	private Long orderId;
 
-	@DbField("er.status")
 	private Status status;
 
-	@DbIgnore
-	@TableField(exist = false)
-	private String nickname;
-
-	@DbIgnore
-	@TableField(exist = false)
-	private Date payTime;
-
-	@DbIgnore
-	@TableField(exist = false)
-	private String headImg;
-
 
 	@Getter
 	public enum Status {

+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserDistributeTransportBenefits.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: EquipmentUserDistributeTransportBenefits
+ *创建者: JavaZou
+ *创建时间:2023/8/9 10:03
+ */
+@Getter
+@Setter
+public class EquipmentUserDistributeTransportBenefits extends BaseEntity{
+	/**
+	 * 实物分销人id
+	 */
+	private Long shareId;
+
+	private Long orderId;
+
+	private BigDecimal balance;
+
+	private Status status;
+
+	private Date sendTime;
+
+	@Getter
+	public enum Status {
+		hasPayment("已付款"),
+		transport("已发货"),
+		refund("已退款"),
+		complete("已完成"),
+		;
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserPayRecord.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: EquipmentUserPayRecord
+ *创建者: JavaZou
+ *创建时间:2023/8/9 18:25
+ */
+@Getter
+@Setter
+@SearchBean(tables = "equipment_user_pay_record er")
+public class EquipmentUserPayRecord extends BaseEntity{
+	/**
+	 * 受益人id
+	 */
+	@DbField("er.share_id")
+	private Long shareId;
+
+	/**
+	 * 被邀请人id
+	 */
+	@DbField("er.user_id")
+	private Long userId;
+
+	@DbField("er.order_id")
+	private Long orderId;
+
+	@DbField("er.status")
+	private Status status;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String nickname;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private Date payTime;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String headImg;
+
+	@DbField("er.type")
+	private Integer type;
+
+
+	@Getter
+	public enum Status {
+		hasPayment("已购买"),
+		waiting("待到账"),
+		refund("已退款"),
+		;
+		String msg;
+
+		Status(String msg) {
+			this.msg = msg;
+		}
+	}
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -6,6 +6,7 @@ import com.cyksj.model.views.GoodsDiscountPlusPurchaseRelationFrontView;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,6 +20,7 @@ import java.util.List;
 @Getter
 @Setter
 @SearchBean(tables = "goods_don_sku")
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class GoodsDonSku extends BaseEntity {
 
     private Long goodsId;

+ 7 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java

@@ -22,8 +22,14 @@ public class UserBalanceSourceRecord extends BaseEntity{
 
 	@Getter
 	public enum Source {
+		payment("下单"),
+		balance("余额支付"),
 		refund("订单退款"),
-		clear_valid("车票未到期清除")
+		close("订单关闭"),
+		clear_valid("车票未到期清除"),
+		ds_transport("分销实物发货"),
+		follow_task("关注引导"),
+		rd_comment("实物评论"),
 		;
 		String desc;
 

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonSearchView.java

@@ -152,4 +152,10 @@ public class OrderDonSearchView {
 
 	@DbIgnore
 	private List<GoodsDonSkuView> benefitsViews;
+
+	/**
+	 * 关联兑换码
+	 */
+	@DbField("o.ex_code")
+	private String exCode;
 }

+ 76 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ChannelPopularizeFrontView.java

@@ -0,0 +1,76 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: ChannelPopularizeFrontView
+ *创建者: JavaZou
+ *创建时间:2023/8/11 12:10
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from channel_popularize where :id:) cp left join channel c on c.id = cp.channel_id")
+public class ChannelPopularizeFrontView {
+	/**
+	 * 渠道id
+	 */
+	@DbField("cp.channel_id")
+	private Long channelId;
+
+	@DbField("c.name")
+	private String channelName;
+
+	/**
+	 * 链接名称
+	 */
+	@DbField("cp.name")
+	private String name;
+
+	/**
+	 * url
+	 */
+	@DbField("cp.url")
+	private String url;
+
+	/**
+	 * 样式
+	 */
+	@DbField("cp.modality")
+	private String modality;
+
+	/**
+	 * 支付方式
+	 */
+	@DbField("cp.pay_method")
+	private String payMethod;
+
+	/**
+	 * 是否展示规格弹窗
+	 */
+	@DbField("cp.is_show_sku")
+	private Boolean isShowSku;
+
+	/**
+	 * 是否隐藏平台logo
+	 */
+	@DbField("cp.is_show_logo")
+	private Boolean isShowLogo;
+
+	/**
+	 * 绑定的优惠券
+	 */
+	@DbField("cp.coupon_ids")
+	@JsonIgnore
+	private String couponIds;
+
+	@DbIgnore
+	private List<CouponTfPopularizeView> coupons;
+}

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

@@ -18,7 +18,7 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "equipment_user_chance_record ecr left join order_don od on od.id = ecr.order_id")
+@SearchBean(tables = "equipment_user_pay_record ecr left join order_don od on od.id = ecr.order_id")
 public class EquipmentUserDistributeDetailView {
 	@DbField("ecr.id")
 	private Long recordId;

+ 4 - 7
netflix-dao/src/main/java/com/cyksj/model/views/EquipmentUserDistributeViews.java

@@ -6,7 +6,6 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Date;
 import java.util.List;
 
 /*
@@ -17,12 +16,13 @@ import java.util.List;
  */
 @Getter
 @Setter
-@SearchBean(tables = "equipment_user_chance ec")
+@SearchBean(tables = "equipment_user_distribute_invite_record ec left join user u on u.id = ec.share_id",
+		groupBy = "ec.share_id,u.nickname")
 public class EquipmentUserDistributeViews {
-	@DbField("ec.user_id")
+	@DbField("ec.share_id")
 	private Long shareId;
 
-	@DbIgnore
+	@DbField("u.nickname")
 	private String nickname;
 
 	/**
@@ -33,7 +33,4 @@ public class EquipmentUserDistributeViews {
 
 	@DbIgnore
 	private List<EquipmentBenefitsView> benefitsViews;
-
-	@DbField("ec.created_time")
-	private Date createdTime;
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -128,6 +128,9 @@ public class CouponFontServiceImpl implements CouponFontService {
 		Long goodsId = null;
 		//实物还是虚物
 		GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuId).op(Operator.Equal).build());
+		if (goodsDonSkuView == null) {
+			return new Page<>();
+		}
 		BigDecimal skuMoney = goodsDonSkuView.getMoney();
 		if (goodsDonSkuView.getType() == 2) {
 			goodsId = goodsDonSkuView.getGoodsId();

+ 120 - 54
netflix-service/src/main/java/com/cyksj/service/distribute/equipment/impl/EquipmentDistributeServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.distribute.equipment.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -9,10 +10,7 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserChanceMapper;
-import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserChanceRecordMapper;
-import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserDistributeInviteRecordMapper;
-import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserReceiveBenefitsRecordMapper;
+import com.cyksj.mapper.manage.distribute.equipment.*;
 import com.cyksj.model.dto.EquipmentConfigDto;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.RealGoodsOrderDonView;
@@ -66,6 +64,10 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 
 	private final BeanSearcher beanSearcher;
 
+	private final EquipmentUserDistributeTransportBenefitsMapper transportBenefitsMapper;
+
+	private final EquipmentUserPayRecordMapper equipmentUserPayRecordMapper;
+
 	@Override
 	public void saveDistributionInvitation(Long sharedId, Boolean isNewUser, Long userId) {
 		if (sharedId.equals(userId)) {
@@ -108,30 +110,7 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 		EquipmentUserDistributeInviteRecord record = getDistributeRecord(userId);
 		if (record != null) {
 			Long sharId = record.getShareId();
-			if (saveInviteRecord(sharId, userId, orderId, EquipmentUserChanceRecord.Status.hasPayment)) {
-				SysConfig config = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
-						.eq(SysConfig::getSysKey, Constant.EQUIPMENT_DISTRIBUTE_KEY).last("limit 1"));
-				String sysValue = config.getSysValue();
-				//未配置车票权益 不增加次数
-				if (StrUtil.isEmpty(sysValue)) {
-					return;
-				}
-				EquipmentUserChance chance = equipmentUserChanceMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserChance.class)
-						.eq(EquipmentUserChance::getUserId, sharId)
-						.last("limit 1"));
-				if (chance == null) {
-					try {
-						chance = new EquipmentUserChance();
-						chance.setUserId(sharId);
-						chance.setNum(1);
-						equipmentUserChanceMapper.insert(chance);
-					} catch (DuplicateKeyException e) {
-						equipmentUserChanceMapper.addUserChance(sharId);
-					}
-				} else {
-					equipmentUserChanceMapper.addUserChance(sharId);
-				}
-			}
+			saveInviteRecord(sharId, userId, orderId, 1);
 		}
 	}
 
@@ -140,13 +119,7 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 		EquipmentUserDistributeInviteRecord record = getDistributeRecord(userId);
 		if (record != null) {
 			Long sharId = record.getShareId();
-			if (saveInviteRecord(sharId, userId, orderId, EquipmentUserChanceRecord.Status.refund)) {
-				Integer update = equipmentUserChanceMapper.subUserChance(sharId);
-				if (update == 0) {
-					//扣除权益
-					deductUserBenefits(sharId, orderId);
-				}
-			}
+			saveInviteRecord(sharId, userId, orderId, 2);
 		}
 	}
 
@@ -161,22 +134,54 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 		return record;
 	}
 
-	public Boolean saveInviteRecord(Long sharId, Long userId, Long orderId, EquipmentUserChanceRecord.Status status) {
-		EquipmentUserChanceRecord record = equipmentUserChanceRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserChanceRecord.class)
-				.eq(EquipmentUserChanceRecord::getUserId, userId)
-				.eq(EquipmentUserChanceRecord::getStatus, status)
-				.eq(EquipmentUserChanceRecord::getOrderId, orderId)
-				.last("limit 1"));
-		if (record != null) {
-			return false;
+	public void saveInviteRecord(Long sharId, Long userId, Long orderId, Integer type) {
+		EquipmentConfigDto equipmentConfigDto = checkEquipmentConfigDto();
+		Integer benefitsType = 1;
+		if (equipmentConfigDto != null && type == 1) {
+			//配置车票权益
+			if (CollUtil.isNotEmpty(equipmentConfigDto.getSkuList())) {
+				addTicketBenefitsChance(sharId, userId, orderId, EquipmentUserChanceRecord.Status.hasPayment);
+			}
+
+			//已配置余额  实物发货 发送余额
+			if (equipmentConfigDto.getBalance() != null && equipmentConfigDto.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+				addBalanceBenefits(sharId, orderId, equipmentConfigDto.getBalance(), EquipmentUserDistributeTransportBenefits.Status.hasPayment);
+				benefitsType = 2;
+			}
+			EquipmentUserPayRecord record = new EquipmentUserPayRecord();
+			record.setShareId(sharId);
+			record.setUserId(userId);
+			record.setStatus(EquipmentUserPayRecord.Status.hasPayment);
+			record.setOrderId(orderId);
+			//1、车票权益,2、余额
+			record.setType(benefitsType);
+			equipmentUserPayRecordMapper.insert(record);
+		}
+		if (type == 2) {
+			//是否有余额权益
+			EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
+					.eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderId).last("limit 1"));
+			if (transportBenefits != null && transportBenefits.getStatus() != EquipmentUserDistributeTransportBenefits.Status.complete) {
+				transportBenefits.setStatus(EquipmentUserDistributeTransportBenefits.Status.refund);
+				transportBenefitsMapper.updateById(transportBenefits);
+			}
+			//是否有车票权益
+			int update = equipmentUserChanceRecordMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserChanceRecord.class)
+					.set(EquipmentUserChanceRecord::getStatus, EquipmentUserChanceRecord.Status.refund)
+					.eq(EquipmentUserChanceRecord::getOrderId, orderId)
+					.eq(EquipmentUserChanceRecord::getStatus, EquipmentUserChanceRecord.Status.hasPayment));
+			if (update > 0) {
+				update = equipmentUserChanceMapper.subUserChance(sharId);
+				if (update == 0) {
+					//扣除权益
+					deductUserBenefits(sharId, orderId);
+				}
+			}
+			equipmentUserPayRecordMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserPayRecord.class)
+					.set(EquipmentUserPayRecord::getStatus, EquipmentUserPayRecord.Status.refund)
+					.eq(EquipmentUserPayRecord::getOrderId, orderId)
+					.ne(EquipmentUserPayRecord::getStatus, EquipmentUserChanceRecord.Status.refund));
 		}
-		record = new EquipmentUserChanceRecord();
-		record.setShareId(sharId);
-		record.setUserId(userId);
-		record.setStatus(status);
-		record.setOrderId(orderId);
-		equipmentUserChanceRecordMapper.insert(record);
-		return true;
 	}
 
 	public void deductUserBenefits(Long userId, Long orderId) {
@@ -233,12 +238,73 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 			EquipmentConfigDto equipmentConfigDto = null;
 			try {
 				equipmentConfigDto = Jsons.parseObject(config.getSysValue(), EquipmentConfigDto.class);
-				equipmentConfigDto.getCouponIds().forEach(couponId->{
-					couponCommonService.sendCouponToUser(userId, couponId, null, null, null, CouponUser.Channel.equipment);
-				});
-				redisService.set(RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getNameFormat(userId), userId, RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getTimeout());
+				if (equipmentConfigDto != null && CollUtil.isNotEmpty(equipmentConfigDto.getCouponIds())) {
+					equipmentConfigDto.getCouponIds().forEach(couponId -> {
+						couponCommonService.sendCouponToUser(userId, couponId, null, null, null, CouponUser.Channel.equipment);
+					});
+					redisService.set(RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getNameFormat(userId), userId, RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getTimeout());
+				}
 			} catch (Exception e) {
 			}
 		});
 	}
+
+	public EquipmentConfigDto checkEquipmentConfigDto() {
+		//是否有配置车票权益
+		SysConfig config = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.EQUIPMENT_DISTRIBUTE_KEY).last("limit 1"));
+		if (config == null) {
+			return null;
+		}
+		String sysValue = config.getSysValue();
+		//未配置权益
+		if (StrUtil.isEmpty(sysValue)) {
+			return null;
+		}
+		EquipmentConfigDto equipmentConfigDto = null;
+		try {
+			equipmentConfigDto = Jsons.parseObject(sysValue, EquipmentConfigDto.class);
+		} catch (Exception e) {
+			return null;
+		}
+		return equipmentConfigDto;
+	}
+
+	public void addBalanceBenefits(Long sharId, Long orderId, BigDecimal balance, EquipmentUserDistributeTransportBenefits.Status status) {
+		log.info("分销人:{}记录分享有礼实物订单:{}余额权益,待发货后发送", sharId, orderId);
+		EquipmentUserDistributeTransportBenefits transportBenefits = new EquipmentUserDistributeTransportBenefits();
+		transportBenefits.setShareId(sharId);
+		transportBenefits.setOrderId(orderId);
+		transportBenefits.setStatus(status);
+		transportBenefits.setBalance(balance);
+		transportBenefitsMapper.insert(transportBenefits);
+	}
+
+	public void addTicketBenefitsChance(Long sharId, Long userId, Long orderId, EquipmentUserChanceRecord.Status status) {
+		try {
+			EquipmentUserChanceRecord record = new EquipmentUserChanceRecord();
+			record.setShareId(sharId);
+			record.setUserId(userId);
+			record.setStatus(status);
+			record.setOrderId(orderId);
+			equipmentUserChanceRecordMapper.insert(record);
+
+			EquipmentUserChance chance = equipmentUserChanceMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserChance.class)
+					.eq(EquipmentUserChance::getUserId, sharId)
+					.last("limit 1"));
+			if (chance == null) {
+				try {
+					chance = new EquipmentUserChance();
+					chance.setUserId(sharId);
+					chance.setNum(1);
+					equipmentUserChanceMapper.insert(chance);
+				} catch (DuplicateKeyException e) {
+					equipmentUserChanceMapper.addUserChance(sharId);
+				}
+			} else {
+				equipmentUserChanceMapper.addUserChance(sharId);
+			}
+		} catch (DuplicateKeyException e) {
+		}
+	}
 }

+ 53 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -11,11 +11,13 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
 import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
 import com.cyksj.model.entity.*;
@@ -81,6 +83,10 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final GroupRelationFrontService groupRelationFrontService;
 
+	private final ChannelPopularizeMapper channelPopularizeMapper;
+
+	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) {
@@ -153,6 +159,22 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				.eq(OrderDon::getExCode, exchangeCode.getCode())
 				.notIn(OrderDon::getStatus, Constant.noOrderStatus)
 				.last("limit 1"));
+//		Long popularizeId = orderDon.getPopularizeId();
+//
+//		//360 渠道兑换规则验证.
+//		if(popularizeId != null && popularizeId != 0){
+//			String channel = channelPopularizeMapper.selectChannelByPid(popularizeId);
+//			if (Constant.CHANNEL_NAME_360.equals(channel)) {
+//				//查询该用户之前是否存在订单.
+//				Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+//						.eq(OrderDon::getUserId, userId)
+//						.notIn(OrderDon::getStatus, Constant.noOrderStatus));
+//				if (count > 0) {
+//					throw new BusinessRuntimeException("您不符合360活动条件.");
+//				}
+//			}
+//		}
+
 		if (orderDon != null && orderDon.getStatus() == OrderDon.Status.refund) {
 			throw BusinessRuntimeException.getInstance("您的订单已退款,无法使用该兑换码");
 		}
@@ -237,6 +259,37 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			orderDon.setUserId(userId);
 			orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 			orderDonMapper.updateById(orderDon);
+			if (orderDon.getIsDp()) {
+				//是否已经发送优惠加购车票
+				OrderDiscountPlusPurchaseSkuRelation purchaseSkuRelation = orderDiscountPlusPurchaseSkuRelationMapper.selectOne(Wrappers.lambdaQuery(OrderDiscountPlusPurchaseSkuRelation.class)
+						.eq(OrderDiscountPlusPurchaseSkuRelation::getOrderId, orderDon.getId()));
+				if (purchaseSkuRelation != null) {
+					String plusSkuIdsStr = purchaseSkuRelation.getPlusSkuIds();
+					String relationIdsStr = purchaseSkuRelation.getRelationIds();
+					if (StrUtil.isNotEmpty(plusSkuIdsStr) && StrUtil.isEmpty(relationIdsStr)) {
+						try {
+							List<Long> plusSkuIds = Jsons.parseList(plusSkuIdsStr, Long.class);
+							//发送优惠加购 规格车票
+							List<Long> dis_relation_ids = new ArrayList<>();
+							plusSkuIds.forEach(plus_skuId -> {
+								GoodsDonSku plus_sku = goodsDonSkuMapper.selectById(plus_skuId);
+								if (plus_sku == null) {
+									log.error("订单id:{}优惠加购规格已被删除 skuId:{},车票未发送", orderDon.getId(), plus_skuId);
+									return;
+								}
+								GroupsRelation relationNoOrder = getRelationNoOrder(plus_sku, orderDon.getUserId());
+								dis_relation_ids.add(relationNoOrder.getId());
+							});
+							//保存订单关联优惠加购车票
+							orderDiscountPlusPurchaseSkuRelationMapper.update(null, Wrappers.lambdaUpdate(OrderDiscountPlusPurchaseSkuRelation.class)
+									.set(OrderDiscountPlusPurchaseSkuRelation::getRelationIds, dis_relation_ids.toString())
+									.eq(OrderDiscountPlusPurchaseSkuRelation::getOrderId, orderDon.getId())
+									.isNull(OrderDiscountPlusPurchaseSkuRelation::getRelationIds));
+						} catch (Exception e) {
+						}
+					}
+				}
+			}
 		} else {
 			/* 生成订单 */
 			String donNo = SEQUENCE.nextId().toString();

+ 19 - 7
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -28,6 +28,7 @@ import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserDistributeTransportBenefitsMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
 import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
 import com.cyksj.model.entity.*;
@@ -47,7 +48,6 @@ import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.paypal.PayPalService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.stripe.StripeService;
-import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.wechat.WeChatService;
 import lombok.RequiredArgsConstructor;
@@ -80,8 +80,6 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final GoodsDonStockService goodsDonStockService;
 
-    private final TemplateCommonService templateCommonService;
-
     private final GoodsDonSkuMapper goodsDonSkuMapper;
 
     private final UserRealOrderBenefitsService userRealOrderBenefitsService;
@@ -136,6 +134,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
 
+    private final EquipmentUserDistributeTransportBenefitsMapper transportBenefitsMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -216,6 +216,20 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             waitingSendPoints.setIsDelivery(true);
             distributeWaitingSendPointsMapper.updateById(waitingSendPoints);
         }
+        //分销有礼 分销实物是否有发货后用户权益
+        EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
+                .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
+                .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment).last("limit 1"));
+        if (transportBenefits != null) {
+            if (transportBenefits.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                //7天后余额到账
+                transportBenefitsMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserDistributeTransportBenefits.class)
+                        .set(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.transport)
+                        .set(EquipmentUserDistributeTransportBenefits::getSendTime, DateUtil.offsetDay(DateTime.now(), 7))
+                        .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
+                        .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment));
+            }
+        }
         return orderDonWaybill;
     }
 
@@ -573,7 +587,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
             //若存在余额支付,退还余额
             if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance());
+                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.balance);
             }
             try {
                 marketFrontService.subSpecificChanceNum(orderDon.getUserId(), orderDon.getId(), orderDon.getGoodsId(), orderDon.getUpdateTime());
@@ -587,9 +601,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
             if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
                 if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
-                    userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getRefundBalance());
-                    //退款余额时,记录
-                    userBenefitsService.recordBalanceBySource(orderDon.getUserId(), orderDon.getRefundBalance(), UserBalanceSourceRecord.Source.clear_valid);
+                    userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getRefundBalance(), UserBalanceSourceRecord.Source.refund);
                 }
             } else {
                 //余额退款不需要扣除积分

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java

@@ -154,7 +154,7 @@ public class TaskServiceImpl implements TaskService {
 						if (taskView != null) {
 							if ("关注引导".equals(taskView.getTypeName()) && taskView.getBalance().compareTo(BigDecimal.ZERO) > 0) {
 								//发送余额
-								userBenefitsService.addUserBalance(dbPlatVerify.getUserId(), taskView.getBalance());
+								userBenefitsService.addUserBalance(dbPlatVerify.getUserId(), taskView.getBalance(), UserBalanceSourceRecord.Source.follow_task);
 								record.setBalance(taskView.getBalance());
 							}
 						}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -44,7 +44,7 @@ public interface OrderDonService extends IService<OrderDon> {
     /**
      * 关闭订单
      */
-    void closeOrder(Long orderId);
+    void closeOrder(Long orderId, Long userId);
 
     OrderDon renewal(OrderPayRequest request) throws Exception;
 

+ 2 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonCommentServiceImpl.java

@@ -7,6 +7,7 @@ import com.cyksj.mapper.OrderCommentMapper;
 import com.cyksj.mapper.OrderCommentRewardConfigMapper;
 import com.cyksj.model.entity.OrderComment;
 import com.cyksj.model.entity.OrderCommentRewardConfig;
+import com.cyksj.model.entity.UserBalanceSourceRecord;
 import com.cyksj.service.order.OrderDonCommentService;
 import com.cyksj.service.user.UserBenefitsService;
 import lombok.RequiredArgsConstructor;
@@ -63,7 +64,7 @@ public class OrderDonCommentServiceImpl implements OrderDonCommentService {
 						.eq(OrderCommentRewardConfig::getGoodsId, goodsId).last("limit 1"));
 				if (orderCommentRewardConfig != null) {
 					BigDecimal balance = orderCommentRewardConfig.getBalance();
-					userBenefitsService.addUserBalance(orderComment.getUserId(), balance);
+					userBenefitsService.addUserBalance(orderComment.getUserId(), balance, UserBalanceSourceRecord.Source.rd_comment);
 					log.info("审核订单:{}评价成功,发放余额:{}", orderComment.getOrderId(), balance.divide(BigDecimal.valueOf(100)));
 					orderCommentMapper.update(null, Wrappers.lambdaUpdate(OrderComment.class)
 							.set(OrderComment::getBalance, balance)

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java

@@ -46,6 +46,7 @@ public class OrderDonPostServiceImpl extends ServiceImpl<OrderDonPostMapper, Ord
      * 数据回传
      */
     private void post(Long orderId, OrderDonPost orderPost) throws Exception {
+        log.info("回传平台:{}", orderPost.getType().getType());
         AbstractPostDataService postStrategy = PostDataFactory.getPostStrategy(orderPost.getType().getType());
 
         Assert.notNull(postStrategy, "回传渠道类型不存在。");

+ 32 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -36,6 +36,7 @@ import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
@@ -72,6 +73,7 @@ import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.user.UserBenefitsService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
 import com.ejlchina.searcher.BeanSearcher;
@@ -203,6 +205,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
 
+	private final UserBindRelationService userBindRelationService;
+
+	private final ChannelPopularizeMapper channelPopularizeMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -360,7 +366,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		if (orderDon.getStatus() == OrderDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
-				closeOrder(orderDon.getId());
+				closeOrder(orderDon.getId(), null);
 			});
 		}
 
@@ -597,10 +603,19 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
-	public void closeOrder(Long orderId) {
-		log.info("关闭订单 orderId:{}", orderId);
+	public void closeOrder(Long orderId, Long userId) {
 		//关闭订单逻辑
 		OrderDon orderDon = getById(orderId);
+		if (orderDon == null) {
+			return;
+		}
+		if (userId != null) {
+			List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			if (!relationUserIdList.contains(orderDon.getUserId())) {
+				return;
+			}
+		}
+		log.info("关闭订单 orderId:{}", orderId);
 		if (OrderDon.Status.noPayment.equals(orderDon.getStatus())) {
 			//调用微信、支付宝第三方接口查询订单是否支付
 			OrderDon.Status status = isHasPaid(orderDon);
@@ -652,7 +667,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				//返还余额
 				if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-					userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance());
+					userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.close);
 				}
 			}
 		}
@@ -788,7 +803,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		if (orderDon.getStatus() == OrderDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
-				closeOrder(orderDon.getId());
+				closeOrder(orderDon.getId(), null);
 			});
 		}
 		return orderDon;
@@ -1991,6 +2006,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
 			if (success != 1) throw BusinessRuntimeException.getInstance("您的余额不足!");
 			orderDon.setBalance(balance);
+			userBenefitsService.recordBalanceBySource(user.getId(), BigDecimal.valueOf(-balance.longValue()), UserBalanceSourceRecord.Source.payment);
+		}
+		//特殊渠道推广优惠. 360
+		if(orderDon.getPopularizeId() != null && orderDon.getPopularizeId() != 0L){
+			String name = channelPopularizeMapper.selectChannelByPid(orderDon.getPopularizeId());
+			if (Constant.CHANNEL_NAME_360.equals(name)) {
+				SysConfig sysConfig = sysConfigService.getBaseMapper().selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.CHANNEL_360_DISCOUNT));
+				if (sysConfig != null) {
+					BigDecimal discountMoney = orderDon.getMoney().multiply(BigDecimal.valueOf(Double.valueOf(sysConfig.getSysValue())));
+					orderDon.setMoney(discountMoney);
+				}
+			}
 		}
 	}
 

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/order/post/PostDataFactory.java

@@ -19,7 +19,7 @@ public class PostDataFactory {
     // 初始化
     public static AbstractPostDataService getPostStrategy(String key) {
         try {
-            if (StringUtils.isNotBlank(key)) {
+            if (StringUtils.isEmpty(key)) {
                 return null;
             }else {
                 key += "PostDataService";

+ 2 - 3
netflix-service/src/main/java/com/cyksj/service/order/post/impl/DianJingDataService.java → netflix-service/src/main/java/com/cyksj/service/order/post/impl/djPostDataService.java

@@ -1,6 +1,5 @@
 package com.cyksj.service.order.post.impl;
 
-import cn.hutool.http.Header;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -30,9 +29,9 @@ import java.util.Optional;
  * @date 2023-07-10 14:20
  */
 @Slf4j
-@Service("DianJingDataService")
+@Service("djPostDataService")
 @RequiredArgsConstructor
-public class DianJingDataService extends AbstractPostDataService{
+public class djPostDataService extends AbstractPostDataService{
 
     //key: 6px6m643y9zoadccx4n1
     //Secret: omgdr7q9bxw0rsyb634wnhk1fjow7o4j

+ 1 - 2
netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java

@@ -198,9 +198,8 @@ public class SchedulerServiceImpl implements SchedulerService {
 							log.info("user_id:{},relationId:{}返回余额为0", userId, change_relationId);
 							return;
 						}
-						userBenefitsService.addUserBalance(userId, re_balance);
+						userBenefitsService.addUserBalance(userId, re_balance, UserBalanceSourceRecord.Source.clear_valid);
 						log.info("车票未到期清除,退款至用户user_id:{}余额:{}成功", userId, re_balance);
-						userBenefitsService.recordBalanceBySource(userId, re_balance, UserBalanceSourceRecord.Source.clear_valid);
 						//修改订单状态 为退款
 						orderDon.setStatus(OrderDon.Status.refund);
 						orderDon.setRefundBalance(re_balance);

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java

@@ -26,7 +26,7 @@ public interface UserBenefitsService {
 	/**
 	 * 增加用户余额
 	 */
-	void addUserBalance(Long userId,BigDecimal addBalance);
+	void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source);
 
 	/**
 	 * 扣除用户余额

+ 23 - 3
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -1,11 +1,14 @@
 package com.cyksj.service.user.impl;
 
+import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.mapper.DistributeOrdersDeductPointsRecordMapper;
 import com.cyksj.mapper.UserBalanceSourceRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.model.entity.DistributeOrdersDeductPointsRecord;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.UserBalanceSourceRecord;
+import com.cyksj.service.sms.SmsService;
 import com.cyksj.service.user.UserBenefitsService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.dao.DuplicateKeyException;
@@ -28,6 +31,10 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 
 	private final UserBalanceSourceRecordMapper userBalanceSourceRecordMapper;
 
+	private final EnvCommonService envCommonService;
+
+	private final SmsService smsService;
+
 	@Override
 	public void deductDistributePoints(Long orderId, Long userId, BigDecimal deductPoints) {
 		if (deductPoints.compareTo(BigDecimal.ZERO) <= 0) {
@@ -61,7 +68,7 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 	}
 
 	@Override
-	public void addUserBalance(Long userId, BigDecimal addBalance) {
+	public void addUserBalance(Long userId, BigDecimal addBalance, UserBalanceSourceRecord.Source source) {
 		if (addBalance.compareTo(BigDecimal.ZERO) <= 0) {
 			return;
 		}
@@ -70,7 +77,20 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 			if (user == null) break;
 			BigDecimal balance = user.getBalance();
 			Integer success = userMapper.addUserBalance(user.getId(), balance, addBalance);
-			if (success == 1) break;
+			if (success == 1) {
+				recordBalanceBySource(userId, addBalance, source);
+				if (envCommonService.isPrdEnv()) {
+					if (source != UserBalanceSourceRecord.Source.close && source != UserBalanceSourceRecord.Source.balance) {
+						try {
+							//短信到账提醒
+							String msg = String.format(Constant.BALANCE_NOTIFY_MSG, addBalance.divide(BigDecimal.valueOf(100)));
+							smsService.sendSmsToRelationUser(userId, msg);
+						} catch (Exception e) {
+						}
+					}
+				}
+				break;
+			}
 		}
 	}
 
@@ -105,7 +125,7 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 		UserBalanceSourceRecord userBalanceSourceRecord = new UserBalanceSourceRecord();
 		userBalanceSourceRecord.setUserId(userId);
 		userBalanceSourceRecord.setBalance(balance);
-		userBalanceSourceRecord.setSource(UserBalanceSourceRecord.Source.clear_valid);
+		userBalanceSourceRecord.setSource(source);
 		userBalanceSourceRecordMapper.insert(userBalanceSourceRecord);
 	}
 }

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -372,6 +372,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		String dsCode = loginReq.getDsCode();
 		Long sharedId = loginReq.getSharedId();
 		Long dsPopularizeId = null;
+		Integer dsType = loginReq.getDsType();
+		Boolean isNewUser = false;
 		if (StrUtil.isNotBlank(dsCode)) {
 			dsCode = dsCode.trim();
 			User sharedUser = this.getOne(Wrappers.lambdaQuery(User.class)
@@ -391,6 +393,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		}
 		if (user == null) {
 			user = new User();
+			isNewUser = true;
 			StringBuilder name = new StringBuilder();
 			name.append(Constant.DEFAULT_NAME);
 			if (loginReq.getPopularizeId() != null) {
@@ -448,6 +451,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		if (StrUtil.isEmpty(user.getShowId())) {
 			user.setShowId(getUserShowId(user.getId()));
 		}
+		//新旧用户都可实物分销
+		if (sharedId != null && dsType != null && dsType == 2) {
+			equipDistributeService.saveDistributionInvitation(sharedId, isNewUser, user.getId());
+		}
 		return user;
 	}
 

+ 6 - 3
netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java

@@ -9,9 +9,9 @@ import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeVisitMapper;
 import com.cyksj.mapper.channel.MoviesVisitRecordMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
-import com.cyksj.model.entity.ChannelPopularize;
 import com.cyksj.model.entity.ChannelPopularizeVisit;
 import com.cyksj.model.entity.MoviesVisitRecord;
+import com.cyksj.model.views.ChannelPopularizeFrontView;
 import com.cyksj.model.views.CouponTfPopularizeView;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -43,8 +43,11 @@ public class ChannelController {
     private final CouponSkuMapper couponSkuMapper;
 
     @GetMapping("/get/{id}")
-    public Result<ChannelPopularize> getById(@PathVariable Long id, Boolean isLogin) {
-        ChannelPopularize channelPopularize = popularizeMapper.selectById(id);
+    public Result<ChannelPopularizeFrontView> getById(@PathVariable Long id, Boolean isLogin) {
+        ChannelPopularizeFrontView channelPopularize = beanSearcher.searchFirst(ChannelPopularizeFrontView.class, MapUtils.builder()
+                .put("id", String.format("id = %s", id))
+                .build());
+
         if (channelPopularize == null) {
             throw BusinessRuntimeException.getInstance("该链接不存在!");
         }

+ 12 - 4
netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.distribute;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -97,10 +98,10 @@ public class EquipmentDistributeController {
 	 * 邀请好友明细
 	 */
 	@GetMapping("/get/invite/record")
-	public Result<SearchResult<EquipmentUserChanceRecord>> getInviteRecord() {
+	public Result<SearchResult<EquipmentUserPayRecord>> getInviteRecord() {
 		Long userId = StpUserUtil.getLoginIdAsLong();
-		SearchResult<EquipmentUserChanceRecord> search = beanSearcher.search(EquipmentUserChanceRecord.class, MapUtils.flatBuilder(request.getParameterMap())
-				.field(EquipmentUserChanceRecord::getShareId, userId)
+		SearchResult<EquipmentUserPayRecord> search = beanSearcher.search(EquipmentUserPayRecord.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(EquipmentUserPayRecord::getShareId, userId)
 				.build());
 		search.getDataList().forEach(data -> {
 			Optional.ofNullable(userMapper.selectById(data.getUserId())).ifPresent(user -> {
@@ -124,7 +125,11 @@ public class EquipmentDistributeController {
 		if (config != null) {
 			String sysValue = config.getSysValue();
 			if (StrUtil.isNotBlank(sysValue)) {
-				goodsIds = Jsons.parseObject(sysValue, EquipmentConfigDto.class).getSkuList().stream().map(GoodsDonSku::getGoodsId).collect(Collectors.toList());
+				EquipmentConfigDto equipmentConfigDto = Jsons.parseObject(sysValue, EquipmentConfigDto.class);
+				if (CollUtil.isEmpty(equipmentConfigDto.getSkuList())) {
+					return GatewayResponse.SUCCESS.newBuilder().toResult();
+				}
+				goodsIds = equipmentConfigDto.getSkuList().stream().map(GoodsDonSku::getGoodsId).collect(Collectors.toList());
 			}
 		}
 		MapBuilder builder = MapUtils.builder()
@@ -154,6 +159,9 @@ public class EquipmentDistributeController {
 			throw BusinessRuntimeException.getInstance("");
 		}
 		EquipmentConfigDto equipmentConfigDto = Jsons.parseObject(sysValue, EquipmentConfigDto.class);
+		if (CollUtil.isEmpty(equipmentConfigDto.getSkuList())) {
+			throw BusinessRuntimeException.getInstance("暂无该车票权益");
+		}
 		Optional<GoodsDonSku> first = equipmentConfigDto.getSkuList().stream().filter(goodsDonSku -> {
 			if (goodsDonSku.getId().equals(skuId)) {
 				return true;

+ 9 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -17,7 +17,7 @@ import com.cyksj.model.manage.views.UserView;
 import com.cyksj.model.request.UserFuncPropertyReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.relation.GroupRelationClearService;
-import com.cyksj.service.relation.GroupRelationFrontService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -56,7 +56,7 @@ public class CmsUserController{
 
     private final GroupsRelationMapper groupsRelationMapper;
 
-    private final GroupRelationFrontService groupRelationFrontService;
+    private final UserBindRelationService userBindRelationService;
 
     private final CorpUserFollowRelationMapper cmsUserFollowRelationMapper;
 
@@ -108,7 +108,13 @@ public class CmsUserController{
         Optional.ofNullable(user).ifPresent(u -> {
             u.setIsBlack(!u.getIsBlack());
             if (u.getIsBlack()) {
-                List<RenewalView> groupsRelations = groupRelationFrontService.getMyTicket(u.getId(), null);
+                List<Long> userIds = userBindRelationService.getRelationUserIdList(id, user);
+                List<RenewalView> groupsRelations = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()
+                        .field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
+                        .field(RenewalView::getUserId, userIds).op(Operator.InList)
+                        .field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
+                        .orderBy(RenewalView::getExpiryTime).asc()
+                        .build());
                 groupsRelations.forEach(ticket -> {
                     GroupsRelation relation = groupsRelationMapper.selectById(ticket.getRelationId());
                     groupRelationClearService.clearTicket(relation, UserTicketClearedRecord.Source.black);

+ 5 - 7
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/EquipmentController.java

@@ -6,8 +6,8 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
-import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserChanceRecordMapper;
-import com.cyksj.model.entity.EquipmentUserChanceRecord;
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserPayRecordMapper;
+import com.cyksj.model.entity.EquipmentUserPayRecord;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.views.EquipmentBenefitsView;
@@ -43,7 +43,7 @@ public class EquipmentController {
 
 	private final CouponMapper couponMapper;
 
-	private final EquipmentUserChanceRecordMapper equipmentUserChanceRecordMapper;
+	private final EquipmentUserPayRecordMapper payRecordMapper;
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
@@ -54,10 +54,8 @@ public class EquipmentController {
 	public Result<SearchResult<EquipmentUserDistributeViews>> getEquipmentDistribute() {
 		SearchResult<EquipmentUserDistributeViews> search = beanSearcher.search(EquipmentUserDistributeViews.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data -> {
-			User user = userMapper.selectById(data.getShareId());
-			Optional.ofNullable(user).ifPresent(u -> data.setNickname(u.getNickname()));
-			data.setRecordNum(equipmentUserChanceRecordMapper.selectCount(Wrappers.lambdaQuery(EquipmentUserChanceRecord.class)
-					.eq(EquipmentUserChanceRecord::getShareId, data.getShareId())));
+			data.setRecordNum(payRecordMapper.selectCount(Wrappers.lambdaQuery(EquipmentUserPayRecord.class)
+					.eq(EquipmentUserPayRecord::getShareId, data.getShareId())));
 			data.setBenefitsViews(beanSearcher.searchAll(EquipmentBenefitsView.class, MapUtils.builder().field(EquipmentBenefitsView::getSharId, data.getShareId()).build()));
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);

+ 6 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -102,6 +102,9 @@ public class StatisticsDataController {
 	@GetMapping("/export")
 	@SaCheckPermission("statics:export")
 	public void exportStatisticsData(Integer type, Long startTime, Long endTime, HttpServletResponse response) {
+		if (startTime == null || endTime == null) {
+			throw BusinessRuntimeException.getInstance("请选择导出的时间");
+		}
 		List<ExcelSheetAndData> excelSheetDataList = statisticsDataService.exportStatisticsDataByType(type, startTime, endTime);
 		excelSheetDataList = excelSheetDataList.stream().sorted(Comparator.comparing(ExcelSheetAndData::getSort)).collect(Collectors.toList());
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, excelSheetDataList, "订单统计数据", ExcelTypeEnum.XLSX, null);
@@ -112,6 +115,9 @@ public class StatisticsDataController {
 	 */
 	@GetMapping("/export/monthly/data")
 	public void exportMonthlyData(Long startTime, Long endTime, HttpServletResponse response) {
+		if (startTime == null || endTime == null) {
+			throw BusinessRuntimeException.getInstance("请选择导出的时间");
+		}
 		List<ExcelSheetAndData> excelSheetDataList = statisticsDataService.exportMonthlyData(startTime, endTime);
 		excelSheetDataList = excelSheetDataList.stream().sorted(Comparator.comparing(ExcelSheetAndData::getSort)).collect(Collectors.toList());
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, excelSheetDataList, String.format("%s月业务数据", DateUtil.month(DateTime.of(startTime)) + 1), ExcelTypeEnum.XLSX, null);

+ 7 - 3
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -117,6 +117,9 @@ public class OrderController {
     @Autowired
     private StripeService stripeService;
 
+    @Autowired
+    private UserBindRelationService userBindRelationService;
+
     /**
      * 支付
      * @author chan
@@ -387,9 +390,10 @@ public class OrderController {
      * 取消订单
      */
     @GetMapping("/get/close/{orderId}")
-    public Result<String> closeOrder(@PathVariable Long orderId){
-      orderDonService.closeOrder(orderId);
-      return GatewayResponse.SUCCESS.newBuilder().toResult();
+    public Result<String> closeOrder(@PathVariable Long orderId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        orderDonService.closeOrder(orderId, userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
     @GetMapping("/get/order/status/{orderId}")

+ 23 - 1
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -1,14 +1,19 @@
 package com.cyksj.web.controller.sys;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.Log;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
 import com.cyksj.mapper.manage.help.HelpQuestionMapper;
+import com.cyksj.model.dto.EquipmentConfigDto;
 import com.cyksj.model.entity.HelpQuestion;
 import com.cyksj.model.entity.HelpQuestionClassification;
 import com.cyksj.model.entity.SysConfig;
@@ -18,6 +23,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.util.HashSet;
+
 /**
  * @author chan
  * @date 2022/10/20 10:08 AM
@@ -55,7 +63,21 @@ public class SysConfigController {
 
 	@PutMapping("/update")
 	@Log(module = "系统设置/编辑配置", businessType = BusinessType.PUT, isSaveRequestData = true)
-	public Result<SysConfig> update(@RequestBody SysConfig sysConfig) {
+	public Result<SysConfig> update(@RequestBody SysConfig sysConfig) throws Exception {
+		if (Constant.EQUIPMENT_DISTRIBUTE_KEY.equals(sysConfig.getSysKey())) {
+			String sysValue = sysConfig.getSysValue();
+			if (StrUtil.isNotBlank(sysValue)) {
+				EquipmentConfigDto equipmentConfigDto = Jsons.parseObject(sysValue, EquipmentConfigDto.class);
+				if (CollUtil.isNotEmpty(equipmentConfigDto.getSkuList())) {
+					equipmentConfigDto.setBalance(BigDecimal.ZERO);
+				}
+				if (equipmentConfigDto.getBalance() != null && equipmentConfigDto.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+					equipmentConfigDto.setSkuList(new HashSet<>());
+				}
+				sysConfig.setSysValue(Jsons.toJson(equipmentConfigDto));
+			}
+		}
+
 		sysConfigService.updateById(sysConfig);
 
 		return GatewayResponse.SUCCESS.newBuilder().toResult(sysConfig);