Forráskód Böngészése

Merge branch 'account_renew_track'

zoujiajian 3 éve
szülő
commit
59adeb0d36

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationCustomerServiceFollowRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GroupsRelationCustomerServiceFollowRecord;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsRelationCustomerServiceFollowRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/9/5 11:37
+ */
+public interface GroupsRelationCustomerServiceFollowRecordMapper extends BaseMapper<GroupsRelationCustomerServiceFollowRecord> {
+}

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationExpiryRecordMapper.java

@@ -0,0 +1,14 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+
+/*
+ *项目名: netflix-job
+ *文件名: GroupsRelationExpiryRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/9/4 17:07
+ */
+public interface GroupsRelationExpiryRecordMapper extends BaseMapper<GroupsRelationExpiryRecord> {
+
+}

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelationCustomerServiceFollowRecord.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.entity;
+
+import com.cyksj.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix-job
+ *文件名: GroupsRelationCustomerServiceFollowRecord
+ *创建者: JavaZou
+ *创建时间:2023/9/4 17:08
+ */
+@Getter
+@Setter
+public class GroupsRelationCustomerServiceFollowRecord extends BaseEntity {
+	/**
+	 * group_relation_expiry_record
+	 * 用户车票跟进记录id
+	 */
+	private Long ecId;
+
+	private String content;
+
+	private String imgs;
+}

+ 92 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelationExpiryRecord.java

@@ -0,0 +1,92 @@
+package com.cyksj.model.entity;
+
+import com.cyksj.model.BaseEntity;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix-job
+ *文件名: GroupsRelationExpiryRecord
+ *创建者: JavaZou
+ *创建时间:2023/9/4 16:48
+ */
+@Getter
+@Setter
+@SearchBean(tables = "groups_relation_expiry_record",
+		where = "account_status in (0,1,2,3,7)")
+public class GroupsRelationExpiryRecord extends BaseEntity {
+	private Long userId;
+
+	private String nickname;
+
+	/**
+	 * 注册方式
+	 */
+	private String registerEnv;
+
+	private String register;
+
+	/**
+	 * 联系方式
+	 */
+	private String contact;
+
+	/**
+	 * 是否加入了企业微信
+	 */
+	private Boolean isJoinCorpWx;
+
+	private Long goodsId;
+
+	private String goodsTitle;
+
+	private Long relationId;
+
+	private Date startTime;
+
+	private Date expiryTime;
+
+	private Long skuId;
+
+	private String specVal;
+
+	private Boolean isReBuy;
+
+	private Long reBuyOrderId;
+
+	private Date reBuyTime;
+
+	private Long reBuyGoodsId;
+
+	private String reBuyGoodsTitle;
+
+	private Long reBuySkuId;
+
+	private String reBuySpecVal;
+
+	/**
+	 * 分配时间
+	 */
+	private Date assignTime;
+
+	private Long customerServiceId;
+
+	/**
+	 * 分配客服
+	 */
+	private String customerService;
+
+	/**
+	 * 是否跟进
+	 */
+	private Boolean isFollow;
+
+	/**
+	 * 到期状态
+	 * 0已到期
+	 */
+	private Integer accountStatus;
+}

+ 10 - 9
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -17,7 +17,6 @@ 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.*;
@@ -28,7 +27,7 @@ import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.relation.GroupRelationFrontService;
-import com.cyksj.service.template.TemplateCommonService;
+import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
@@ -71,22 +70,18 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final OrderDonMapper orderDonMapper;
 
-	private static final GlobalThreadPoolTaskExecutor THREAD_POOL_TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
-
-	private final CustomerServiceMapper customerServiceMapper;
+	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	private final LuckyDrawRecordMapper luckyDrawRecordMapper;
 
-	private final TemplateCommonService templateCommonService;
-
 	private final BeanSearcher beanSearcher;
 
 	private final GroupRelationFrontService groupRelationFrontService;
 
-	private final ChannelPopularizeMapper channelPopularizeMapper;
-
 	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
 
+	private final GroupsRelationExpiryRecordService groupsRelationExpiryRecordService;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) {
@@ -319,6 +314,12 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			orderDonMapper.insert(orderDon);
 			log.info("用户{}兑换规格:{}车位成功", user.getId(), orderDon.getSkuId());
 		}
+		if (orderDonTye == OrderDon.Type.EX_CODE) {
+			//同步车票是否重购 记录
+			TASK_POOL.execute(() -> {
+				groupsRelationExpiryRecordService.syncGroupsRelationExpiryRecord(orderDon, goodsDon, sku);
+			});
+		}
 //		if (StrUtil.isNotEmpty(user.getOpenId())) {
 //			//发送模板消息
 //			THREAD_POOL_TASK_EXECUTOR.execute(() -> {

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

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.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;
@@ -48,8 +49,10 @@ import com.cyksj.service.order.OrderCommonService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.paypal.PayPalService;
 import com.cyksj.service.relation.GroupRelationClearService;
+import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.stripe.StripeService;
 import com.cyksj.service.user.UserBenefitsService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.util.MapUtils;
@@ -141,6 +144,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final BeanSearcher beanSearcher;
 
