Bladeren bron

用户设备意向标签标记;实物分销客服转账记录

zoujiajian 2 jaren geleden
bovenliggende
commit
625231e431
16 gewijzigde bestanden met toevoegingen van 278 en 16 verwijderingen
  1. 5 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserFollowRelationMapper.java
  3. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserTagMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/EquipmentUserOrderVerifyRecordMapper.java
  5. 24 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserPayIntention.java
  6. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserTag.java
  7. 29 0
      netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserOrderVerifyRecord.java
  8. 4 0
      netflix-dao/src/main/java/com/cyksj/model/views/EquipmentUserDistributeDetailView.java
  9. 10 0
      netflix-dao/src/main/resources/mapper/CorpUserFollowRelationMapper.xml
  10. 7 0
      netflix-dao/src/main/resources/mapper/CorpUserTagMapper.xml
  11. 66 4
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java
  12. 5 5
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  13. 35 3
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  14. 11 0
      netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java
  15. 6 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java
  16. 49 4
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/EquipmentController.java

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

@@ -306,4 +306,9 @@ public interface Constant {
 	 * 有效获客
 	 */
 	String CUSTOMER_EFFECTIVE = "customer_effective";
+
+	/**
+	 * 设备意向标签组
+	 */
+	String EP_INTENTION_GROUP_NAME= "设备群发标签";
 }

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

@@ -21,4 +21,6 @@ public interface CorpUserFollowRelationMapper extends BaseMapper<CorpUserFollowR
 	List<CorpUserFollowRelationDto> selectCorpUserFollowRelation(@Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> service_follow_ids);
 
 	List<CorpUserFollowRelationDto> selectCorpUserNotUnderTagIds(@Param("list") List<String> tagIds, @Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> followIds, @Param("userScope") Integer userScope, @Param("consumerScope") Integer consumerScope, @Param("joinStartTime") Date joinStartTime, @Param("joinEndTime") Date joinEndTime);
+
+	CorpUserFollowRelation getCorpUserFollowRelation(@Param("unionId") String unionId, @Param("followId") String followId);
 }

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

