Merge branch 'dev/feat/partner1.3_20230828' into hxd/feat/labelAndlLine

This commit is contained in:
xiaodong.hu
2023-08-16 13:20:16 +08:00
27 changed files with 608 additions and 35 deletions

View File

@@ -29,9 +29,9 @@ public class CommonConstants {
public static final int AN_HOUR_SECONDS = 3600; 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; 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 EIGHTY = 80;
public static final int NINETY = 90; public static final int NINETY = 90;
public static final int HUNDRED = 100; public static final int HUNDRED = 100;
public static final int FIVE_HUNDRED = 100;
public static final int ONE_THOUSAND = 1000; 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 DAY_START_TIME_SUFFIX = " 00:00:00";
public static final String FOLLOW_TASK_NOTICE_KEY = "follow_task_notice:{0}:{1}";
} }

View File

@@ -47,7 +47,10 @@ public enum OperateLogFieldValueEnum {
BEFORE_CLERK_INFO_UPDATE("beforeClerkUpdate", "修改前的意向书员工信息"), BEFORE_CLERK_INFO_UPDATE("beforeClerkUpdate", "修改前的意向书员工信息"),
AFTER_CLERK_INFO_UPDATE("afterClerkUpdate", "修改后的意向书员工信息"), AFTER_CLERK_INFO_UPDATE("afterClerkUpdate", "修改后的意向书员工信息"),
FOLLOW_LOG("followLog", "跟进日志"), FOLLOW_LOG("followLog", "跟进日志"),
FOLLOW_TASK_ID("followTaskId", "跟进任务id") FOLLOW_TASK_ID("followTaskId", "跟进任务id"),
ADD_LABELS("addLabels", "新增标签"),
REMOVE_LABELS("removeLabels", "移除标签"),
CALL_TRANS_NO("transNo", "呼叫请求编号")
; ;

View File

@@ -34,9 +34,12 @@ public enum OperateTypeEnum {
USERINFO_UPDATE("userinfo_update", "修改(修改意向信息)", Arrays.asList(OPERATE_USER_ID,OPERATE_USER_NAME, MOBILE, OPERATE_TIME, BEFORE_USERINFO_UPDATE, AFTER_USERINFO_UPDATE)), 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_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)), 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_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; private String code;

View File

@@ -1,15 +1,21 @@
package com.cool.store.dao; 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.entity.HyFollowTaskDO;
import com.cool.store.enums.FollowTaskStatusEnum; import com.cool.store.enums.FollowTaskStatusEnum;
import com.cool.store.mapper.HyFollowTaskMapper; import com.cool.store.mapper.HyFollowTaskMapper;
import com.cool.store.utils.CoolDateUtils;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -37,6 +43,18 @@ public class HyFollowTaskDAO {
return hyFollowTaskMapper.getFollowTask(followTaskId); return hyFollowTaskMapper.getFollowTask(followTaskId);
} }
/**
* 批量获取根据任务
* @param followTaskIds
* @return
*/
public List<HyFollowTaskDO> getFollowTaskList(List<Long> followTaskIds){
if(Objects.isNull(followTaskIds)){
return null;
}
return hyFollowTaskMapper.getFollowTaskList(followTaskIds);
}
/** /**
* 新增跟进任务 * 新增跟进任务
@@ -140,4 +158,53 @@ public class HyFollowTaskDAO {
hyFollowTaskMapper.cancelUndoFollowTask(partnerLineId); hyFollowTaskMapper.cancelUndoFollowTask(partnerLineId);
} }
/**
* 获取消息通知的跟进人
* @param date
* @param pageNum
* @param pageSize
* @return
*/
public Page<String> 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<FollowTaskNumDTO> getUserTaskNum(List<String> followUserIds){
if(CollectionUtils.isEmpty(followUserIds)){
return Lists.newArrayList();
}
return hyFollowTaskMapper.getUserTaskNum(followUserIds);
}
/**
* 获取待完成任务
* @param startTime
* @param endTime
* @param pageNum
* @param pageSize
* @return
*/
public Page<HyFollowTaskDO> 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();
}
} }

View File

