From 106975a3e6e938d1a459fa2063fc7b06a7a21b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=9E=E6=89=AC?= Date: Mon, 14 Aug 2023 16:06:56 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=91=BC=E5=87=BA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cool/store/service/CallService.java | 2 +- .../java/com/cool/store/service/impl/CallServiceImpl.java | 3 ++- .../main/java/com/cool/store/controller/CallController.java | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/CallService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/CallService.java index 6099fe925..820b498ed 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/CallService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/CallService.java @@ -11,7 +11,7 @@ import com.cool.store.request.CallUpReq; * @Description: */ public interface CallService { - void callUp(CallUpReq request) throws ApiException; + String callUp(CallUpReq request) throws ApiException; void callFinishBack(CallFinishBackReq request) throws ApiException; void callRecordBack(CallRecordBackReq request) throws ApiException; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java index cf4602aa4..388021117 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java @@ -37,7 +37,7 @@ public class CallServiceImpl implements CallService { @Autowired private HyOutboundMobileMapper hyOutboundMobileMapper; @Override - public void callUp(CallUpReq request) throws ApiException { + public String callUp(CallUpReq request) throws ApiException { try { //校验拨出手机号APP是否在线 boolean isOnline = WebSocketServer.isOnline(request.getOutgoingMobile()); @@ -70,6 +70,7 @@ public class CallServiceImpl implements CallService { //保存通话记录 callRecordMapper.insertSelective(callRecordDO); + return transNo; } catch (Exception e) { log.error("callUp error, request:{}", JSON.toJSONString(request), e); throw new ApiException(ErrorCodeEnum.CALL_UP_ERROR); diff --git a/coolstore-partner-webb/src/main/java/com/cool/store/controller/CallController.java b/coolstore-partner-webb/src/main/java/com/cool/store/controller/CallController.java index 3d4b72fd2..50e2b9975 100644 --- a/coolstore-partner-webb/src/main/java/com/cool/store/controller/CallController.java +++ b/coolstore-partner-webb/src/main/java/com/cool/store/controller/CallController.java @@ -33,8 +33,8 @@ public class CallController { @PostMapping("/callUp") @ApiOperation("呼出电话") public ResponseResult callUp(@RequestBody CallUpReq request) throws ApiException { - callService.callUp(request); - return ResponseResult.success(); + String res = callService.callUp(request); + return ResponseResult.success(res); } @PostMapping("/finish/callback") From 9f55e9c2d8c3362b1c83c0936474e7111b0e983e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Mon, 14 Aug 2023 17:12:34 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=A0=87=E7=AD=BEMAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/dto/partner/UserPortraitDTO.java | 21 +++++++++++++++++++ .../vo/PartnerLineInfoAndBaseInfoVO.java | 3 ++- .../impl/HyPartnerLineInfoServiceImpl.java | 6 ++++-- 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/partner/UserPortraitDTO.java diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/UserPortraitDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/UserPortraitDTO.java new file mode 100644 index 000000000..355c9f2ca --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/partner/UserPortraitDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.partner; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2023/8/14 17:08 + * @Version 1.0 + */ +@Data +public class UserPortraitDTO { + + private Long userPortraitId; + + private String userPortraitName; + + public UserPortraitDTO(Long userPortraitId, String userPortraitName) { + this.userPortraitId = userPortraitId; + this.userPortraitName = userPortraitName; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerLineInfoAndBaseInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerLineInfoAndBaseInfoVO.java index dcaa010da..8e86fd176 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerLineInfoAndBaseInfoVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/PartnerLineInfoAndBaseInfoVO.java @@ -1,5 +1,6 @@ package com.cool.store.vo; +import com.cool.store.dto.partner.UserPortraitDTO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -49,7 +50,7 @@ public class PartnerLineInfoAndBaseInfoVO { private String investmentManagerPhone; @ApiModelProperty("用户画像") - private List userPortrait; + private List userPortrait; @ApiModelProperty("线索状态") private Integer lineStatus; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java index a3c08d110..bf66c6778 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java @@ -113,9 +113,11 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { String userPortrait = partnerLineInfoAndBaseInfoDTO.getUserPortrait(); if (StringUtils.isNotEmpty(userPortrait)){ Map userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(userPortrait)); - List userPortraitList = userPortraitMap.values().stream() + + List userPortraitDTOS = userPortraitMap.entrySet().stream() + .map(entry -> new UserPortraitDTO(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); - partnerLineInfoAndBaseInfoVO.setUserPortrait(userPortraitList); + partnerLineInfoAndBaseInfoVO.setUserPortrait(userPortraitDTOS); } List userIds = new ArrayList<>(); From 6e4dd2b45e2c088f62a3b636a9251e00b46629be Mon Sep 17 00:00:00 2001 From: zhangchenbiao Date: Tue, 15 Aug 2023 14:56:17 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cool/store/constants/CommonConstants.java | 7 +- .../store/enums/OperateLogFieldValueEnum.java | 4 +- .../com/cool/store/enums/OperateTypeEnum.java | 2 +- .../com/cool/store/dao/HyFollowTaskDAO.java | 55 +++++++++++ .../cool/store/mapper/HyFollowTaskMapper.java | 30 ++++++ .../resources/mapper/HyFollowTaskMapper.xml | 35 +++++++ .../store/dto/follow/FollowTaskNumDTO.java | 42 +++++++++ .../com/cool/store/dto/log/AddTagsDTO.java | 6 ++ .../store/vo/follow/FollowTaskPageVO.java | 8 ++ .../java/com/cool/store/job/JobHandler.java | 30 ++++++ .../cool/store/service/FollowTaskService.java | 12 +++ .../service/impl/FollowTaskServiceImpl.java | 94 ++++++++++++++++++- .../impl/HyPartnerBaseInfoServiceImpl.java | 29 ++++-- 13 files changed, 337 insertions(+), 17 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/follow/FollowTaskNumDTO.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index fb7c92c84..7bfc6f949 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -29,9 +29,9 @@ public class CommonConstants { public static final int AN_HOUR_SECONDS = 3600; /** - * 企业开通锁存活时间 + * 跟进任务通知缓存时间 1小时 */ - public static final int ENTERPRISE_OPEN_LOCK_TIMES = 4 * 60 * 60 * 1000; + public static final int FOLLOW_TASK_NOTICE_LOCK_TIMES = 60 * 60 * 1000; public static final int ONE_DAY_SECONDS = 24 * 60 * 60; @@ -103,6 +103,7 @@ public class CommonConstants { public static final int EIGHTY = 80; public static final int NINETY = 90; public static final int HUNDRED = 100; + public static final int FIVE_HUNDRED = 100; public static final int ONE_THOUSAND = 1000; @@ -133,4 +134,6 @@ public class CommonConstants { public static final String DAY_START_TIME_SUFFIX = " 00:00:00"; + public static final String FOLLOW_TASK_NOTICE_KEY = "follow_task_notice:{0}:{1}"; + } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java index 185a03de8..10a8ee4c4 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java @@ -47,7 +47,9 @@ public enum OperateLogFieldValueEnum { BEFORE_CLERK_INFO_UPDATE("beforeClerkUpdate", "修改前的意向书员工信息"), AFTER_CLERK_INFO_UPDATE("afterClerkUpdate", "修改后的意向书员工信息"), FOLLOW_LOG("followLog", "跟进日志"), - FOLLOW_TASK_ID("followTaskId", "跟进任务id") + FOLLOW_TASK_ID("followTaskId", "跟进任务id"), + ADD_LABELS("addLabels", "新增标签"), + REMOVE_LABELS("removeLabels", "移除标签") ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java index db75c1204..b8b3ffbfa 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java @@ -34,7 +34,7 @@ public enum OperateTypeEnum { USERINFO_UPDATE("userinfo_update", "修改(修改意向信息)", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_USERINFO_UPDATE, AFTER_USERINFO_UPDATE)), INTENT_INFO_SUBMIT("intent_info_submit", "提交意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, AFTER_BASE_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)), INTENT_INFO_UPDATE("intent_info_update", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_BASE_INFO_UPDATE, AFTER_BASE_INFO_UPDATE, BEFORE_INTENT_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, BEFORE_CLERK_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)), - ADD_TAGS("add_tags", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME)), + ADD_TAGS("add_tags", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, ADD_LABELS, REMOVE_LABELS)), ADD_FOLLOW_LOG("add_follow_log", "新增根据日志", Arrays.asList(FOLLOW_LOG)), ADD_FOLLOW_TASK("add_follow_task", "新增跟进任务", Arrays.asList(FOLLOW_TASK_ID)) ; diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java index 992638a93..3494fc08a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java @@ -1,15 +1,21 @@ package com.cool.store.dao; +import cn.hutool.core.date.DateUtil; +import com.cool.store.constants.CommonConstants; +import com.cool.store.dto.follow.FollowTaskNumDTO; import com.cool.store.entity.HyFollowTaskDO; import com.cool.store.enums.FollowTaskStatusEnum; import com.cool.store.mapper.HyFollowTaskMapper; +import com.cool.store.utils.CoolDateUtils; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.Date; import java.util.List; import java.util.Objects; @@ -140,4 +146,53 @@ public class HyFollowTaskDAO { hyFollowTaskMapper.cancelUndoFollowTask(partnerLineId); } + /** + * 获取消息通知的跟进人 + * @param date + * @param pageNum + * @param pageSize + * @return + */ + public Page getRemindFollowUserIds(Date date, Integer pageNum, Integer pageSize){ + String startTime = DateUtil.format(date, CoolDateUtils.DATE_FORMAT_DAY) + CommonConstants.DAY_START_TIME_SUFFIX; + String endTime = DateUtil.format(date, CoolDateUtils.DATE_FORMAT_DAY) + CommonConstants.DAY_END_TIME_SUFFIX; + PageHelper.startPage(pageNum, pageSize); + return hyFollowTaskMapper.getRemindFollowUserIds(startTime, endTime); + } + + /** + * 获取用户任务数量 + * @param followUserIds + * @return + */ + public List getUserTaskNum(List followUserIds){ + if(CollectionUtils.isEmpty(followUserIds)){ + return Lists.newArrayList(); + } + return hyFollowTaskMapper.getUserTaskNum(followUserIds); + } + + /** + * 获取待完成任务 + * @param startTime + * @param endTime + * @param pageNum + * @param pageSize + * @return + */ + public Page getUndoTaskPage(String startTime, String endTime, Integer pageNum, Integer pageSize){ + PageHelper.startPage(pageNum, pageSize); + return hyFollowTaskMapper.getUndoTaskPage(startTime, endTime); + } + + /** + * 更新未完成任务的状态到已逾期 + * @return + */ + public Integer updateUndoTaskStatusToOverdue(){ + return hyFollowTaskMapper.updateUndoTaskStatusToOverdue(); + } + + + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java index 971990233..6988ffbf3 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java @@ -1,5 +1,6 @@ package com.cool.store.mapper; +import com.cool.store.dto.follow.FollowTaskNumDTO; import com.cool.store.entity.HyFollowTaskDO; import com.github.pagehelper.Page; import org.apache.ibatis.annotations.Param; @@ -63,4 +64,33 @@ public interface HyFollowTaskMapper { * @return */ Integer cancelUndoFollowTask(@Param("partnerLineId") Long partnerLineId); + + /** + * 获取发送通知的跟进人 + * @param startTime + * @param endTime + * @return + */ + Page getRemindFollowUserIds(@Param("startTime")String startTime, @Param("endTime")String endTime); + + /** + * 获取用户任务数量 + * @param followUserIds + * @return + */ + List getUserTaskNum(@Param("followUserIds") List followUserIds); + + /** + * 获取待完成任务 + * @param startTime + * @param endTime + * @return + */ + Page getUndoTaskPage(@Param("startTime") String startTime, @Param("endTime") String endTime); + + /** + * 更新未完成任务的状态 + * @return + */ + Integer updateUndoTaskStatusToOverdue(); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml index 22dd7b60b..29c8107bd 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml @@ -165,4 +165,39 @@ update hy_follow_task set task_status = '3' where partner_line_id = #{partnerLineId} and task_status in ('0', '2') + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/follow/FollowTaskNumDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/follow/FollowTaskNumDTO.java new file mode 100644 index 000000000..fe0db2757 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/follow/FollowTaskNumDTO.java @@ -0,0 +1,42 @@ +package com.cool.store.dto.follow; + +import com.cool.store.constants.MessageConstants; +import com.cool.store.utils.StringUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.text.MessageFormat; + +/** + * @author zhangchenbiao + * @FileName: FollowTaskNumDTO + * @Description: + * @date 2023-08-14 16:01 + */ +@Data +public class FollowTaskNumDTO { + + @ApiModelProperty("任务跟进人id") + private String followUserId; + + @ApiModelProperty("未完成数量") + private Integer todoNum; + + @ApiModelProperty("逾期数量") + private Integer overdueNum; + + public static String getMessageContent(FollowTaskNumDTO followTask){ + if(followTask.getTodoNum() > 0 && followTask.getOverdueNum() > 0){ + return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_1, followTask.getTodoNum(), followTask.getOverdueNum()); + } + if(followTask.getTodoNum() == 0 && followTask.getOverdueNum() > 0){ + return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_2, followTask.getOverdueNum()); + } + if(followTask.getTodoNum() > 0 && followTask.getOverdueNum() == 0){ + return MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT_3, followTask.getTodoNum()); + } + return StringUtil.EMPTY; + } + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/log/AddTagsDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/log/AddTagsDTO.java index 5c5c63a51..fa6039957 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/log/AddTagsDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/log/AddTagsDTO.java @@ -3,6 +3,8 @@ package com.cool.store.dto.log; import lombok.Builder; import lombok.Data; +import java.util.List; + /** * @Author suzhuhong * @Date 2023/7/4 10:05 @@ -19,4 +21,8 @@ public class AddTagsDTO { private String operateUserId; private String mobile; + + private List addLabels; + + private List removeLabels; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskPageVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskPageVO.java index 3b4df4fef..a44070f71 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskPageVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskPageVO.java @@ -17,6 +17,9 @@ import java.util.*; @Data public class FollowTaskPageVO { + @ApiModelProperty("任务id") + private Long followTaskId; + @ApiModelProperty("线索id") private Long partnerLineId; @@ -35,6 +38,9 @@ public class FollowTaskPageVO { @ApiModelProperty("跟进阶段") private String workflowStage; + @ApiModelProperty("线索用户id") + private String partnerId; + @ApiModelProperty("线索用户名") private String partnerUsername; @@ -51,12 +57,14 @@ public class FollowTaskPageVO { continue; } FollowTaskPageVO result = new FollowTaskPageVO(); + result.setFollowTaskId(task.getId()); result.setPartnerLineId(task.getPartnerLineId()); result.setTaskTitle(task.getTaskTitle()); result.setCommunicationType(task.getCommunicationType()); result.setDeadline(task.getDeadline()); result.setTaskStatus(task.getTaskStatus()); result.setWorkflowStage(partnerInfo.getWorkflowStage()); + result.setPartnerId(partnerInfo.getPartnerId()); result.setPartnerUsername(partnerInfo.getUsername()); result.setPartnerMobile(partnerInfo.getMobile()); resultList.add(result); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/job/JobHandler.java b/coolstore-partner-service/src/main/java/com/cool/store/job/JobHandler.java index 63255b250..20930e349 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/job/JobHandler.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/job/JobHandler.java @@ -1,6 +1,7 @@ package com.cool.store.job; import com.cool.store.service.EnterpriseSyncService; +import com.cool.store.service.FollowTaskService; import com.cool.store.service.HyPartnerInterviewPlanService; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; @@ -26,6 +27,9 @@ public class JobHandler { @Autowired private HyPartnerInterviewPlanService hyPartnerInterviewPlanService; + @Resource + private FollowTaskService followTaskService; + @XxlJob("syncOrganization") public void syncOrganization(){ log.info("组织架构定时同步开始"); @@ -76,4 +80,30 @@ public class JobHandler { } } + @XxlJob("followTaskAnHourAgoRemind") + public void followTaskAnHourAgoRemind(){ + try { + log.info("跟进任务前一小时提醒开始"); + followTaskService.followTaskAnHourAgoRemind(); + log.info("跟进任务前一小时提醒结束"); + XxlJobHelper.handleSuccess(); + }catch (Exception e){ + log.error("跟进任务前一小时提醒异常",e); + XxlJobHelper.log("跟进任务前一小时提醒异常"+e.getMessage()); + } + } + + @XxlJob("followTaskRemind") + public void followTaskRemind(){ + try { + log.info("跟进任务提醒开始"); + followTaskService.followTaskRemind(); + log.info("跟进任务提醒结束"); + XxlJobHelper.handleSuccess(); + }catch (Exception e){ + log.error("跟进任务提醒异常",e); + XxlJobHelper.log("跟进任务提醒异常"+e.getMessage()); + } + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/FollowTaskService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/FollowTaskService.java index 2aacc4ffb..871610204 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/FollowTaskService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/FollowTaskService.java @@ -75,4 +75,16 @@ public interface FollowTaskService { * @return */ Integer cancelFollowTask(FollowTaskIdRequest request, String userId); + + /** + * 跟进任务前一小时提醒 + * @return + */ + void followTaskAnHourAgoRemind(); + + /** + * 跟进任务每日10点提醒 + * @return + */ + void followTaskRemind(); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java index d5035177f..2d740f341 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java @@ -8,6 +8,7 @@ import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dao.HyFollowTaskDAO; import com.cool.store.dao.HyPartnerLineInfoDAO; import com.cool.store.dao.HyPartnerTaskInfoLogDAO; +import com.cool.store.dto.follow.FollowTaskNumDTO; import com.cool.store.dto.log.LineLogInfo; import com.cool.store.dto.message.SendCardMessageDTO; import com.cool.store.dto.partner.PartnerSimpleInfoDTO; @@ -23,6 +24,7 @@ import com.cool.store.request.follow.FollowTaskIdRequest; import com.cool.store.request.follow.UpdateFollowTaskRequest; import com.cool.store.service.FollowTaskService; import com.cool.store.utils.CoolDateUtils; +import com.cool.store.utils.RedisUtilPool; import com.cool.store.vo.follow.FollowTaskLogVO; import com.cool.store.vo.follow.FollowTaskPageVO; import com.github.pagehelper.Page; @@ -36,10 +38,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.MessageFormat; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -61,6 +60,8 @@ public class FollowTaskServiceImpl implements FollowTaskService { @Resource private EnterpriseUserDAO enterpriseUserDAO; @Resource + private RedisUtilPool redisUtilPool; + @Resource private ISVHttpRequest isvHttpRequest; @Value("${feishu.notice.link.url:null}") private String linkUrl; @@ -161,6 +162,85 @@ public class FollowTaskServiceImpl implements FollowTaskService { return hyFollowTaskDAO.cancelFollowTask(request.getFollowTaskId()); } + @Override + public void followTaskAnHourAgoRemind() { + //获取一个小时后的任务 + Boolean hasNext = true; + int pageNum = CommonConstants.ONE, pageSize = CommonConstants.HUNDRED; + String startTime = DateUtil.format(DateUtils.addMinutes(new Date(), -CommonConstants.FIVE), CoolDateUtils.DATE_FORMAT_SEC); + String endTime = DateUtil.format(DateUtils.addMinutes(new Date(), CommonConstants.FIVE), CoolDateUtils.DATE_FORMAT_SEC); + while (hasNext){ + Page undoTaskList = hyFollowTaskDAO.getUndoTaskPage(startTime, endTime, pageNum, pageSize); + if(CollectionUtils.isEmpty(undoTaskList)){ + break; + } + if(undoTaskList.size() < pageSize){ + hasNext = false; + } + pageNum++; + List lineIds = undoTaskList.stream().map(HyFollowTaskDO::getPartnerLineId).distinct().collect(Collectors.toList()); + Map partnerSimpleInfoMap = hyPartnerLineInfoDAO.getPartnerSimpleInfoByLineIds(lineIds); + for (HyFollowTaskDO followTask : undoTaskList) { + PartnerSimpleInfoDTO partnerInfo = partnerSimpleInfoMap.get(followTask.getPartnerLineId()); + if(Objects.isNull(partnerInfo)){ + continue; + } + String lockKey = MessageFormat.format(CommonConstants.FOLLOW_TASK_NOTICE_KEY, followTask.getFollowUserId(), followTask.getId()); + boolean result = redisUtilPool.setNxExpire(lockKey, DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC), CommonConstants.FOLLOW_TASK_NOTICE_LOCK_TIMES); + if(!result){ + //一小时内发送过不再发送通知 + continue; + } + SendCardMessageDTO sendCardMessage = new SendCardMessageDTO(); + sendCardMessage.setMessageUrl(linkUrl); + sendCardMessage.setMessageType(MessageTypeEnum.SCHEDULE_REMINDER); + String dateline = DateUtil.format(followTask.getDeadline(), CoolDateUtils.DATE_FORMAT_SEC_2); + String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile()); + sendCardMessage.setContent(content); + sendCardMessage.setTitle(MessageConstants.FOLLOW_TASK_MESSAGE_TITLE); + sendCardMessage.setUserIds(Arrays.asList(followTask.getFollowUserId())); + try { + isvHttpRequest.sendFeiShuCardMessage(sendCardMessage); + } catch (ApiException e) { + log.error("跟进任务发送通知失败, {}", JSONObject.toJSONString(followTask)); + } + } + } + //更新过期的任务状态 + hyFollowTaskDAO.updateUndoTaskStatusToOverdue(); + } + + @Override + public void followTaskRemind() { + //获取已逾期的 以及截止时间为当天的任务 的招商经理 + Boolean hasNext = true; + int pageNum = CommonConstants.ONE, pageSize = CommonConstants.HUNDRED; + while (hasNext){ + Page remindFollowUserIds = hyFollowTaskDAO.getRemindFollowUserIds(new Date(), pageNum, pageSize); + if(CollectionUtils.isEmpty(remindFollowUserIds)){ + break; + } + if(remindFollowUserIds.size() < pageSize){ + hasNext = false; + } + pageNum++; + List followTaskList = hyFollowTaskDAO.getUserTaskNum(remindFollowUserIds); + for (FollowTaskNumDTO followTask : followTaskList) { + SendCardMessageDTO sendCardMessage = new SendCardMessageDTO(); + sendCardMessage.setMessageUrl(linkUrl); + sendCardMessage.setMessageType(MessageTypeEnum.SCHEDULE_REMINDER); + sendCardMessage.setContent(FollowTaskNumDTO.getMessageContent(followTask)); + sendCardMessage.setTitle(MessageConstants.FOLLOW_TASK_MESSAGE_TITLE); + sendCardMessage.setUserIds(Arrays.asList(followTask.getFollowUserId())); + try { + isvHttpRequest.sendFeiShuCardMessage(sendCardMessage); + } catch (ApiException e) { + log.error("跟进任务发送通知失败, {}", JSONObject.toJSONString(followTask)); + } + } + } + } + /** * 线索校验 * @param partnerLineId @@ -183,6 +263,12 @@ public class FollowTaskServiceImpl implements FollowTaskService { if(Objects.isNull(partnerInfo)){ return; } + String lockKey = MessageFormat.format(CommonConstants.FOLLOW_TASK_NOTICE_KEY, task.getFollowUserId(), task.getId()); + boolean result = redisUtilPool.setNxExpire(lockKey, DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC), CommonConstants.FOLLOW_TASK_NOTICE_LOCK_TIMES); + if(!result){ + //一小时内发送过不再发送通知 + return; + } String dateline = DateUtil.format(task.getDeadline(), CoolDateUtils.DATE_FORMAT_SEC_2); String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile()); SendCardMessageDTO sendCardMessage = new SendCardMessageDTO(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java index 502dff100..35b22684a 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerBaseInfoServiceImpl.java @@ -5,12 +5,10 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; -import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.context.PartnerUserHolder; import com.cool.store.dao.*; import com.cool.store.dto.log.AddTagsDTO; -import com.cool.store.dto.log.BlackListLogDTO; import com.cool.store.dto.log.LineLogInfo; import com.cool.store.dto.log.WantInfoUpdateDTO; import com.cool.store.entity.*; @@ -19,10 +17,7 @@ import com.cool.store.exception.ServiceException; import com.cool.store.mapper.HyPartnerCertificationInfoMapper; import com.cool.store.request.AddTagsRequest; import com.cool.store.request.PartnerBaseInfoRequest; -import com.cool.store.service.HyPartnerBaseInfoService; -import com.cool.store.service.HyPartnerLineInfoService; -import com.cool.store.service.HyPhoneLocationService; -import com.cool.store.service.LogService; +import com.cool.store.service.*; import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.RedisUtilPool; import com.cool.store.vo.PartnerBaseInfoVO; @@ -35,8 +30,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.MessageFormat; -import java.util.Collections; -import java.util.Date; +import java.util.*; import java.util.stream.Collectors; /** @@ -84,6 +78,8 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService { @Autowired private LogService logService; + @Resource + private LabelService labelService; @Override @@ -92,18 +88,33 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService { if (hyPartnerBaseInfo==null){ throw new ServiceException(ErrorCodeEnum.PARTNER_BASE_INFO_NOT_EXIST); } + String oldUserPortrait = hyPartnerBaseInfo.getUserPortrait(); hyPartnerBaseInfo.setId(addTagsRequest.getPartnerBaseInfoId()); hyPartnerBaseInfo.setUserPortrait(CollectionUtils.isNotEmpty(addTagsRequest.getTags())? addTagsRequest.getTags().stream().map(Object::toString).collect(Collectors.joining(CommonConstants.COMMA, CommonConstants.COMMA, CommonConstants.COMMA)):""); hyPartnerBaseInfoDAO.updateByPrimaryKeySelective(hyPartnerBaseInfo); HyPartnerLineInfoDO line = hyPartnerLineInfoDAO.getByPartnerId(hyPartnerBaseInfo.getPartnerId()); //添加日志 + String newUserPortrait = hyPartnerBaseInfo.getUserPortrait(); + List oldLabels = new ArrayList<>(), newLabels = new ArrayList<>(); + if (StringUtils.isNotEmpty(oldUserPortrait)){ + Map userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(oldUserPortrait)); + oldLabels = userPortraitMap.values().stream().collect(Collectors.toList()); + } + if (StringUtils.isNotEmpty(newUserPortrait)){ + Map userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(newUserPortrait)); + newLabels = userPortraitMap.values().stream().collect(Collectors.toList()); + } + List addLabels = new ArrayList<>(newLabels); + List removeLabels = new ArrayList<>(oldLabels); + addLabels.removeAll(oldLabels); + removeLabels.removeAll(newLabels); LineLogInfo lineLogInfo = new LineLogInfo(line.getPartnerId(), line.getId(), user.getUserId(), user.getName(), OperateTypeEnum.ADD_TAGS, WorkflowStageEnum.getWorkflowStageByCode(line.getWorkflowStage()), line.getWorkflowStatus(), ""); AddTagsDTO logDTO = AddTagsDTO.builder().operateUserId(user.getUserId()).operateUsername(user.getName()) - .mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).build(); + .mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).addLabels(addLabels).removeLabels(removeLabels).build(); lineLogInfo.setData(logDTO); hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo); return Boolean.TRUE; From 6fa6b3cf8d188845c59f426069277048a672edd1 Mon Sep 17 00:00:00 2001 From: zhangchenbiao Date: Tue, 15 Aug 2023 15:05:41 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/cool/store/enums/OperateTypeEnum.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java index b8b3ffbfa..22dee7d38 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java @@ -34,7 +34,7 @@ public enum OperateTypeEnum { USERINFO_UPDATE("userinfo_update", "修改(修改意向信息)", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_USERINFO_UPDATE, AFTER_USERINFO_UPDATE)), INTENT_INFO_SUBMIT("intent_info_submit", "提交意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, AFTER_BASE_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)), INTENT_INFO_UPDATE("intent_info_update", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_BASE_INFO_UPDATE, AFTER_BASE_INFO_UPDATE, BEFORE_INTENT_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, BEFORE_CLERK_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)), - ADD_TAGS("add_tags", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, ADD_LABELS, REMOVE_LABELS)), + ADD_TAGS("add_tags", "修改用户画像", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, ADD_LABELS, REMOVE_LABELS)), ADD_FOLLOW_LOG("add_follow_log", "新增根据日志", Arrays.asList(FOLLOW_LOG)), ADD_FOLLOW_TASK("add_follow_task", "新增跟进任务", Arrays.asList(FOLLOW_TASK_ID)) ; From a68e425524006420b9d219a005f4359defa2eb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=AB=B9=E7=BA=A2?= Date: Tue, 15 Aug 2023 16:22:18 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BD=9C=E5=BA=9F=E5=BE=85=E5=AE=8C?= =?UTF-8?q?=E6=88=90&=E5=B7=B2=E9=80=BE=E6=9C=9F=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cool/store/request/AddTagsRequest.java | 2 +- .../service/impl/HyPartnerLineInfoServiceImpl.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/AddTagsRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/AddTagsRequest.java index ae3bbfdcb..0f76c6ae6 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/AddTagsRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/AddTagsRequest.java @@ -18,5 +18,5 @@ public class AddTagsRequest { @ApiModelProperty("加盟申请基本信息ID") private Long partnerBaseInfoId; @ApiModelProperty("标签列表") - private List Tags; + private List tags; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java index bf66c6778..0032d49a1 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HyPartnerLineInfoServiceImpl.java @@ -89,6 +89,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { @Autowired private SmsService smsService; + @Resource + HyFollowTaskDAO hyFollowTaskDAO; @Override public StageCountVO selectStagePendingCount(String userId) { @@ -187,6 +189,9 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { HyPartnerBaseInfoDO hyPartnerBaseInfoDO = hyPartnerBaseInfoDAO.getByPartnerLineId(request.getLineId()); noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),DateUtil.formatDateTime(new Date()),hyPartnerBaseInfoDO.getUsername(),hyPartnerBaseInfoDO.getMobile()); + //作废待完成&已逾期的任务 + hyFollowTaskDAO.cancelUndoFollowTask(request.getLineId()); + //添加日志 LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), hyPartnerLineInfoDO.getId(), user.getUserId(), user.getName(), OperateTypeEnum.TRANSFER_INVESTMENT_MANAGER, @@ -315,6 +320,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { hyPartnerLineInfoDO.setCloseUserId(user.getUserId()); hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO); + hyFollowTaskDAO.cancelUndoFollowTask(lineId); + //公海线索不需要处理子流程线索 if (!LineStatusEnum.PUBLIC_SEAS.getCode().equals(lineStatus)){ CloseFollowRequest closeFollowRequest = new CloseFollowRequest(); @@ -433,6 +440,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode()); hyPartnerLineInfoDO.setCloseTime(new Date()); hyPartnerLineInfoDO.setCloseUserId(user.getUserId()); + //作废待完成&已逾期的任务 + hyFollowTaskDAO.cancelUndoFollowTask(closeFollowRequest.getLineId()); //各阶段单独的逻辑 workFlowService.endProcess(WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),closeFollowRequest); } @@ -449,6 +458,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService { hyPartnerLineInfoDO.setRejectRealReason(closeFollowRequest.getRejectRealReason()); hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode()); hyPartnerLineInfoDO.setCloseTime(new Date()); + //作废待完成&已逾期的任务 + hyFollowTaskDAO.cancelUndoFollowTask(closeFollowRequest.getLineId()); } hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO); From 6bdc773aa569430b0781e044d35ba628493c2adc Mon Sep 17 00:00:00 2001 From: zhangchenbiao Date: Tue, 15 Aug 2023 16:32:35 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E8=B7=9F=E8=BF=9B=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/dao/HyFollowTaskDAO.java | 12 +++++ .../store/dao/HyPartnerTaskInfoLogDAO.java | 16 +++++++ .../cool/store/mapper/HyFollowTaskMapper.java | 7 +++ .../mapper/HyPartnerTaskInfoLogMapper.java | 10 ++++ .../resources/mapper/HyFollowTaskMapper.xml | 9 ++++ .../mapper/HyPartnerTaskInfoLogMapper.xml | 13 ++++- .../com/cool/store/entity/HyFollowTaskDO.java | 3 +- .../cool/store/vo/follow/FollowTaskLogVO.java | 44 ++++++++++++++++- .../com/cool/store/vo/log/LogFieldVO.java | 48 +++++++++++++++++++ .../service/impl/FollowTaskServiceImpl.java | 21 +++++++- 10 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/log/LogFieldVO.java diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java index 3494fc08a..daefd56a2 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyFollowTaskDAO.java @@ -43,6 +43,18 @@ public class HyFollowTaskDAO { return hyFollowTaskMapper.getFollowTask(followTaskId); } + /** + * 批量获取根据任务 + * @param followTaskIds + * @return + */ + public List getFollowTaskList(List followTaskIds){ + if(Objects.isNull(followTaskIds)){ + return null; + } + return hyFollowTaskMapper.getFollowTaskList(followTaskIds); + } + /** * 新增跟进任务 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerTaskInfoLogDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerTaskInfoLogDAO.java index eeb3e3f5b..d82fad650 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerTaskInfoLogDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/HyPartnerTaskInfoLogDAO.java @@ -5,10 +5,14 @@ import com.cool.store.dto.log.LineLogInfo; import com.cool.store.entity.HyPartnerTaskInfoLogDO; import com.cool.store.enums.OperateTypeEnum; import com.cool.store.mapper.HyPartnerTaskInfoLogMapper; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -53,4 +57,16 @@ public class HyPartnerTaskInfoLogDAO { return hyPartnerTaskInfoLogMapper.updateLineId(newPartnerId,newLineId, oldLineId); } + public Page getFollowTaskLogPage(Integer pageNum, Integer pageSize, Long partnerLineId){ + if(Objects.isNull(partnerLineId)){ + return new Page<>(); + } + PageHelper.startPage(pageNum, pageSize); + List operateTypes = new ArrayList<>(); + operateTypes.add(OperateTypeEnum.ADD_FOLLOW_TASK.getCode()); + operateTypes.add(OperateTypeEnum.ADD_FOLLOW_LOG.getCode()); + operateTypes.add(OperateTypeEnum.ADD_TAGS.getCode()); + return hyPartnerTaskInfoLogMapper.getLogPageByLineId(partnerLineId, operateTypes); + } + } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java index 6988ffbf3..9fe5af082 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyFollowTaskMapper.java @@ -93,4 +93,11 @@ public interface HyFollowTaskMapper { * @return */ Integer updateUndoTaskStatusToOverdue(); + + /** + * 批量获取跟进任务 + * @param followTaskIds + * @return + */ + List getFollowTaskList(@Param("followTaskIds") List followTaskIds); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerTaskInfoLogMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerTaskInfoLogMapper.java index 565a80c73..a40bb9354 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerTaskInfoLogMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/HyPartnerTaskInfoLogMapper.java @@ -1,6 +1,7 @@ package com.cool.store.mapper; import com.cool.store.entity.HyPartnerTaskInfoLogDO; +import com.github.pagehelper.Page; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -29,4 +30,13 @@ public interface HyPartnerTaskInfoLogMapper { int updateLineId(@Param("newPartnerId") String newPartnerId, @Param("newLineId") Long newLineId, @Param("oldLineId") Long oldLineId); + + + /** + * 跟进线索id以及操作类型分页获取日志 + * @param partnerLineId + * @param operateTypes + * @return + */ + Page getLogPageByLineId(@Param("partnerLineId")Long partnerLineId, @Param("operateTypes")List operateTypes); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml index 29c8107bd..fb36d6d1b 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyFollowTaskMapper.xml @@ -199,5 +199,14 @@ + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerTaskInfoLogMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerTaskInfoLogMapper.xml index bba982a28..5103e38ac 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/HyPartnerTaskInfoLogMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/HyPartnerTaskInfoLogMapper.xml @@ -18,7 +18,7 @@ - id, partner_line_id, operate_user_id, operate_username, workflow_stage, workflow_status, + id, partner_line_id, operate_user_id, operate_username, operate_type, workflow_stage, workflow_status, message, create_time, update_time, partner_id @@ -148,5 +148,16 @@ set partner_line_id = #{newLineId} , partner_id = #{newPartnerId} where partner_line_id = #{oldLineId} + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyFollowTaskDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyFollowTaskDO.java index f8169f05b..81c50e169 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/HyFollowTaskDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/HyFollowTaskDO.java @@ -18,7 +18,8 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class HyFollowTaskDO implements Serializable { - @ApiModelProperty("") + + @ApiModelProperty("跟进任务id") private Long id; @ApiModelProperty("hy_partner_line_info.id") diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskLogVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskLogVO.java index a515d046a..16d9f4812 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskLogVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/follow/FollowTaskLogVO.java @@ -1,9 +1,24 @@ package com.cool.store.vo.follow; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.log.LogFieldDTO; +import com.cool.store.entity.HyFollowTaskDO; +import com.cool.store.entity.HyPartnerTaskInfoLogDO; +import com.cool.store.enums.OperateLogFieldValueEnum; +import com.cool.store.enums.OperateTypeEnum; +import com.cool.store.vo.log.LogFieldVO; +import com.google.common.collect.Lists; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author zhangchenbiao @@ -33,6 +48,33 @@ public class FollowTaskLogVO { private String operateType; @ApiModelProperty("操作内容") - private String operateContent; + private List operateContent; + + public static List convertVO(List list, List followTaskList){ + if(CollectionUtils.isEmpty(list)){ + return Lists.newArrayList(); + } + Map taskMap = ListUtils.emptyIfNull(followTaskList).stream().collect(Collectors.toMap(k -> k.getId(), Function.identity(), (k1, k2) -> k1)); + List resultList = new ArrayList<>(); + for (HyPartnerTaskInfoLogDO log : list) { + FollowTaskLogVO result = new FollowTaskLogVO(); + result.setFollowLogId(log.getId()); + result.setPartnerLineId(log.getPartnerLineId()); + result.setOperateTime(log.getCreateTime()); + result.setOperateUserId(log.getOperateUserId()); + result.setOperateUsername(log.getOperateUsername()); + result.setOperateType(log.getOperateType()); + List logFieldList = JSONObject.parseArray(log.getFieldCopy(), LogFieldVO.class); + if(OperateTypeEnum.ADD_FOLLOW_TASK.getCode().equals(log.getOperateType())){ + Long taskId = Long.valueOf(logFieldList.stream().filter(o -> OperateLogFieldValueEnum.FOLLOW_TASK_ID.getCode().equals(o.getCode())).map(LogFieldVO::getValue).findFirst().get().toString()); + HyFollowTaskDO hyFollowTask = taskMap.get(taskId); + logFieldList.addAll(LogFieldVO.convertLogField(hyFollowTask)); + + } + result.setOperateContent(logFieldList); + resultList.add(result); + } + return resultList; + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/log/LogFieldVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/log/LogFieldVO.java new file mode 100644 index 000000000..25c02d714 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/log/LogFieldVO.java @@ -0,0 +1,48 @@ +package com.cool.store.vo.log; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Author: young.yu + * @Date: 2023-06-28 15:32 + * @Description: + */ +@Data +public class LogFieldVO { + + @ApiModelProperty("字段名称") + private String code; + + @ApiModelProperty("字段定义") + private String name; + + @ApiModelProperty("字段值") + private Object value; + + public static List convertLogField(Object object){ + Field[] declaredFields = object.getClass().getDeclaredFields(); + List resultList = new ArrayList<>(); + for (Field declaredField : declaredFields) { + try { + declaredField.setAccessible(true); + LogFieldVO field = new LogFieldVO(); + ApiModelProperty annotation = declaredField.getAnnotation(ApiModelProperty.class); + if(Objects.nonNull(annotation)){ + field.setName(annotation.value()); + } + field.setCode(declaredField.getName()); + field.setValue(declaredField.get(object)); + resultList.add(field); + } catch (IllegalAccessException e) { + continue; + } + } + return resultList; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java index 2d740f341..422d8b9f6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/FollowTaskServiceImpl.java @@ -10,10 +10,12 @@ import com.cool.store.dao.HyPartnerLineInfoDAO; import com.cool.store.dao.HyPartnerTaskInfoLogDAO; import com.cool.store.dto.follow.FollowTaskNumDTO; import com.cool.store.dto.log.LineLogInfo; +import com.cool.store.dto.log.LogFieldDTO; import com.cool.store.dto.message.SendCardMessageDTO; import com.cool.store.dto.partner.PartnerSimpleInfoDTO; import com.cool.store.entity.HyFollowTaskDO; import com.cool.store.entity.HyPartnerLineInfoDO; +import com.cool.store.entity.HyPartnerTaskInfoLogDO; import com.cool.store.enums.*; import com.cool.store.exception.ApiException; import com.cool.store.exception.ServiceException; @@ -87,7 +89,24 @@ public class FollowTaskServiceImpl implements FollowTaskService { @Override public PageInfo getFollowLogPage(Integer pageNum, Integer pageSize, Long partnerLineId) { - return null; + Page logPage = hyPartnerTaskInfoLogDAO.getFollowTaskLogPage(pageNum, pageSize, partnerLineId); + List resultList = new ArrayList<>(); + if(CollectionUtils.isNotEmpty(logPage)){ + List taskIds = logPage.stream().filter(o->OperateTypeEnum.ADD_FOLLOW_TASK.getCode().equals(o.getOperateType())).map(o->{ + List logField = JSONObject.parseArray(o.getFieldCopy(), LogFieldDTO.class); + String value = logField.stream().filter(f -> f.getCode().equals(OperateLogFieldValueEnum.FOLLOW_TASK_ID.getCode())).findFirst().get().getValue(); + return Long.valueOf(value); + }).collect(Collectors.toList()); + List followTaskList = hyFollowTaskDAO.getFollowTaskList(taskIds); + List callIds = logPage.stream().filter(o->OperateTypeEnum.ADD_FOLLOW_TASK.getCode().equals(o.getOperateType())).map(o->{ + List logField = JSONObject.parseArray(o.getFieldCopy(), LogFieldDTO.class); + return logField.stream().filter(f -> f.getCode().equals(OperateLogFieldValueEnum.FOLLOW_TASK_ID.getCode())).findFirst().get().getValue(); + }).collect(Collectors.toList()); + resultList = FollowTaskLogVO.convertVO(logPage, followTaskList); + } + PageInfo resultPage = new PageInfo(logPage); + resultPage.setList(resultList); + return resultPage; } @Override From 1f025f0d5d0c4690222d66e2654a364b9ecf07e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=9E=E6=89=AC?= Date: Wed, 16 Aug 2023 13:05:40 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E7=94=B5=E8=AF=9D=E5=91=BC=E5=87=BA?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/enums/OperateLogFieldValueEnum.java | 3 +- .../com/cool/store/enums/OperateTypeEnum.java | 5 ++- .../com/cool/store/dto/log/CallUpLogDTO.java | 16 ++++++++++ .../store/service/impl/CallServiceImpl.java | 32 ++++++++++++++++--- 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/log/CallUpLogDTO.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java index 10a8ee4c4..307c07cc5 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateLogFieldValueEnum.java @@ -49,7 +49,8 @@ public enum OperateLogFieldValueEnum { FOLLOW_LOG("followLog", "跟进日志"), FOLLOW_TASK_ID("followTaskId", "跟进任务id"), ADD_LABELS("addLabels", "新增标签"), - REMOVE_LABELS("removeLabels", "移除标签") + REMOVE_LABELS("removeLabels", "移除标签"), + CALL_TRANS_NO("transNo", "呼叫请求编号") ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java index 22dee7d38..ccb4ee1d4 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/OperateTypeEnum.java @@ -36,7 +36,10 @@ public enum OperateTypeEnum { INTENT_INFO_UPDATE("intent_info_update", "修改意向申请书", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_BASE_INFO_UPDATE, AFTER_BASE_INFO_UPDATE, BEFORE_INTENT_INFO_UPDATE, AFTER_INTENT_INFO_UPDATE, BEFORE_CLERK_INFO_UPDATE, AFTER_CLERK_INFO_UPDATE)), ADD_TAGS("add_tags", "修改用户画像", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, ADD_LABELS, REMOVE_LABELS)), ADD_FOLLOW_LOG("add_follow_log", "新增根据日志", Arrays.asList(FOLLOW_LOG)), - ADD_FOLLOW_TASK("add_follow_task", "新增跟进任务", Arrays.asList(FOLLOW_TASK_ID)) + ADD_FOLLOW_TASK("add_follow_task", "新增跟进任务", Arrays.asList(FOLLOW_TASK_ID)), + + CALL_UP("call_up", "拨打电话", Arrays.asList(CALL_TRANS_NO)), + ; private String code; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/log/CallUpLogDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/log/CallUpLogDTO.java new file mode 100644 index 000000000..d1c798b1c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/log/CallUpLogDTO.java @@ -0,0 +1,16 @@ +package com.cool.store.dto.log; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Author: young.yu + * @Date: 2023-08-16 11:41 + * @Description: + */ +@Data +@SuperBuilder +public class CallUpLogDTO extends LogBasicDTO{ + private String transNo; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java index 388021117..31171a61f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java @@ -3,10 +3,17 @@ package com.cool.store.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.UUID; import com.alibaba.fastjson.JSON; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dto.call.CallUpDTO; +import com.cool.store.dto.log.CallUpLogDTO; +import com.cool.store.dto.log.EntrustOthersDTO; import com.cool.store.entity.CallRecordDO; +import com.cool.store.entity.EnterpriseUserDO; import com.cool.store.enums.CallStatusEnum; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.OperateTypeEnum; import com.cool.store.exception.ApiException; import com.cool.store.handler.WebSocketServer; import com.cool.store.mapper.CallRecordMapper; @@ -15,6 +22,8 @@ import com.cool.store.request.CallFinishBackReq; import com.cool.store.request.CallRecordBackReq; import com.cool.store.request.CallUpReq; import com.cool.store.service.CallService; +import com.cool.store.service.LogService; +import com.cool.store.utils.CoolDateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -36,14 +45,20 @@ public class CallServiceImpl implements CallService { @Autowired private HyOutboundMobileMapper hyOutboundMobileMapper; + + @Autowired + private EnterpriseUserDAO enterpriseUserDAO; + + @Autowired + private LogService logService; @Override public String callUp(CallUpReq request) throws ApiException { + //校验拨出手机号APP是否在线 + boolean isOnline = WebSocketServer.isOnline(request.getOutgoingMobile()); + if (!isOnline) { + throw new ApiException(ErrorCodeEnum.MOBILE_APP_NOT_ONLINE_ERROR); + } try { - //校验拨出手机号APP是否在线 - boolean isOnline = WebSocketServer.isOnline(request.getOutgoingMobile()); - if (!isOnline) { - throw new ApiException(ErrorCodeEnum.MOBILE_APP_NOT_ONLINE_ERROR); - } CallRecordDO callRecordDO = new CallRecordDO(); callRecordDO.setOutgoingMobile(request.getOutgoingMobile()); callRecordDO.setIncomingMobile(request.getIncomingMobile()); @@ -70,6 +85,13 @@ public class CallServiceImpl implements CallService { //保存通话记录 callRecordMapper.insertSelective(callRecordDO); + //记录日志 + LoginUserInfo operator = CurrentUserHolder.getUser(); + CallUpLogDTO log = CallUpLogDTO.builder().operateUserId(operator.getUserId()).operateUsername(operator.getName()) + .operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC)) + .transNo(transNo).build(); + logService.recordBizLog(operator,Long.valueOf(request.getLineId()), OperateTypeEnum.CALL_UP,log); + return transNo; } catch (Exception e) { log.error("callUp error, request:{}", JSON.toJSONString(request), e);