@@ -28,4 +28,6 @@ public interface CorpUserTagMapper extends BaseMapper<CorpUserTag> {
 	List<UserIntentionPieView> getUserIntentionPie(@Param("tagIdStr") String tagId, @Param("thisDate") String date);
 
 	Page<CorpUserIntentionView> getCorpUserIntentionView(@Param("page") Page<CorpUserIntentionView> page, @Param("userId") Long userId, @Param("nickname") String nickname, @Param("tagIdStr") String tagId, @Param("thisDate") String date, @Param("intention") Integer intention);
+
+	List<CorpUserTag> selectIntentionUserTag(String groupName);
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.equipment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.EquipmentUserOrderVerifyRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: EquipmentUserOrderVerifyRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/5/14 11:41
+ */
+public interface EquipmentUserOrderVerifyRecordMapper extends BaseMapper<EquipmentUserOrderVerifyRecord> {
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserPayIntention.java

@@ -1,5 +1,7 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -18,4 +20,26 @@ public class CorpUserPayIntention extends BaseEntity {
 	 * 意向 0无回复 1无意向 2.问相关问题 3有意向 4很有意向
 	 */
 	private Integer intention;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String followId;
+
+
+	@Getter
+	public enum Intention {
+		whf("无回复", "etvj2DPQAA13a2LWPMwCikcmnp6T40FA"),
+		wyx("无意向", "etvj2DPQAASnQouiyPZD9el0QLLSNs8Q"),
+		wxgwt("问相关问题", "etvj2DPQAAUOcl8WGtkF27Ul_V7ixF4A"),
+		yyx("有意向", "etvj2DPQAA41WEz2wXpuLlf1XzKTnK9g"),
+		hyyx("很有意向", "etvj2DPQAAPQOeqPoY-ByfdmCrC3PDkw");
+		String tagName;
+
+		String tagId;
+
+		Intention(String tagName, String tagId) {
+			this.tagName = tagName;
+			this.tagId = tagId;
+		}
+	}
 }

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserTag.java

@@ -1,5 +1,7 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -37,6 +39,14 @@ public class CorpUserTag extends BaseEntity implements Serializable {
 	 */
 	private int type;
 
+	@DbIgnore
+	@TableField(exist = false)
+	private String followId;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String externalUserId;
+
 	@Override
 	public boolean equals(Object o) {
 		if (this == o) return true;

+ 29 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserOrderVerifyRecord.java

@@ -0,0 +1,29 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: EquipmentUserOrderVerifyRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/5/14 11:39
+ */
+@Getter
+@Setter
+public class EquipmentUserOrderVerifyRecord extends BaseEntity{
+	private Long sharedId;
+
+	private Long userId;
+
+	private Long orderId;
+
+	private BigDecimal money;
+
+	/**
+	 * 打款截图
+	 */
+	private String img;
+}

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

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.cyksj.model.entity.EquipmentUserChanceRecord;
+import com.cyksj.model.entity.EquipmentUserOrderVerifyRecord;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
@@ -64,4 +65,7 @@ public class EquipmentUserDistributeDetailView {
 
 	@DbField("od.pay_time")
 	private Date payTime;
+
+	@DbIgnore
+	private EquipmentUserOrderVerifyRecord verifyRecord;
 }

+ 10 - 0
netflix-dao/src/main/resources/mapper/CorpUserFollowRelationMapper.xml

@@ -127,4 +127,14 @@
         </if>
         group by cufr.corp_user_id
     </select>
+
+    <select id="getCorpUserFollowRelation" resultType="com.cyksj.model.entity.CorpUserFollowRelation">
+        select cufr.id
+        from (select id
+              from corp_user
+              where unionid = #{unionId} limit 1) cu
+                 inner join corp_user_auth ca on ca.corp_user_id = cu.id
+                 inner join corp_user_follow_relation cufr on cufr.corp_user_id = ca.external_userid
+        where cufr.follow_id = #{followId}
+    </select>
 </mapper>

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

@@ -125,4 +125,11 @@
             </if>
         </where>
     </select>
+
+    <select id="selectIntentionUserTag" resultType="com.cyksj.model.entity.CorpUserTag">
+        select ct.*, cufr.follow_id, cufr.corp_user_id as externalUserId
+        from corp_user_tag ct
+                 inner join corp_user_follow_relation cufr on cufr.id = ct.relation_id
+        where ct.group_name = #{groupName}
+    </select>
 </mapper>

+ 66 - 4
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -1,10 +1,13 @@
 package com.cyksj.service.corp.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.StringUtil;
@@ -13,9 +16,7 @@ import com.cyksj.common.util.corp.WxCryptUtil;
 import com.cyksj.config.corp.WeChatCorpFactory;
 import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.dto.CorpOauth2UserInfo;
-import com.cyksj.mapper.corp.CorpCustomerAcquistionCallbackMapper;
-import com.cyksj.mapper.corp.CorpFollowMapper;
-import com.cyksj.mapper.corp.CorpUserPayIntentionMapper;
+import com.cyksj.mapper.corp.*;
 import com.cyksj.model.dto.WxCorpEncryptDto;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.corp.Attachments;
@@ -43,6 +44,7 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /*
  *项目名: netflix
@@ -82,6 +84,15 @@ public class CorpServiceImpl implements CorpService {
 	@Autowired
 	private CorpUserPayIntentionMapper corpUserPayIntentionMapper;
 
+	@Autowired
+	private CorpUserMapper corpUserMapper;
+
+	@Autowired
+	private CorpUserTagMapper corpUserTagMapper;
+
+	@Autowired
+	private CorpUserFollowRelationMapper corpUserFollowRelationMapper;
+
 	@PostConstruct
 	private void init() {
 		corpMessageRouter = new CorpMessageRouter(this)
@@ -382,8 +393,59 @@ public class CorpServiceImpl implements CorpService {
 				corpUserPayIntentionMapper.insert(corpUserPayIntention);
 			} catch (DuplicateKeyException e) {
 			}
+		} else {
+			corpUserPayIntentionMapper.updateById(corpUserPayIntention);
+		}
+		//将所属意向标签组不属于该标签的全删除
+		//并打上对应标签
+		CorpUserPayIntention.Intention intention = CorpUserPayIntention.Intention.values()[corpUserPayIntention.getIntention()];
+		String tagName = intention.getTagName();
+		String tagId = intention.getTagId();
+
+		List<CorpUserTag> corpUserTags = corpUserTagMapper.selectIntentionUserTag(Constant.EP_INTENTION_GROUP_NAME);
+		//是否存在对应标签
+		AtomicBoolean isExistIntentionTag = new AtomicBoolean(false);
+		if (CollUtil.isNotEmpty(corpUserTags)) {
+			//删除之前的意向标签
+			corpUserTags.forEach(userTag -> {
+				if (!StrUtil.equals(userTag.getTagId(), tagId)) {
+					try {
+						wxCorpOps.markTag(userTag.getExternalUserId(), userTag.getFollowId(), null, new String[]{userTag.getTagId()});
+						corpUserTagMapper.deleteById(userTag.getId());
+					} catch (Exception e) {
+					}
+				} else {
+					if (!isExistIntentionTag.get()) {
+						isExistIntentionTag.set(true);
+					}
+				}
+			});
+		}
+		if (!isExistIntentionTag.get()) {
+			insertUserIntentionTag(corpUserPayIntention, tagId, tagName);
+		}
+	}
+
+	public void insertUserIntentionTag(CorpUserPayIntention corpUserPayIntention, String tagId, String tagName) {
+		CorpUserFollowRelation corpUserFollowRelation = corpUserFollowRelationMapper.getCorpUserFollowRelation(corpUserPayIntention.getUnionId(), corpUserPayIntention.getFollowId());
+		if (corpUserFollowRelation == null) {
 			return;
 		}
-		corpUserPayIntentionMapper.updateById(corpUserPayIntention);
+		String externalUserId = corpUserFollowRelation.getCorpUserId();
+		String followId = corpUserFollowRelation.getFollowId();
+		try {
+			wxCorpOps.markTag(externalUserId, followId, new String[]{tagId}, null);
+			//新增用户标签
+			CorpUserTag corpUserTag = new CorpUserTag();
+			corpUserTag.setRelationId(corpUserFollowRelation.getId());
+			corpUserTag.setGroupName(Constant.EP_INTENTION_GROUP_NAME);
+			corpUserTag.setTagId(tagId);
+			corpUserTag.setTagName(tagName);
+			corpUserTag.setType(1);
+			corpUserTagMapper.insert(corpUserTag);
+		} catch (Exception e) {
+			log.error("新增用户意向标签错误:{}", StringUtil.getErrorText(e));
+		}
+
 	}
 }

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

@@ -740,11 +740,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
             try {
                 marketFrontService.subSpecificChanceNum(orderDon.getUserId(), orderDon.getId(), orderDon.getGoodsId(), orderDon.getUpdateTime());
-                if (goodsDon.getType() == 2) {
-                    equipmentDistributeService.subDistributeBenefitsChance(orderDon.getUserId(), orderDon.getId());
-                    //扣除用户自身实物权益
-                    userRealOrderBenefitsService.deductUserRealGoodsBenefits(orderDon.getId());
-                }
+//                if (goodsDon.getType() == 2) {
+//                    equipmentDistributeService.subDistributeBenefitsChance(orderDon.getUserId(), orderDon.getId());
+//                    //扣除用户自身实物权益
+//                    userRealOrderBenefitsService.deductUserRealGoodsBenefits(orderDon.getId());
+//                }
             } catch (Exception e) {
                 log.error("wx减少抽奖机会错误,orderId:{},error:{}", orderDon.getId(), e);
             }

+ 35 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -43,6 +43,7 @@ import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
 import com.cyksj.mapper.corp.CorpInteractiveUserOrderRelationMapper;
+import com.cyksj.mapper.corp.CorpUserTagMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
@@ -65,6 +66,7 @@ import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
@@ -286,6 +288,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonSubsidyRelateMapper orderDonSubsidyRelateMapper;
 
+	private final CorpUserTagMapper corpUserTagMapper;
+
+	private final WxCorpOps wxCorpOps;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -2331,9 +2337,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				//配置了特定奖池,增加抽奖机会
 				marketFrontService.addSpecificChanceNum(orderDon.getUserId(), orderDon.getId(), orderDon.getGoodsId(), orderDon.getSkuId());
-				if (goodsDon.getType() == 2) {
-					equipmentDistributeService.addDistributeBenefitsChance(orderDon.getUserId(), orderDon.getId());
-				}
+//				if (goodsDon.getType() == 2) {
+//					equipmentDistributeService.addDistributeBenefitsChance(orderDon.getUserId(), orderDon.getId());
+//				}
 				//若该订单使用了规定推广者的兑换码 增加上下级关系
 				if (StrUtil.isNotBlank(orderDon.getCouponExCode())) {
 					addDistributeCouponCode(orderDon.getUserId(), orderDon.getCouponExCode());
@@ -2359,6 +2365,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				//下级渠道目标额达标 提成金额发放
 				sendSubDistributeRewards(orderDon);
+				//删除用户意向标签
+				clearEpIntentionTag(goodsDon, orderDon.getUserId());
 			} catch (Exception e) {
 				log.error("回调修改订单信息错误,orderId:{},error:{}", orderDon.getId(), StringUtil.getErrorText(e));
 			}
@@ -3085,4 +3093,28 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		orderDon.setMoney(price);
 	}
+
+	/**
+	 * 清除用户设备意向标签
+	 */
+	public void clearEpIntentionTag(GoodsDon goodsDon, Long userId) {
+		//实物订单,用户有设备意向,删除对应标签
+		if (goodsDon != null && goodsDon.getId() == 15) {
+			User user = userMapper.selectById(userId);
+			if (user != null && StrUtil.isNotBlank(user.getUnionid())) {
+				List<CorpUserTag> corpUserTags = corpUserTagMapper.selectIntentionUserTag(Constant.EP_INTENTION_GROUP_NAME);
+				if (CollUtil.isNotEmpty(corpUserTags)) {
+					//删除之前的意向标签
+					corpUserTags.forEach(userTag -> {
+						try {
+							wxCorpOps.markTag(userTag.getExternalUserId(), userTag.getFollowId(), null, new String[]{userTag.getTagId()});
+							corpUserTagMapper.deleteById(userTag.getId());
+						} catch (Exception e) {
+							log.error("删除用户设备意向标签错误:{}", StringUtil.getErrorText(e));
+						}
+					});
+				}
+			}
+		}
+	}
 }

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java

@@ -10,6 +10,7 @@ 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.dto.UserSharedDto;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
@@ -27,6 +28,7 @@ import com.cyksj.redis.RedisService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.sys.SysConfigService;
+import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -70,6 +72,8 @@ public class EquipmentDistributeController {
 
 	private final OrderDonMapper orderDonMapper;
 
+	private final UserService userService;
+
 	private final EquipmentDistributeService equipDistributeService;
 
 	private final EquipmentUserDistributeInviteRecordMapper inviteRecordMapper;
@@ -216,7 +220,14 @@ public class EquipmentDistributeController {
 				.between(User::getCreatedTime, DateUtil.beginOfDay(now), DateUtil.endOfDay(now)).last("limit 1"));
 		Boolean isNewUser = user != null ? true : false;
 		Long sharedId = req.getSharedId();
+		String dsCode = req.getDsCode();
 		Integer dsType = req.getDsType();
+		if (StrUtil.isNotBlank(dsCode)) {
+			UserSharedDto userSharedDto = userService.getUserShredDtoByDsCode(dsCode);
+			if (userSharedDto != null) {
+				sharedId = userSharedDto.getSharedId();
+			}
+		}
 		//新旧用户都可实物分销
 		if (sharedId != null && dsType != null && dsType == 2) {
 			equipDistributeService.saveDistributionInvitation(sharedId, isNewUser, userId);

+ 6 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -359,11 +359,16 @@ public class WxCorpController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(corpUserPayIntention);
 	}
 
+	/**
+	 * 修改意向
+	 */
 	@PutMapping("/update/user/intention")
 	public Result<CorpUserPayIntention> updateUserIntention(@RequestBody CorpUserPayIntention corpUserPayIntention) {
 		if (corpUserPayIntention.getUnionId() == null || corpUserPayIntention.getIntention() == null) {
 			throw BusinessRuntimeException.getInstance("缺少必填参数.");
 		}
+		String followId = getCorpUuid();
+		corpUserPayIntention.setFollowId(followId);
 		corpService.updateUserIntention(corpUserPayIntention);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(corpUserPayIntention);
 	}
@@ -383,6 +388,7 @@ public class WxCorpController {
 	 * 修改 意向
 	 */
 	@PutMapping("/upCallbackIntention")
+	@Deprecated
 	public Result<String> upCallbackIntention(@RequestBody CorpCustomerAcquistionCallback corpCustomerAcquistionCallback) {
 		log.info("修改意向:{}", corpCustomerAcquistionCallback);
 		if (corpCustomerAcquistionCallback.getId() == null || corpCustomerAcquistionCallback.getId() == 0 || corpCustomerAcquistionCallback.getIntention() == null) {

+ 49 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/EquipmentController.java

@@ -1,12 +1,16 @@
 package com.cyksj.web.controller.manage.distribute;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 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.EquipmentUserOrderVerifyRecordMapper;
 import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserPayRecordMapper;
+import com.cyksj.model.entity.EquipmentUserOrderVerifyRecord;
 import com.cyksj.model.entity.EquipmentUserPayRecord;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.User;
@@ -17,12 +21,11 @@ import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.util.Optional;
 
 /*
@@ -47,6 +50,8 @@ public class EquipmentController {
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
+	private final EquipmentUserOrderVerifyRecordMapper equipmentUserOrderVerifyRecordMapper;
+
 	/**
 	 * 实物分销列表
 	 */
@@ -77,7 +82,47 @@ public class EquipmentController {
 			data.setCouponName(couponName);
 			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(data.getSkuId());
 			Optional.ofNullable(goodsDonSku).ifPresent(sku -> data.setSpecVal(sku.getSpecVal()));
+			EquipmentUserOrderVerifyRecord equipmentUserOrderVerifyRecord = equipmentUserOrderVerifyRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserOrderVerifyRecord.class)
+					.eq(EquipmentUserOrderVerifyRecord::getOrderId, data.getOrderId())
+					.last("limit 1"));
+			data.setVerifyRecord(equipmentUserOrderVerifyRecord);
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+	/**
+	 * 发送奖励记录
+	 */
+	@PutMapping("/verify/reward/record")
+	public Result<SearchResult> verifyRewardRecord(@RequestBody EquipmentUserOrderVerifyRecord verifyRecord) {
+		Long orderId = verifyRecord.getOrderId();
+		EquipmentUserPayRecord equipmentUserPayRecord = payRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserPayRecord.class).eq(EquipmentUserPayRecord::getOrderId, orderId).last("limit 1"));
+		if (equipmentUserPayRecord == null) {
+			throw BusinessRuntimeException.getInstance("实物分销订单不存在");
+		}
+		if (equipmentUserPayRecord.getStatus() == EquipmentUserPayRecord.Status.refund) {
+			throw BusinessRuntimeException.getInstance("实物分销订单已退款");
+		}
+		BigDecimal money = verifyRecord.getMoney();
+		String img = verifyRecord.getImg();
+		if (StrUtil.isNotBlank(img)) {
+			throw BusinessRuntimeException.getInstance("转账截图不为空");
+		}
+		if (money == null) {
+			throw BusinessRuntimeException.getInstance("转账金额不为空");
+		}
+		if (verifyRecord.getId() == null) {
+			verifyRecord.setSharedId(equipmentUserPayRecord.getShareId());
+			verifyRecord.setUserId(equipmentUserPayRecord.getUserId());
+			try {
+				equipmentUserOrderVerifyRecordMapper.insert(verifyRecord);
+			} catch (DuplicateKeyException e) {
+				throw BusinessRuntimeException.getInstance("其他客服已转账..");
+			}
+		} else {
+			equipmentUserOrderVerifyRecordMapper.updateById(verifyRecord);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 }