@@ -5,10 +5,14 @@ import com.cool.store.dto.log.LineLogInfo;
import com.cool.store.entity.HyPartnerTaskInfoLogDO; import com.cool.store.entity.HyPartnerTaskInfoLogDO;
import com.cool.store.enums.OperateTypeEnum; import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.mapper.HyPartnerTaskInfoLogMapper; import com.cool.store.mapper.HyPartnerTaskInfoLogMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -53,4 +57,16 @@ public class HyPartnerTaskInfoLogDAO {
return hyPartnerTaskInfoLogMapper.updateLineId(newPartnerId,newLineId, oldLineId); return hyPartnerTaskInfoLogMapper.updateLineId(newPartnerId,newLineId, oldLineId);
} }
public Page<HyPartnerTaskInfoLogDO> getFollowTaskLogPage(Integer pageNum, Integer pageSize, Long partnerLineId){
if(Objects.isNull(partnerLineId)){
return new Page<>();
}
PageHelper.startPage(pageNum, pageSize);
List<String> 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);
}
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.mapper; package com.cool.store.mapper;
import com.cool.store.dto.follow.FollowTaskNumDTO;
import com.cool.store.entity.HyFollowTaskDO; import com.cool.store.entity.HyFollowTaskDO;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@@ -63,4 +64,40 @@ public interface HyFollowTaskMapper {
* @return * @return
*/ */
Integer cancelUndoFollowTask(@Param("partnerLineId") Long partnerLineId); Integer cancelUndoFollowTask(@Param("partnerLineId") Long partnerLineId);
/**
* 获取发送通知的跟进人
* @param startTime
* @param endTime
* @return
*/
Page<String> getRemindFollowUserIds(@Param("startTime")String startTime, @Param("endTime")String endTime);
/**
* 获取用户任务数量
* @param followUserIds
* @return
*/
List<FollowTaskNumDTO> getUserTaskNum(@Param("followUserIds") List<String> followUserIds);
/**
* 获取待完成任务
* @param startTime
* @param endTime
* @return
*/
Page<HyFollowTaskDO> getUndoTaskPage(@Param("startTime") String startTime, @Param("endTime") String endTime);
/**
* 更新未完成任务的状态
* @return
*/
Integer updateUndoTaskStatusToOverdue();
/**
* 批量获取跟进任务
* @param followTaskIds
* @return
*/
List<HyFollowTaskDO> getFollowTaskList(@Param("followTaskIds") List<Long> followTaskIds);
} }

View File

@@ -1,6 +1,7 @@
package com.cool.store.mapper; package com.cool.store.mapper;
import com.cool.store.entity.HyPartnerTaskInfoLogDO; import com.cool.store.entity.HyPartnerTaskInfoLogDO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; 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); int updateLineId(@Param("newPartnerId") String newPartnerId, @Param("newLineId") Long newLineId, @Param("oldLineId") Long oldLineId);
/**
* 跟进线索id以及操作类型分页获取日志
* @param partnerLineId
* @param operateTypes
* @return
*/
Page<HyPartnerTaskInfoLogDO> getLogPageByLineId(@Param("partnerLineId")Long partnerLineId, @Param("operateTypes")List<String> operateTypes);
} }

View File

