Browse Source

用户到期车票客服跟进记录

zoujiajian 3 năm trước cách đây
mục cha
commit
f10447266a

+ 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;
+}

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

@@ -0,0 +1,76 @@
+package com.cyksj.model.entity;
+
+import com.cyksj.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix-job
+ *文件名: GroupsRelationExpiryRecord
+ *创建者: JavaZou
+ *创建时间:2023/9/4 16:48
+ */
+@Getter
+@Setter
+public class GroupsRelationExpiryRecord extends BaseEntity {
+	private Long userId;
+
+	private String nickname;
+
+	/**
+	 * 注册方式
+	 */
+	private String registerEnv;
+
+	/**
+	 * 是否加入了企业微信
+	 */
+	private Boolean isJoinCorpWx;
+
+	private Long goodsId;
+
+	private String goodsTitle;
+
+	private Long relationId;
+
+	private Long skuId;
+
+	private String specVal;
+
+	private Boolean isReBuy;
+
+	private Long reBuyOrderId;
+
+	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;
+}

+ 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
@@ -678,6 +685,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);
+                }
+            });
         });
     }
 

+ 35 - 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)
@@ -2102,6 +2105,38 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//修改车位状态并发送模板消息
 			updateCarParkAndSendMsg(goodsDon, sku, orderDon);
 		}
+		//同步车票是否重购 记录
+		TASK_POOL.execute(() -> {
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+			GroupsRelationExpiryRecord groupsRelationExpiryRecord = groupsRelationExpiryRecordService.getOne(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+					.in(GroupsRelationExpiryRecord::getUserId, userIdList)
+					.eq(GroupsRelationExpiryRecord::getRelationId, orderDon.getRelationId()).last("limit 1"));
+			if (groupsRelationExpiryRecord == null) {
+				List<GroupsRelationExpiryRecord> groupsRelationExpiryRecords = groupsRelationExpiryRecordService.list(Wrappers.lambdaQuery(GroupsRelationExpiryRecord.class)
+						.in(GroupsRelationExpiryRecord::getUserId, userIdList)
+						.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.setIsReBuy(true);
+					});
+					groupsRelationExpiryRecordService.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.setIsReBuy(true);
+				groupsRelationExpiryRecordService.saveOrUpdate(groupsRelationExpiryRecord);
+			}
+		});
 	}
 
 

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

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

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

@@ -0,0 +1,15 @@
+package com.cyksj.service.relation.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsRelationExpiryRecordServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/9/5 11:47
+ */
+public class GroupsRelationExpiryRecordServiceImpl extends ServiceImpl<GroupsRelationExpiryRecordMapper, GroupsRelationExpiryRecord> implements GroupsRelationExpiryRecordService {
+}

+ 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;
+	}
+}

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

@@ -0,0 +1,85 @@
+package com.cyksj.web.controller.manage.group;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+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.model.entity.GroupsRelationCustomerServiceFollowRecord;
+import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+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.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;
+
+	/**
+	 * 到期用户 客服跟进续费列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GroupsRelationExpiryRecord>> get() {
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (userBackService.isCustomer(adminId)) {
+			builder.field(GroupsRelationExpiryRecord::getCustomerServiceId, adminId);
+		}
+		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")
+	public Result<String> recordReBuy(@RequestBody GroupsRelationCustomerServiceFollowRecord record) {
+		Long ecId = record.getEcId();
+		if (ecId == null || groupsRelationExpiryRecordMapper.selectById(ecId) == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应的跟进车票");
+		}
+		if (StrUtil.isAllBlank(record.getContent(), record.getImgs())) {
+			throw BusinessRuntimeException.getInstance("请完善对应跟进信息");
+		}
+		relationCustomerServiceFollowRecordMapper.insert(record);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}