+    private final UserBindRelationService userBindRelationService;
+
+    private final GroupsRelationExpiryRecordService groupsRelationExpiryRecordService;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -708,6 +715,29 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                     }
                 }
             }
+
+            //同步车票退款 重购记录
+            TASK_POOL.execute(() -> {
+                GroupsRelationExpiryRecord groupsRelationExpiryRecord = groupsRelationExpiryRecordService.getOne(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+                        .in(GroupsRelationExpiryRecord::getReBuyOrderId, orderDon.getId())
+                        .eq(GroupsRelationExpiryRecord::getRelationId, orderDon.getRelationId()).last("limit 1"));
+                if (groupsRelationExpiryRecord == null) {
+                    log.info("订单orderId:{}退款,同步是否有重构记录不是直接续费车票",orderDon.getId());
+                    List<GroupsRelationExpiryRecord> groupsRelationExpiryRecords = groupsRelationExpiryRecordService.list(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+                            .in(GroupsRelationExpiryRecord::getReBuyOrderId, orderDon.getId()));
+                    log.info("订单orderId:{}退款,重构记录不是直接续费车票大小:{}",groupsRelationExpiryRecords.size());
+                    if (CollUtil.isNotEmpty(groupsRelationExpiryRecords)) {
+                        groupsRelationExpiryRecords.forEach(data -> {
+                            data.setIsReBuy(false);
+                        });
+                        groupsRelationExpiryRecordService.saveOrUpdateBatch(groupsRelationExpiryRecords);
+                    }
+                }
+                if (groupsRelationExpiryRecord != null) {
+                    groupsRelationExpiryRecord.setIsReBuy(false);
+                    groupsRelationExpiryRecordService.saveOrUpdate(groupsRelationExpiryRecord);
+                }
+            });
         });
     }
 

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -70,6 +70,7 @@ import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.pay.AliPayCommonService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.relation.GroupRelationFrontService;
+import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.user.UserBenefitsService;
@@ -209,6 +210,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final ChannelPopularizeMapper channelPopularizeMapper;
 
+	private final GroupsRelationExpiryRecordService groupsRelationExpiryRecordService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -2138,6 +2141,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//修改车位状态并发送模板消息
 			updateCarParkAndSendMsg(goodsDon, sku, orderDon);
 		}
+		//同步车票是否重购 记录
+		TASK_POOL.execute(() -> {
+			groupsRelationExpiryRecordService.syncGroupsRelationExpiryRecord(orderDon, goodsDon, sku);
+		});
 	}
 
 

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupsRelationExpiryRecordService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.relation;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+import com.cyksj.model.entity.OrderDon;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsRelationExpiryRecordService
+ *创建者: JavaZou
+ *创建时间:2023/9/5 11:47
+ */
+public interface GroupsRelationExpiryRecordService extends IService<GroupsRelationExpiryRecord> {
+	void syncGroupsRelationExpiryRecord(OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku);
+}

+ 66 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupsRelationExpiryRecordServiceImpl.java

@@ -0,0 +1,66 @@
+package com.cyksj.service.relation.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
+import com.cyksj.service.user.UserBindRelationService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsRelationExpiryRecordServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/9/5 11:47
+ */
+@Service
+@RequiredArgsConstructor
+public class GroupsRelationExpiryRecordServiceImpl extends ServiceImpl<GroupsRelationExpiryRecordMapper, GroupsRelationExpiryRecord> implements GroupsRelationExpiryRecordService {
+	private final UserBindRelationService userBindRelationService;
+
+	@Override
+	public void syncGroupsRelationExpiryRecord(OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+		GroupsRelationExpiryRecord groupsRelationExpiryRecord = this.getOne(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+				.in(GroupsRelationExpiryRecord::getUserId, userIdList)
+				.eq(GroupsRelationExpiryRecord::getIsReBuy, false)
+				.eq(GroupsRelationExpiryRecord::getRelationId, orderDon.getRelationId()).last("limit 1"));
+		if (groupsRelationExpiryRecord == null) {
+			List<GroupsRelationExpiryRecord> groupsRelationExpiryRecords = this.list(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+					.in(GroupsRelationExpiryRecord::getUserId, userIdList)
+					.eq(GroupsRelationExpiryRecord::getIsReBuy, false)
+					.eq(GroupsRelationExpiryRecord::getGoodsId, orderDon.getGoodsId()));
+			if (CollUtil.isNotEmpty(groupsRelationExpiryRecords)) {
+				groupsRelationExpiryRecords.forEach(data -> {
+					data.setReBuyGoodsId(goodsDon.getId());
+					data.setReBuyGoodsTitle(goodsDon.getTitle());
+					data.setReBuySkuId(sku.getId());
+					data.setReBuySpecVal(sku.getSpecVal());
+					data.setReBuyOrderId(orderDon.getId());
+					data.setReBuyTime(Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime()));
+					data.setIsReBuy(true);
+				});
+				this.saveOrUpdateBatch(groupsRelationExpiryRecords);
+			}
+		}
+		if (groupsRelationExpiryRecord != null) {
+			groupsRelationExpiryRecord.setReBuyGoodsId(goodsDon.getId());
+			groupsRelationExpiryRecord.setReBuyGoodsTitle(goodsDon.getTitle());
+			groupsRelationExpiryRecord.setReBuySkuId(sku.getId());
+			groupsRelationExpiryRecord.setReBuySpecVal(sku.getSpecVal());
+			groupsRelationExpiryRecord.setReBuyOrderId(orderDon.getId());
+			groupsRelationExpiryRecord.setReBuyTime(Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime()));
+			groupsRelationExpiryRecord.setIsReBuy(true);
+			this.saveOrUpdate(groupsRelationExpiryRecord);
+		}
+	}
+}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserBackService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.user;
+
+/*
+ *项目名: netflix
+ *文件名: UserBackService
+ *创建者: JavaZou
+ *创建时间:2023/9/5 12:19
+ */
+public interface UserBackService {
+	boolean isCustomer(Long adminId);
+}