@@ -165,4 +165,48 @@
<update id="cancelUndoFollowTask"> <update id="cancelUndoFollowTask">
update hy_follow_task set task_status = '3' where partner_line_id = #{partnerLineId} and task_status in ('0', '2') update hy_follow_task set task_status = '3' where partner_line_id = #{partnerLineId} and task_status in ('0', '2')
</update> </update>
<select id="getRemindFollowUserIds" resultType="string">
select
follow_user_id
from
hy_follow_task
where
deleted = '0' and (task_status in ('2') or (task_status in ('0') and deadline >= #{startTime} and #{endTime} >= deadline))
</select>
<select id="getUserTaskNum" resultType="com.cool.store.dto.follow.FollowTaskNumDTO">
select
follow_user_id,
sum(if(task_status=2 or (task_status in ('0') and now() >= deadline, 1,0))) as overdueNum,
sum(if(task_status=0, 1, 0)) as todoNum
from
hy_follow_task
where
follow_user_id in <foreach collection="followUserIds" item="followUserId" separator="," open="(" close=")">#{followUserId}</foreach>
group by follow_user_id
</select>
<select id="getUndoTaskPage" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from
hy_follow_task
where
deleted = '0' and task_status in ('0') and deadline >= #{startTime} and #{endTime} >= deadline
</select>
<update id="updateUndoTaskStatusToOverdue">
<![CDATA[ update hy_follow_task set task_status = '2' where task_status = '0' and deadline < now() ]]]>
</update>
<select id="getFollowTaskList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from
hy_follow_task
where
deleted = '0' and id in <foreach collection="followTaskIds" item="followTaskId" separator="," open="(" close=")">#{followTaskId}</foreach>
</select>
</mapper> </mapper>

View File

@@ -18,7 +18,7 @@
<result column="field_copy" jdbcType="LONGVARCHAR" property="fieldCopy"/> <result column="field_copy" jdbcType="LONGVARCHAR" property="fieldCopy"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
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 message, create_time, update_time, partner_id
</sql> </sql>
<sql id="Blob_Column_List"> <sql id="Blob_Column_List">
@@ -149,4 +149,15 @@
where partner_line_id = #{oldLineId} where partner_line_id = #{oldLineId}
</update> </update>
<select id="getLogPageByLineId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>,
<include refid="Blob_Column_List"/>
from
hy_partner_task_info_log
where
partner_line_id= #{partnerLineId} and operate_type in <foreach collection="operateTypes" open="(" close=")" separator="," item="operateType">#{operateType}</foreach>
order by create_time desc
</select>
</mapper> </mapper>

View File

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

View File

@@ -3,6 +3,8 @@ package com.cool.store.dto.log;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @Author suzhuhong * @Author suzhuhong
* @Date 2023/7/4 10:05 * @Date 2023/7/4 10:05
@@ -19,4 +21,8 @@ public class AddTagsDTO {
private String operateUserId; private String operateUserId;
private String mobile; private String mobile;
private List<String> addLabels;
private List<String> removeLabels;
} }

View File

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

View File

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

View File