+ 34 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBackServiceImpl.java

@@ -0,0 +1,34 @@
+package com.cyksj.service.user.impl;
+
+import com.cyksj.model.views.CmsUserVO;
+import com.cyksj.service.user.UserBackService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: UserBackServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/9/5 12:19
+ */
+@Service
+@RequiredArgsConstructor
+public class UserBackServiceImpl implements UserBackService {
+	private final BeanSearcher beanSearcher;
+
+	@Override
+	public boolean isCustomer(Long adminId) {
+		//是不是客服
+		CmsUserVO isCustomer = beanSearcher.searchFirst(CmsUserVO.class, MapUtils.builder()
+				.field(CmsUserVO::getId, adminId)
+				.field(CmsUserVO::getRoleNames, "客服").op(Operator.Contain)
+				.build());
+		if (isCustomer != null) {
+			return true;
+		}
+		return false;
+	}
+}

+ 104 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupsRelationExpiryController.java

@@ -0,0 +1,104 @@
+package com.cyksj.web.controller.manage.group;
+
+import cn.dev33.satoken.stp.StpUtil;
+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.GroupsRelationCustomerServiceFollowRecordMapper;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.entity.GroupsRelationCustomerServiceFollowRecord;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+import com.cyksj.model.entity.User;
+import com.cyksj.service.user.UserBackService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/*
+ *项目名: netflix
+ *文件名: CmsGroupsRelationExpiryController
+ *创建者: JavaZou
+ *创建时间:2023/9/5 12:08
+ */
+@RestController
+@RequestMapping("/manage/relation/track")
+@RequiredArgsConstructor
+public class CmsGroupsRelationExpiryController {
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserBackService userBackService;
+
+	private final GroupsRelationExpiryRecordMapper groupsRelationExpiryRecordMapper;
+
+	private final GroupsRelationCustomerServiceFollowRecordMapper relationCustomerServiceFollowRecordMapper;
+
+	private final UserMapper userMapper;
+
+	/**
+	 * 到期用户 客服跟进续费列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GroupsRelationExpiryRecord>> get(String showId) {
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (userBackService.isCustomer(adminId)) {
+			builder.field(GroupsRelationExpiryRecord::getCustomerServiceId, adminId);
+		}
+		if (StrUtil.isNotBlank(showId)) {
+			User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getShowId, showId).last("limit 1"));
+			if (user != null) {
+				builder.field(GroupsRelationExpiryRecord::getUserId, user.getId());
+			}
+		}
+		SearchResult<GroupsRelationExpiryRecord> search = beanSearcher.search(GroupsRelationExpiryRecord.class, builder
+				.orderBy(GroupsRelationExpiryRecord::getId).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 跟进记录列表
+	 */
+	@GetMapping("/get/reBuy/record/{trackId}")
+	public Result<SearchResult<GroupsRelationCustomerServiceFollowRecord>> getReBuyRecord(@PathVariable Long trackId) {
+		SearchResult<GroupsRelationCustomerServiceFollowRecord> search = beanSearcher.search(GroupsRelationCustomerServiceFollowRecord.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(GroupsRelationCustomerServiceFollowRecord::getEcId, trackId)
+				.orderBy(GroupsRelationCustomerServiceFollowRecord::getId).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 客服进行跟进
+	 */
+	@PostMapping("/reBuy")
+	@Transactional(rollbackFor = Throwable.class)
+	public Result<String> recordReBuy(@RequestBody GroupsRelationCustomerServiceFollowRecord record) {
+		Long ecId = record.getEcId();
+		if (ecId == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应的跟进车票");
+		}
+		GroupsRelationExpiryRecord groupsRelationExpiryRecord = groupsRelationExpiryRecordMapper.selectById(ecId);
+		if (groupsRelationExpiryRecord == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应的跟进车票");
+		}
+		if (StrUtil.isAllBlank(record.getContent(), record.getImgs())) {
+			throw BusinessRuntimeException.getInstance("请完善对应跟进信息");
+		}
+		relationCustomerServiceFollowRecordMapper.insert(record);
+		groupsRelationExpiryRecord.setIsFollow(true);
+		groupsRelationExpiryRecordMapper.updateById(groupsRelationExpiryRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}