@@ -18,7 +18,8 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class HyFollowTaskDO implements Serializable { public class HyFollowTaskDO implements Serializable {
@ApiModelProperty("")
@ApiModelProperty("跟进任务id")
private Long id; private Long id;
@ApiModelProperty("hy_partner_line_info.id") @ApiModelProperty("hy_partner_line_info.id")

View File

@@ -18,5 +18,5 @@ public class AddTagsRequest {
@ApiModelProperty("加盟申请基本信息ID") @ApiModelProperty("加盟申请基本信息ID")
private Long partnerBaseInfoId; private Long partnerBaseInfoId;
@ApiModelProperty("标签列表") @ApiModelProperty("标签列表")
private List<Long> Tags; private List<Long> tags;
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.vo; package com.cool.store.vo;
import com.cool.store.dto.partner.UserPortraitDTO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@@ -49,7 +50,7 @@ public class PartnerLineInfoAndBaseInfoVO {
private String investmentManagerPhone; private String investmentManagerPhone;
@ApiModelProperty("用户画像") @ApiModelProperty("用户画像")
private List<String> userPortrait; private List<UserPortraitDTO> userPortrait;
@ApiModelProperty("线索状态") @ApiModelProperty("线索状态")
private Integer lineStatus; private Integer lineStatus;

View File

@@ -1,9 +1,24 @@
package com.cool.store.vo.follow; 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 io.swagger.annotations.ApiModelProperty;
import lombok.Data; 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.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
@@ -33,6 +48,33 @@ public class FollowTaskLogVO {
private String operateType; private String operateType;
@ApiModelProperty("操作内容") @ApiModelProperty("操作内容")
private String operateContent; private List<LogFieldVO> operateContent;
public static List<FollowTaskLogVO> convertVO(List<HyPartnerTaskInfoLogDO> list, List<HyFollowTaskDO> followTaskList){
if(CollectionUtils.isEmpty(list)){
return Lists.newArrayList();
}
Map<Long, HyFollowTaskDO> taskMap = ListUtils.emptyIfNull(followTaskList).stream().collect(Collectors.toMap(k -> k.getId(), Function.identity(), (k1, k2) -> k1));
List<FollowTaskLogVO> 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<LogFieldVO> 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;
}
} }

View File

@@ -17,6 +17,9 @@ import java.util.*;
@Data @Data
public class FollowTaskPageVO { public class FollowTaskPageVO {
@ApiModelProperty("任务id")
private Long followTaskId;
@ApiModelProperty("线索id") @ApiModelProperty("线索id")
private Long partnerLineId; private Long partnerLineId;
@@ -35,6 +38,9 @@ public class FollowTaskPageVO {
@ApiModelProperty("跟进阶段") @ApiModelProperty("跟进阶段")
private String workflowStage; private String workflowStage;
@ApiModelProperty("线索用户id")
private String partnerId;
@ApiModelProperty("线索用户名") @ApiModelProperty("线索用户名")
private String partnerUsername; private String partnerUsername;
@@ -51,12 +57,14 @@ public class FollowTaskPageVO {
continue; continue;
} }
FollowTaskPageVO result = new FollowTaskPageVO(); FollowTaskPageVO result = new FollowTaskPageVO();
result.setFollowTaskId(task.getId());
result.setPartnerLineId(task.getPartnerLineId()); result.setPartnerLineId(task.getPartnerLineId());
result.setTaskTitle(task.getTaskTitle()); result.setTaskTitle(task.getTaskTitle());
result.setCommunicationType(task.getCommunicationType()); result.setCommunicationType(task.getCommunicationType());
result.setDeadline(task.getDeadline()); result.setDeadline(task.getDeadline());
result.setTaskStatus(task.getTaskStatus()); result.setTaskStatus(task.getTaskStatus());
result.setWorkflowStage(partnerInfo.getWorkflowStage()); result.setWorkflowStage(partnerInfo.getWorkflowStage());
result.setPartnerId(partnerInfo.getPartnerId());
result.setPartnerUsername(partnerInfo.getUsername()); result.setPartnerUsername(partnerInfo.getUsername());
result.setPartnerMobile(partnerInfo.getMobile()); result.setPartnerMobile(partnerInfo.getMobile());
resultList.add(result); resultList.add(result);

View File

@@ -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<LogFieldVO> convertLogField(Object object){
Field[] declaredFields = object.getClass().getDeclaredFields();
List<LogFieldVO> 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;
}
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.job; package com.cool.store.job;
import com.cool.store.service.EnterpriseSyncService; import com.cool.store.service.EnterpriseSyncService;
import com.cool.store.service.FollowTaskService;
import com.cool.store.service.HyPartnerInterviewPlanService; import com.cool.store.service.HyPartnerInterviewPlanService;
import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
@@ -26,6 +27,9 @@ public class JobHandler {
@Autowired @Autowired
private HyPartnerInterviewPlanService hyPartnerInterviewPlanService; private HyPartnerInterviewPlanService hyPartnerInterviewPlanService;
@Resource
private FollowTaskService followTaskService;
@XxlJob("syncOrganization") @XxlJob("syncOrganization")
public void syncOrganization(){ public void syncOrganization(){
log.info("组织架构定时同步开始"); 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());
}
}
} }

View File

@@ -11,7 +11,7 @@ import com.cool.store.request.CallUpReq;
* @Description: * @Description:
*/ */
public interface CallService { public interface CallService {
void callUp(CallUpReq request) throws ApiException; String callUp(CallUpReq request) throws ApiException;
void callFinishBack(CallFinishBackReq request) throws ApiException; void callFinishBack(CallFinishBackReq request) throws ApiException;
void callRecordBack(CallRecordBackReq request) throws ApiException; void callRecordBack(CallRecordBackReq request) throws ApiException;
} }

View File

@@ -75,4 +75,16 @@ public interface FollowTaskService {
* @return * @return
*/ */
Integer cancelFollowTask(FollowTaskIdRequest request, String userId); Integer cancelFollowTask(FollowTaskIdRequest request, String userId);
/**
* 跟进任务前一小时提醒
* @return
*/
void followTaskAnHourAgoRemind();
/**
* 跟进任务每日10点提醒
* @return
*/
void followTaskRemind();
} }

View File

@@ -3,10 +3,17 @@ package com.cool.store.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID; import cn.hutool.core.lang.UUID;
import com.alibaba.fastjson.JSON; 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.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.CallRecordDO;
import com.cool.store.entity.EnterpriseUserDO;
import com.cool.store.enums.CallStatusEnum; import com.cool.store.enums.CallStatusEnum;
import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.exception.ApiException; import com.cool.store.exception.ApiException;
import com.cool.store.handler.WebSocketServer; import com.cool.store.handler.WebSocketServer;
import com.cool.store.mapper.CallRecordMapper; 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.CallRecordBackReq;
import com.cool.store.request.CallUpReq; import com.cool.store.request.CallUpReq;
import com.cool.store.service.CallService; import com.cool.store.service.CallService;
import com.cool.store.service.LogService;
import com.cool.store.utils.CoolDateUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -36,14 +45,20 @@ public class CallServiceImpl implements CallService {
@Autowired @Autowired
private HyOutboundMobileMapper hyOutboundMobileMapper; private HyOutboundMobileMapper hyOutboundMobileMapper;
@Autowired
private EnterpriseUserDAO enterpriseUserDAO;
@Autowired
private LogService logService;
@Override @Override
public void callUp(CallUpReq request) throws ApiException { 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 { try {
//校验拨出手机号APP是否在线
boolean isOnline = WebSocketServer.isOnline(request.getOutgoingMobile());
if (!isOnline) {
throw new ApiException(ErrorCodeEnum.MOBILE_APP_NOT_ONLINE_ERROR);
}
CallRecordDO callRecordDO = new CallRecordDO(); CallRecordDO callRecordDO = new CallRecordDO();
callRecordDO.setOutgoingMobile(request.getOutgoingMobile()); callRecordDO.setOutgoingMobile(request.getOutgoingMobile());
callRecordDO.setIncomingMobile(request.getIncomingMobile()); callRecordDO.setIncomingMobile(request.getIncomingMobile());
@@ -70,6 +85,14 @@ public class CallServiceImpl implements CallService {
//保存通话记录 //保存通话记录
callRecordMapper.insertSelective(callRecordDO); 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) { } catch (Exception e) {
log.error("callUp error, request:{}", JSON.toJSONString(request), e); log.error("callUp error, request:{}", JSON.toJSONString(request), e);
throw new ApiException(ErrorCodeEnum.CALL_UP_ERROR); throw new ApiException(ErrorCodeEnum.CALL_UP_ERROR);

View File

@@ -8,11 +8,14 @@ import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyFollowTaskDAO; import com.cool.store.dao.HyFollowTaskDAO;
import com.cool.store.dao.HyPartnerLineInfoDAO; import com.cool.store.dao.HyPartnerLineInfoDAO;
import com.cool.store.dao.HyPartnerTaskInfoLogDAO; 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.LineLogInfo;
import com.cool.store.dto.log.LogFieldDTO;
import com.cool.store.dto.message.SendCardMessageDTO; import com.cool.store.dto.message.SendCardMessageDTO;
import com.cool.store.dto.partner.PartnerSimpleInfoDTO; import com.cool.store.dto.partner.PartnerSimpleInfoDTO;
import com.cool.store.entity.HyFollowTaskDO; import com.cool.store.entity.HyFollowTaskDO;
import com.cool.store.entity.HyPartnerLineInfoDO; import com.cool.store.entity.HyPartnerLineInfoDO;
import com.cool.store.entity.HyPartnerTaskInfoLogDO;
import com.cool.store.enums.*; import com.cool.store.enums.*;
import com.cool.store.exception.ApiException; import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
@@ -23,6 +26,7 @@ import com.cool.store.request.follow.FollowTaskIdRequest;
import com.cool.store.request.follow.UpdateFollowTaskRequest; import com.cool.store.request.follow.UpdateFollowTaskRequest;
import com.cool.store.service.FollowTaskService; import com.cool.store.service.FollowTaskService;
import com.cool.store.utils.CoolDateUtils; 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.FollowTaskLogVO;
import com.cool.store.vo.follow.FollowTaskPageVO; import com.cool.store.vo.follow.FollowTaskPageVO;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
@@ -36,10 +40,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Arrays; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -61,6 +62,8 @@ public class FollowTaskServiceImpl implements FollowTaskService {
@Resource @Resource
private EnterpriseUserDAO enterpriseUserDAO; private EnterpriseUserDAO enterpriseUserDAO;
@Resource @Resource
private RedisUtilPool redisUtilPool;
@Resource
private ISVHttpRequest isvHttpRequest; private ISVHttpRequest isvHttpRequest;
@Value("${feishu.notice.link.url:null}") @Value("${feishu.notice.link.url:null}")
private String linkUrl; private String linkUrl;
@@ -86,7 +89,24 @@ public class FollowTaskServiceImpl implements FollowTaskService {
@Override @Override
public PageInfo<FollowTaskLogVO> getFollowLogPage(Integer pageNum, Integer pageSize, Long partnerLineId) { public PageInfo<FollowTaskLogVO> getFollowLogPage(Integer pageNum, Integer pageSize, Long partnerLineId) {
return null; Page<HyPartnerTaskInfoLogDO> logPage = hyPartnerTaskInfoLogDAO.getFollowTaskLogPage(pageNum, pageSize, partnerLineId);
List<FollowTaskLogVO> resultList = new ArrayList<>();
if(CollectionUtils.isNotEmpty(logPage)){
List<Long> taskIds = logPage.stream().filter(o->OperateTypeEnum.ADD_FOLLOW_TASK.getCode().equals(o.getOperateType())).map(o->{
List<LogFieldDTO> 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<HyFollowTaskDO> followTaskList = hyFollowTaskDAO.getFollowTaskList(taskIds);
List<String> callIds = logPage.stream().filter(o->OperateTypeEnum.ADD_FOLLOW_TASK.getCode().equals(o.getOperateType())).map(o->{
List<LogFieldDTO> 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 @Override
@@ -161,6 +181,85 @@ public class FollowTaskServiceImpl implements FollowTaskService {
return hyFollowTaskDAO.cancelFollowTask(request.getFollowTaskId()); 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<HyFollowTaskDO> undoTaskList = hyFollowTaskDAO.getUndoTaskPage(startTime, endTime, pageNum, pageSize);
if(CollectionUtils.isEmpty(undoTaskList)){
break;
}
if(undoTaskList.size() < pageSize){
hasNext = false;
}
pageNum++;
List<Long> lineIds = undoTaskList.stream().map(HyFollowTaskDO::getPartnerLineId).distinct().collect(Collectors.toList());
Map<Long, PartnerSimpleInfoDTO> 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<String> remindFollowUserIds = hyFollowTaskDAO.getRemindFollowUserIds(new Date(), pageNum, pageSize);
if(CollectionUtils.isEmpty(remindFollowUserIds)){
break;
}
if(remindFollowUserIds.size() < pageSize){
hasNext = false;
}
pageNum++;
List<FollowTaskNumDTO> 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 * @param partnerLineId
@@ -183,6 +282,12 @@ public class FollowTaskServiceImpl implements FollowTaskService {
if(Objects.isNull(partnerInfo)){ if(Objects.isNull(partnerInfo)){
return; 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 dateline = DateUtil.format(task.getDeadline(), CoolDateUtils.DATE_FORMAT_SEC_2);
String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile()); String content = MessageFormat.format(MessageConstants.FOLLOW_TASK_MESSAGE_CONTENT, dateline, partnerInfo.getUsername(), partnerInfo.getMobile());
SendCardMessageDTO sendCardMessage = new SendCardMessageDTO(); SendCardMessageDTO sendCardMessage = new SendCardMessageDTO();

View File

@@ -5,12 +5,10 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.constants.RedisConstant; import com.cool.store.constants.RedisConstant;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo; import com.cool.store.context.LoginUserInfo;
import com.cool.store.context.PartnerUserHolder; import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dao.*; import com.cool.store.dao.*;
import com.cool.store.dto.log.AddTagsDTO; 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.LineLogInfo;
import com.cool.store.dto.log.WantInfoUpdateDTO; import com.cool.store.dto.log.WantInfoUpdateDTO;
import com.cool.store.entity.*; 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.mapper.HyPartnerCertificationInfoMapper;
import com.cool.store.request.AddTagsRequest; import com.cool.store.request.AddTagsRequest;
import com.cool.store.request.PartnerBaseInfoRequest; import com.cool.store.request.PartnerBaseInfoRequest;
import com.cool.store.service.HyPartnerBaseInfoService; import com.cool.store.service.*;
import com.cool.store.service.HyPartnerLineInfoService;
import com.cool.store.service.HyPhoneLocationService;
import com.cool.store.service.LogService;
import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.RedisUtilPool;
import com.cool.store.vo.PartnerBaseInfoVO; import com.cool.store.vo.PartnerBaseInfoVO;
@@ -35,8 +30,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Collections; import java.util.*;
import java.util.Date;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -84,6 +78,8 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService {
@Autowired @Autowired
private LogService logService; private LogService logService;
@Resource
private LabelService labelService;
@Override @Override
@@ -92,18 +88,33 @@ public class HyPartnerBaseInfoServiceImpl implements HyPartnerBaseInfoService {
if (hyPartnerBaseInfo==null){ if (hyPartnerBaseInfo==null){
throw new ServiceException(ErrorCodeEnum.PARTNER_BASE_INFO_NOT_EXIST); throw new ServiceException(ErrorCodeEnum.PARTNER_BASE_INFO_NOT_EXIST);
} }
String oldUserPortrait = hyPartnerBaseInfo.getUserPortrait();
hyPartnerBaseInfo.setId(addTagsRequest.getPartnerBaseInfoId()); hyPartnerBaseInfo.setId(addTagsRequest.getPartnerBaseInfoId());
hyPartnerBaseInfo.setUserPortrait(CollectionUtils.isNotEmpty(addTagsRequest.getTags())? hyPartnerBaseInfo.setUserPortrait(CollectionUtils.isNotEmpty(addTagsRequest.getTags())?
addTagsRequest.getTags().stream().map(Object::toString).collect(Collectors.joining(CommonConstants.COMMA, CommonConstants.COMMA, CommonConstants.COMMA)):""); addTagsRequest.getTags().stream().map(Object::toString).collect(Collectors.joining(CommonConstants.COMMA, CommonConstants.COMMA, CommonConstants.COMMA)):"");
hyPartnerBaseInfoDAO.updateByPrimaryKeySelective(hyPartnerBaseInfo); hyPartnerBaseInfoDAO.updateByPrimaryKeySelective(hyPartnerBaseInfo);
HyPartnerLineInfoDO line = hyPartnerLineInfoDAO.getByPartnerId(hyPartnerBaseInfo.getPartnerId()); HyPartnerLineInfoDO line = hyPartnerLineInfoDAO.getByPartnerId(hyPartnerBaseInfo.getPartnerId());
//添加日志 //添加日志
String newUserPortrait = hyPartnerBaseInfo.getUserPortrait();
List<String> oldLabels = new ArrayList<>(), newLabels = new ArrayList<>();
if (StringUtils.isNotEmpty(oldUserPortrait)){
Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(oldUserPortrait));
oldLabels = userPortraitMap.values().stream().collect(Collectors.toList());
}
if (StringUtils.isNotEmpty(newUserPortrait)){
Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(newUserPortrait));
newLabels = userPortraitMap.values().stream().collect(Collectors.toList());
}
List<String> addLabels = new ArrayList<>(newLabels);
List<String> removeLabels = new ArrayList<>(oldLabels);
addLabels.removeAll(oldLabels);
removeLabels.removeAll(newLabels);
LineLogInfo lineLogInfo = new LineLogInfo(line.getPartnerId(), line.getId(), user.getUserId(), LineLogInfo lineLogInfo = new LineLogInfo(line.getPartnerId(), line.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.ADD_TAGS, user.getName(), OperateTypeEnum.ADD_TAGS,
WorkflowStageEnum.getWorkflowStageByCode(line.getWorkflowStage()), WorkflowStageEnum.getWorkflowStageByCode(line.getWorkflowStage()),
line.getWorkflowStatus(), ""); line.getWorkflowStatus(), "");
AddTagsDTO logDTO = AddTagsDTO.builder().operateUserId(user.getUserId()).operateUsername(user.getName()) 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); lineLogInfo.setData(logDTO);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo); hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
return Boolean.TRUE; return Boolean.TRUE;

View File

@@ -89,6 +89,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
@Autowired @Autowired
private SmsService smsService; private SmsService smsService;
@Resource
HyFollowTaskDAO hyFollowTaskDAO;
@Override @Override
public StageCountVO selectStagePendingCount(String userId) { public StageCountVO selectStagePendingCount(String userId) {
@@ -113,9 +115,11 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
String userPortrait = partnerLineInfoAndBaseInfoDTO.getUserPortrait(); String userPortrait = partnerLineInfoAndBaseInfoDTO.getUserPortrait();
if (StringUtils.isNotEmpty(userPortrait)){ if (StringUtils.isNotEmpty(userPortrait)){
Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(userPortrait)); Map<Long, String> userPortraitMap = labelService.getUserPortraitMap(Arrays.asList(userPortrait));
List<String> userPortraitList = userPortraitMap.values().stream()
List<UserPortraitDTO> userPortraitDTOS = userPortraitMap.entrySet().stream()
.map(entry -> new UserPortraitDTO(entry.getKey(), entry.getValue()))
.collect(Collectors.toList()); .collect(Collectors.toList());
partnerLineInfoAndBaseInfoVO.setUserPortrait(userPortraitList); partnerLineInfoAndBaseInfoVO.setUserPortrait(userPortraitDTOS);
} }
List<String> userIds = new ArrayList<>(); List<String> userIds = new ArrayList<>();
@@ -185,6 +189,9 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
HyPartnerBaseInfoDO hyPartnerBaseInfoDO = hyPartnerBaseInfoDAO.getByPartnerLineId(request.getLineId()); HyPartnerBaseInfoDO hyPartnerBaseInfoDO = hyPartnerBaseInfoDAO.getByPartnerLineId(request.getLineId());
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),DateUtil.formatDateTime(new Date()),hyPartnerBaseInfoDO.getUsername(),hyPartnerBaseInfoDO.getMobile()); 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(), LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), hyPartnerLineInfoDO.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.TRANSFER_INVESTMENT_MANAGER, user.getName(), OperateTypeEnum.TRANSFER_INVESTMENT_MANAGER,
@@ -313,6 +320,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
hyPartnerLineInfoDO.setCloseUserId(user.getUserId()); hyPartnerLineInfoDO.setCloseUserId(user.getUserId());
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO); hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
hyFollowTaskDAO.cancelUndoFollowTask(lineId);
//公海线索不需要处理子流程线索 //公海线索不需要处理子流程线索
if (!LineStatusEnum.PUBLIC_SEAS.getCode().equals(lineStatus)){ if (!LineStatusEnum.PUBLIC_SEAS.getCode().equals(lineStatus)){
CloseFollowRequest closeFollowRequest = new CloseFollowRequest(); CloseFollowRequest closeFollowRequest = new CloseFollowRequest();
@@ -431,6 +440,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode()); hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode());
hyPartnerLineInfoDO.setCloseTime(new Date()); hyPartnerLineInfoDO.setCloseTime(new Date());
hyPartnerLineInfoDO.setCloseUserId(user.getUserId()); hyPartnerLineInfoDO.setCloseUserId(user.getUserId());
//作废待完成&已逾期的任务
hyFollowTaskDAO.cancelUndoFollowTask(closeFollowRequest.getLineId());
//各阶段单独的逻辑 //各阶段单独的逻辑
workFlowService.endProcess(WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),closeFollowRequest); workFlowService.endProcess(WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),closeFollowRequest);
} }
@@ -447,6 +458,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
hyPartnerLineInfoDO.setRejectRealReason(closeFollowRequest.getRejectRealReason()); hyPartnerLineInfoDO.setRejectRealReason(closeFollowRequest.getRejectRealReason());
hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode()); hyPartnerLineInfoDO.setLineStatus(LineStatusEnum.PUBLIC_SEAS.getCode());
hyPartnerLineInfoDO.setCloseTime(new Date()); hyPartnerLineInfoDO.setCloseTime(new Date());
//作废待完成&已逾期的任务
hyFollowTaskDAO.cancelUndoFollowTask(closeFollowRequest.getLineId());
} }
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO); hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);

View File

@@ -33,8 +33,8 @@ public class CallController {
@PostMapping("/callUp") @PostMapping("/callUp")
@ApiOperation("呼出电话") @ApiOperation("呼出电话")
public ResponseResult callUp(@RequestBody CallUpReq request) throws ApiException { public ResponseResult callUp(@RequestBody CallUpReq request) throws ApiException {
callService.callUp(request); String res = callService.callUp(request);
return ResponseResult.success(); return ResponseResult.success(res);
} }
@PostMapping("/finish/callback") @PostMapping("/finish/callback")