提交ec同步历史线索功能

This commit is contained in:
xiaodong.hu
2023-10-26 18:59:38 +08:00
parent ad46e015ea
commit 107bfe9d35
21 changed files with 865 additions and 50 deletions

View File

@@ -70,6 +70,9 @@ public enum ErrorCodeEnum {
MOBILE_EXIST(500015, "此手机号码已存在,请修改后重试", null), MOBILE_EXIST(500015, "此手机号码已存在,请修改后重试", null),
INVESTMENT_MANAGER_NOT_EXIST(500016, "当前招商经理不存在", null), INVESTMENT_MANAGER_NOT_EXIST(500016, "当前招商经理不存在", null),
PARTNER_MOBILE_EXIST_0(500017, "手机号码已存在", null), PARTNER_MOBILE_EXIST_0(500017, "手机号码已存在", null),
PARTNER_MOBILE_INCORRECT(500018, "请输入正确的手机号", null),
PUBLIC_LINE_NOT_FOLLOW(500019, "该线索已存在公海,无跟进人", null),
LINE_EXIST_FOLLOW(500020, "该线索已存在,跟进人为{0}", null),
INTERVIEW_ENTER_FAIL(1021101, "进入面试间失败", null), INTERVIEW_ENTER_FAIL(1021101, "进入面试间失败", null),
DINGDING_USER_NOT_EXIST(1021102, "用户钉钉信息不存在,无法发起资质审核!", null), DINGDING_USER_NOT_EXIST(1021102, "用户钉钉信息不存在,无法发起资质审核!", null),

View File

@@ -0,0 +1,130 @@
package com.cool.store.enums;
/**
* @author hxd
*/
public enum TrajectoryTypeEnum {
/**
* 联系轨迹类型*
*/
SEND_NOTE(1001, "发送短信",""),
DIAL_MOBILE(1002, "拨打对方电话",""),
WEBSITE_CUSTOMER_MOBILE(1003, "网站客服会话",""),
EC_SESSION(1004, "EC会话",""),
QQ_SESSION(1005, "QQ会话",""),
SEND_EMAIL(1006, "发送邮件",""),
ANSWER_MOBILE(1007, "接听对方电话",""),
ANSWER_EMAIL(1008, "接收邮件",""),
CALL_MEETING(1009, "电话会议",""),
DIAL_CLOUD_MOBILE(1010, "拨打云总机电话",""),
ANSWER_CLOUD_MOBILE(1011, "接听云总机电话",""),
/**
* 提醒类
*/
REGULARLY_REMIND(2001, "定时提醒",""),
REMINDER_SALES_PROGRAM(2002, "提醒销售计划",""),
CALENDAR_REMINDER(2003, "日历提醒",""),
/**
* 文本类型
*/
ADD_CUSTOMER(3001, "新增客户",""),
ADD_CUSTOMER_DATA(3002, "新增客户资料",""),
UPDATE_CUSTOMER_DATA(3003, "更新客户资料",""),
UPDATE_CUSTOMER_LABEL(3004, "更新客户标签",""),
RELEVANCE_EC(3005, "关联EC",""),
CANCEL_RELEVANCE_EC(3006, "取消EC关联",""),
RELEVANCE_QQ(3007, "关联QQ",""),
CANCEL_RELEVANCE_QQ(3008, "取消QQ关联",""),
TRANSFER_CUSTOMER(3009, "转让客户","将此客户转换了给"),
MERGE_CUSTOMER(3010, "合并客户",""),
ALLOCATION_CUSTOMER(3011, "分配客户","分配此客户给"),
GET_CUSTOMER(3012, "领取客户",""),
ABANDON_CUSTOMER(3013, "放弃客户",""),
ADD_MARKER_PLAN(3014, "添加销售计划",""),
UPDATE_MARKER_PLAN(3015, "修改销售计划",""),
USE_MARKER_TEMPLATE(3016, "使用销售模板",""),
UPDATE_CUSTOMER_STAGE(3017, "更新客户阶段",""),
RELEVANCE_COMPANY(3018, "关联公司",""),
CANCEL_RELEVANCE_COMPANY(3019, "取消公司关联",""),
UPLOAD_PHOTO_AVATAR(3020, "上传头像",""),
ADD_SHARE_COLLEAGUE(3021, "新增共享同事",""),
CANCEL_SHARE_COLLEAGUE(3022, "取消共享同事",""),
CANCEL_RELEVANCE(3023, "退出共享关系",""),
TRANSFER_COMPANY_IMPORT(3024, "转为公司导入",""),
ADD_CONTACT_DATA(3036, "新增联系人资料",""),
UPDATE_CONTACT_DATA(3037, "更新联系人资料",""),
ADD_CONTACT(3038, "新增联系人",""),
DELETE_CONTACT(3039, "删除联系人",""),
DELETE_ORDERS(3040, "删除订单",""),
DELETE_CUSTOMER(3041, "删除客户",""),
TRANSFER_CUSTOMER_TYPE(3042, "转换客户类型",""),
/**
* 跟进记录类
*/
ADD_FOLLOW_RECORD(4000, "添加跟进记录",""),
/**
* 微信类
*/
WECHAT_ACTIVITY(6000, "微信活动",""),
/**
* 拜访客户类
*/
VISITING_CLIENTS(7000, "拜访客户类","");
private final Integer value;
private final String showText;
private final String jointText;
TrajectoryTypeEnum(Integer value, String showText,String jointText) {
this.value = value;
this.showText = showText;
this.jointText = jointText;
}
public Integer getValue() {
return value;
}
public String getShowText() {
return showText;
}
public String getJointText() {
return jointText;
}
public static String getShowText(Integer value) {
for (TrajectoryTypeEnum trajectoryTypeEnum : TrajectoryTypeEnum.values()) {
if (trajectoryTypeEnum.getValue().equals(value)) {
return trajectoryTypeEnum.getShowText();
}
}
return "";
}
public static String getJointText(Integer value) {
for (TrajectoryTypeEnum trajectoryTypeEnum : TrajectoryTypeEnum.values()) {
if (trajectoryTypeEnum.getValue().equals(value)) {
return trajectoryTypeEnum.getJointText();
}
}
return "";
}
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.dao; package com.cool.store.dao;
import com.cool.store.dto.partner.MobileCheckDTO;
import com.cool.store.entity.HyPartnerUserInfoDO; import com.cool.store.entity.HyPartnerUserInfoDO;
import com.cool.store.mapper.HyPartnerUserInfoMapper; import com.cool.store.mapper.HyPartnerUserInfoMapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -83,4 +84,14 @@ public class HyPartnerUserInfoDAO {
} }
public String selectLastCrmCreateTime() {
return hyPartnerUserInfoMapper.selectLastCrmCreateTime();
}
public MobileCheckDTO selectByCheckMobile(String mobile) {
if (StringUtils.isEmpty(mobile)){
return null;
}
return hyPartnerUserInfoMapper.selectByCheckMobile(mobile);
}
} }

View File

@@ -0,0 +1,31 @@
package com.cool.store.mapper;
import com.cool.store.entity.HyPartnerEcTrackLogDO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author hxd
*/
@Mapper
public interface HyPartnerEcTrackLogMapper {
int deleteByPrimaryKey(Long id);
int insert(HyPartnerEcTrackLogDO record);
int insertSelective(HyPartnerEcTrackLogDO record);
HyPartnerEcTrackLogDO selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(HyPartnerEcTrackLogDO record);
int updateByPrimaryKey(HyPartnerEcTrackLogDO record);
int batchInsertOrUpdate(@Param("recordList") HyPartnerEcTrackLogDO resultTrajectoryList);
Page<HyPartnerEcTrackLogDO> getEcLogPageByPartnerId(@Param("partnerId") String partnerId);
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.mapper; package com.cool.store.mapper;
import com.cool.store.dto.partner.MobileCheckDTO;
import com.cool.store.entity.HyPartnerUserInfoDO; import com.cool.store.entity.HyPartnerUserInfoDO;
import com.cool.store.entity.SyncEcCustomerDO; import com.cool.store.entity.SyncEcCustomerDO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@@ -49,4 +50,8 @@ public interface HyPartnerUserInfoMapper {
int selectByHourDateCount(@Param("selectTime") String hourDayDate, @Param("now") String now); int selectByHourDateCount(@Param("selectTime") String hourDayDate, @Param("now") String now);
int updateByPartnerId(@Param("record") HyPartnerUserInfoDO record); int updateByPartnerId(@Param("record") HyPartnerUserInfoDO record);
String selectLastCrmCreateTime();
MobileCheckDTO selectByCheckMobile(@Param("mobile") String mobile);
} }

View File

@@ -0,0 +1,345 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cool.store.mapper.HyPartnerEcTrackLogMapper">
<resultMap id="BaseResultMap" type="com.cool.store.entity.HyPartnerEcTrackLogDO">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="trajectory_id" jdbcType="VARCHAR" property="trajectoryId" />
<result column="user_id" jdbcType="VARCHAR" property="userId" />
<result column="user_name" jdbcType="VARCHAR" property="userName" />
<result column="crm_id" jdbcType="VARCHAR" property="crmId" />
<result column="partner_id" jdbcType="VARCHAR" property="partnerId" />
<result column="mobile" jdbcType="VARCHAR" property="mobile" />
<result column="receive_user_ids" jdbcType="VARCHAR" property="receiveUserIds" />
<result column="receive_user" jdbcType="VARCHAR" property="receiveUser" />
<result column="trajectory_type" jdbcType="INTEGER" property="trajectoryType" />
<result column="trajectory_type_content" jdbcType="VARCHAR" property="trajectoryTypeContent" />
<result column="content" jdbcType="VARCHAR" property="content" />
<result column="operate_time" jdbcType="TIMESTAMP" property="operateTime" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
</resultMap>
<sql id="Base_Column_List">
id, trajectory_id, user_id, user_name, crm_id,mobile, receive_user_ids, receive_user, trajectory_type,partner_id,
trajectory_type_content, content, operate_time, create_time, update_time, remark
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from hy_partner_ec_track_log
where id = #{id,jdbcType=BIGINT}
</select>
<select id="getEcLogPageByPartnerId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from hy_partner_ec_track_log
where partner_id = #{partnerId} order by operate_time desc
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete from hy_partner_ec_track_log
where id = #{id,jdbcType=BIGINT}
</delete>
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.cool.store.entity.HyPartnerEcTrackLogDO" useGeneratedKeys="true">
insert into hy_partner_ec_track_log (trajectory_id, user_id, user_name, mobile,
crm_id,partner_id, receive_user_ids, receive_user,
trajectory_type, trajectory_type_content,
content, operate_time, create_time,
update_time, remark)
values (#{trajectoryId,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, #{mobile,jdbcType=VARCHAR},
#{crmId,jdbcType=VARCHAR},#{partnerId,jdbcType=VARCHAR}, #{receiveUserIds,jdbcType=VARCHAR}, #{receiveUser,jdbcType=VARCHAR},
#{trajectoryType,jdbcType=INTEGER}, #{trajectoryTypeContent,jdbcType=VARCHAR},
#{content,jdbcType=VARCHAR}, #{operateTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP}, #{remark,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.cool.store.entity.HyPartnerEcTrackLogDO" useGeneratedKeys="true">
insert into hy_partner_ec_track_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="trajectoryId != null">
trajectory_id,
</if>
<if test="userId != null">
user_id,
</if>
<if test="userName != null">
user_name,
</if>
<if test="mobile != null">
mobile,
</if>
<if test="crmId != null">
crm_id,
</if>
<if test="partnerId != null">
partner_id,
</if>
<if test="receiveUserIds != null">
receive_user_ids,
</if>
<if test="receiveUser != null">
receive_user,
</if>
<if test="trajectoryType != null">
trajectory_type,
</if>
<if test="trajectoryTypeContent != null">
trajectory_type_content,
</if>
<if test="content != null">
content,
</if>
<if test="operateTime != null">
operate_time,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
<if test="remark != null">
remark,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="trajectoryId != null">
#{trajectoryId,jdbcType=VARCHAR},
</if>
<if test="userId != null">
#{userId,jdbcType=VARCHAR},
</if>
<if test="userName != null">
#{userName,jdbcType=VARCHAR},
</if>
<if test="mobile != null">
#{mobile,jdbcType=VARCHAR},
</if>
<if test="crmId != null">
#{crmId,jdbcType=VARCHAR},
</if>
<if test="partnerId != null">
#{partnerId,jdbcType=VARCHAR},
</if>
<if test="receiveUserIds != null">
#{receiveUserIds,jdbcType=VARCHAR},
</if>
<if test="receiveUser != null">
#{receiveUser,jdbcType=VARCHAR},
</if>
<if test="trajectoryType != null">
#{trajectoryType,jdbcType=INTEGER},
</if>
<if test="trajectoryTypeContent != null">
#{trajectoryTypeContent,jdbcType=VARCHAR},
</if>
<if test="content != null">
#{content,jdbcType=VARCHAR},
</if>
<if test="operateTime != null">
#{operateTime,jdbcType=TIMESTAMP},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="remark != null">
#{remark,jdbcType=VARCHAR},
</if>
</trim>
ON DUPLICATE KEY UPDATE trajectory_id=values(trajectory_id)
,user_id=values(user_id)
,user_name=values(user_name)
,crm_id=values(crm_id)
,partner_id=values(partner_id)
,mobile=values(mobile)
,receive_user_ids=values(receive_user_ids)
,receive_user=values(receive_user)
,trajectory_type=values(trajectory_type)
,trajectory_type_content=values(trajectory_type_content)
,content=values(content)
,operate_time=values(operate_time)
,create_time=values(create_time)
,remark=values(remark)
</insert>
<insert id="batchInsertOrUpdate">
<foreach collection="recordList" item="record" separator=";">
insert into hy_partner_ec_track_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="trajectoryId != null">
trajectory_id,
</if>
<if test="userId != null">
user_id,
</if>
<if test="userName != null">
user_name,
</if>
<if test="mobile != null">
mobile,
</if>
<if test="crmId != null">
crm_id,
</if>
<if test="partnerId != null">
partner_id,
</if>
<if test="receiveUserIds != null">
receive_user_ids,
</if>
<if test="receiveUser != null">
receive_user,
</if>
<if test="trajectoryType != null">
trajectory_type,
</if>
<if test="trajectoryTypeContent != null">
trajectory_type_content,
</if>
<if test="content != null">
content,
</if>
<if test="operateTime != null">
operate_time,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
<if test="remark != null">
remark,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="record.trajectoryId != null">
#{record.trajectoryId,jdbcType=VARCHAR},
</if>
<if test="record.userId != null">
#{record.userId,jdbcType=VARCHAR},
</if>
<if test="record.userName != null">
#{record.userName,jdbcType=VARCHAR},
</if>
<if test="record.mobile != null">
#{record.mobile,jdbcType=VARCHAR},
</if>
<if test="record.crmId != null">
#{record.crmId,jdbcType=VARCHAR},
</if>
<if test="record.partnerId != null">
#{record.partnerId,jdbcType=VARCHAR},
</if>
<if test="record.receiveUserIds != null">
#{record.receiveUserIds,jdbcType=VARCHAR},
</if>
<if test="record.receiveUser != null">
#{record.receiveUser,jdbcType=VARCHAR},
</if>
<if test="record.trajectoryType != null">
#{record.trajectoryType,jdbcType=INTEGER},
</if>
<if test="record.trajectoryTypeContent != null">
#{record.trajectoryTypeContent,jdbcType=VARCHAR},
</if>
<if test="record.content != null">
#{record.content,jdbcType=VARCHAR},
</if>
<if test="record.operateTime != null">
#{record.operateTime,jdbcType=TIMESTAMP},
</if>
<if test="record.createTime != null">
#{record.createTime,jdbcType=TIMESTAMP},
</if>
<if test="record.remark != null">
#{record.remark,jdbcType=VARCHAR},
</if>
</trim>
ON DUPLICATE KEY UPDATE trajectory_id=values(trajectory_id)
,user_id=values(user_id)
,user_name=values(user_name)
,crm_id=values(crm_id)
,partner_id=values(partner_id)
,mobile=values(mobile)
,receive_user_ids=values(receive_user_ids)
,receive_user=values(receive_user)
,trajectory_type=values(trajectory_type)
,trajectory_type_content=values(trajectory_type_content)
,content=values(content)
,operate_time=values(operate_time)
,create_time=values(create_time)
,remark=values(remark)
</foreach>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.cool.store.entity.HyPartnerEcTrackLogDO">
update hy_partner_ec_track_log
<set>
<if test="trajectoryId != null">
trajectory_id = #{trajectoryId,jdbcType=VARCHAR},
</if>
<if test="userId != null">
user_id = #{userId,jdbcType=VARCHAR},
</if>
<if test="mobile != null">
mobile = #{mobile,jdbcType=VARCHAR},
</if>
<if test="userName != null">
user_name = #{userName,jdbcType=VARCHAR},
</if>
<if test="crmId != null">
crm_id = #{crmId,jdbcType=VARCHAR},
</if>
<if test="partnerId != null">
partner_id = #{partnerId,jdbcType=VARCHAR},
</if>
<if test="receiveUserIds != null">
receive_user_ids = #{receiveUserIds,jdbcType=VARCHAR},
</if>
<if test="receiveUser != null">
receive_user = #{receiveUser,jdbcType=VARCHAR},
</if>
<if test="trajectoryType != null">
trajectory_type = #{trajectoryType,jdbcType=INTEGER},
</if>
<if test="trajectoryTypeContent != null">
trajectory_type_content = #{trajectoryTypeContent,jdbcType=VARCHAR},
</if>
<if test="content != null">
content = #{content,jdbcType=VARCHAR},
</if>
<if test="operateTime != null">
operate_time = #{operateTime,jdbcType=TIMESTAMP},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="remark != null">
remark = #{remark,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<update id="updateByPrimaryKey" parameterType="com.cool.store.entity.HyPartnerEcTrackLogDO">
update hy_partner_ec_track_log
set trajectory_id = #{trajectoryId,jdbcType=VARCHAR},
user_id = #{userId,jdbcType=VARCHAR},
user_name = #{userName,jdbcType=VARCHAR},
crm_id = #{crmId,jdbcType=VARCHAR},
partner_id = #{partnerId,jdbcType=VARCHAR},
mobile = #{mobile,jdbcType=VARCHAR},
receive_user_ids = #{receiveUserIds,jdbcType=VARCHAR},
receive_user = #{receiveUser,jdbcType=VARCHAR},
trajectory_type = #{trajectoryType,jdbcType=INTEGER},
trajectory_type_content = #{trajectoryTypeContent,jdbcType=VARCHAR},
content = #{content,jdbcType=VARCHAR},
operate_time = #{operateTime,jdbcType=TIMESTAMP},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP},
remark = #{remark,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT}
</update>
</mapper>

View File

@@ -111,6 +111,12 @@
WHERE (b.update_time BETWEEN #{selectTime} and #{now} or WHERE (b.update_time BETWEEN #{selectTime} and #{now} or
a.update_time BETWEEN #{selectTime} and #{now} ) and b.partner_id is not null a.update_time BETWEEN #{selectTime} and #{now} ) and b.partner_id is not null
</select> </select>
<select id="selectLastCrmCreateTime" resultType="java.lang.String">
SELECT crm_create_time as crmCreateTime FROM hy_partner_user_info ORDER BY crm_create_time desc limit 1
</select>
<select id="selectByCheckMobile" resultType="com.cool.store.dto.partner.MobileCheckDTO">
select a.partner_id as partnerId,a.mobile,line_status as lineStatus ,c.`name`as investmentManager FROM hy_partner_user_info a left join hy_partner_line_info b on a.partner_id=b.partner_id and b.deleted=0 left join enterprise_user c on b.investment_manager=c.user_id and c.deleted=0 WHERE a.mobile=#{mobile}
</select>
<insert id="insertSelective" keyColumn="id" keyProperty="record.id" useGeneratedKeys="true"> <insert id="insertSelective" keyColumn="id" keyProperty="record.id" useGeneratedKeys="true">
insert into hy_partner_user_info insert into hy_partner_user_info

View File

@@ -0,0 +1,19 @@
package com.cool.store.dto.partner;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author hxd
*/
@Data
@Accessors(chain = true)
public class MobileCheckDTO {
private String partnerId;
private String mobile;
private Integer lineStatus;
private String investmentManager;
}

View File

@@ -0,0 +1,133 @@
package com.cool.store.entity;
import java.io.Serializable;
import java.util.Date;
import com.cool.store.enums.TrajectoryTypeEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.StringUtils;
/**
* hy_partner_ec_track_log
* @author
*/
@Data
@Accessors(chain = true)
public class HyPartnerEcTrackLogDO implements Serializable {
private Long id;
/**
* 跟进ID
*/
private String trajectoryId;
/**
* 操作人id
*/
private String userId;
/**
* 操作人姓名
*/
private String userName;
/**
* 客户id
*/
private String crmId;
private String partnerId;
/**
* 客户手机号
*/
private String mobile;
/**
* 接收人id
*/
private String receiveUserIds;
/**
* 接收人姓名
*/
private String receiveUser;
/**
* 跟进类型
*/
private Integer trajectoryType;
/**
* 跟进类型名称
*/
private String trajectoryTypeContent;
/**
* 轨迹内容
*/
private String content;
/**
* 轨迹内容(拼接)
*/
private String detailContent;
/**
* 操作时间
*/
@JsonFormat(pattern = "yyyy.MM.dd HH:mm:ss", timezone = "GMT+8")
private Date operateTime;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy.MM.dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy.MM.dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 备注
*/
private String remark;
/**
* 获取拼接好的内容
* @param ecLogVo
* @return
*/
public static String getDetailContentJoint(HyPartnerEcTrackLogDO ecLogVo){
if (StringUtils.isNotEmpty(ecLogVo.getContent())) {
return ecLogVo.getContent();
}
StringBuilder detailContent = new StringBuilder();
Integer trajectoryType = ecLogVo.getTrajectoryType();
if (trajectoryType.equals(TrajectoryTypeEnum.TRANSFER_CUSTOMER.getValue())) {
detailContent.append(TrajectoryTypeEnum.TRANSFER_CUSTOMER.getJointText()).append(ecLogVo.getReceiveUser());
}
if (trajectoryType.equals(TrajectoryTypeEnum.ALLOCATION_CUSTOMER.getValue())) {
detailContent.append(TrajectoryTypeEnum.ALLOCATION_CUSTOMER.getJointText()).append(ecLogVo.getReceiveUser());
}
if (trajectoryType.equals(TrajectoryTypeEnum.GET_CUSTOMER.getValue())) {
detailContent.append(ecLogVo.getReceiveUser()).append(TrajectoryTypeEnum.GET_CUSTOMER.getJointText());
}
if (StringUtils.isEmpty(detailContent)) {
detailContent.append(TrajectoryTypeEnum.getShowText(trajectoryType));
}
return detailContent.toString();
}
private static final long serialVersionUID = 1L;
}

View File

@@ -80,4 +80,7 @@ public class HyPartnerUserInfoDO implements Serializable {
@ApiModelProperty("ec意向区域") @ApiModelProperty("ec意向区域")
private String ecWantShopArea; private String ecWantShopArea;
@ApiModelProperty("ec创建时间")
private Date crmCreateTime;
} }

View File

@@ -2,6 +2,8 @@ package com.cool.store.request;
import lombok.Data; import lombok.Data;
import java.util.Date;
/** /**
* @author hxd * @author hxd
* @since 2023/2/28 * @since 2023/2/28
@@ -25,5 +27,12 @@ public class CustomerInfoRequest {
private String followUserName; private String followUserName;
private String labelIds;
private String ecWantShopArea; private String ecWantShopArea;
private String crmCreateTime;
private Date updateTime;
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.service; package com.cool.store.service;
import com.cool.store.entity.HyPartnerEcTrackLogDO;
import com.cool.store.request.CustomerInfoRequest; import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest; import com.cool.store.request.GetTagRequest;
@@ -12,4 +13,10 @@ public interface EcSyncService {
Boolean labelInfo(List<GetTagRequest> getTagRequestList); Boolean labelInfo(List<GetTagRequest> getTagRequestList);
String getLastCrmCreateTime();
Boolean historyLine(List<CustomerInfoRequest> resultCustomerInfoList);
Integer historyLineTrajectory(List<HyPartnerEcTrackLogDO> resultTrajectoryList);
} }

View File

@@ -1,6 +1,7 @@
package com.cool.store.service; package com.cool.store.service;
import com.cool.store.context.LoginUserInfo; import com.cool.store.context.LoginUserInfo;
import com.cool.store.entity.HyPartnerEcTrackLogDO;
import com.cool.store.request.follow.AddFollowLogRequest; import com.cool.store.request.follow.AddFollowLogRequest;
import com.cool.store.request.follow.AddFollowTaskRequest; import com.cool.store.request.follow.AddFollowTaskRequest;
import com.cool.store.request.follow.FollowTaskIdRequest; import com.cool.store.request.follow.FollowTaskIdRequest;
@@ -88,4 +89,6 @@ public interface FollowTaskService {
* @return * @return
*/ */
void followTaskDailyRemind(); void followTaskDailyRemind();
PageInfo<HyPartnerEcTrackLogDO> getEcFollowLogPage(Integer pageNum, Integer pageSize, String partnerId);
} }

View File

@@ -9,4 +9,6 @@ public interface LineHighSeasService {
Boolean addLine(AddLineRequest request); Boolean addLine(AddLineRequest request);
ResponseResult importLine(MultipartFile file); ResponseResult importLine(MultipartFile file);
Boolean addCheckout(String mobile);
} }

View File

@@ -1,6 +1,8 @@
package com.cool.store.service.impl; package com.cool.store.service.impl;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@@ -16,8 +18,7 @@ import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum; import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException; import com.cool.store.exception.ApiException;
import com.cool.store.http.UserSourceResponse; import com.cool.store.http.UserSourceResponse;
import com.cool.store.mapper.HyPartnerLabelGroupMapper; import com.cool.store.mapper.HyPartnerEcTrackLogMapper;
import com.cool.store.mapper.HyPartnerLabelMapper;
import com.cool.store.mapper.HyPartnerUserChannelMapper; import com.cool.store.mapper.HyPartnerUserChannelMapper;
import com.cool.store.request.CustomerInfoRequest; import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest; import com.cool.store.request.GetTagRequest;
@@ -31,9 +32,11 @@ import com.cool.store.sdk.ec.response.UpdateCustomerResponse;
import com.cool.store.service.EcSyncService; import com.cool.store.service.EcSyncService;
import com.cool.store.service.LabelGroupService; import com.cool.store.service.LabelGroupService;
import com.cool.store.service.LabelService; import com.cool.store.service.LabelService;
import com.cool.store.utils.MybatisBatchUtils;
import com.cool.store.utils.Post; import com.cool.store.utils.Post;
import com.cool.store.utils.StringUtil; import com.cool.store.utils.StringUtil;
import com.cool.store.utils.UUIDUtils; import com.cool.store.utils.UUIDUtils;
import lombok.SneakyThrows;
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.Value; import org.springframework.beans.factory.annotation.Value;
@@ -56,7 +59,6 @@ public class EcSyncServiceImpl implements EcSyncService {
@Value("${ec.baseUrl:null}") @Value("${ec.baseUrl:null}")
private String baseUrl; private String baseUrl;
@Resource @Resource
private HyPartnerLineInfoDAO hyPartnerLineInfoDAO; private HyPartnerLineInfoDAO hyPartnerLineInfoDAO;
@@ -70,6 +72,9 @@ public class EcSyncServiceImpl implements EcSyncService {
private EnterpriseUserDAO enterpriseUserDAO; private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private MybatisBatchUtils mybatisBatchUtils;
@Resource @Resource
private HyPartnerUserChannelMapper hyPartnerUserChannelMapper; private HyPartnerUserChannelMapper hyPartnerUserChannelMapper;
@@ -79,15 +84,14 @@ public class EcSyncServiceImpl implements EcSyncService {
@Resource @Resource
private LabelService labelService; private LabelService labelService;
@Override @Override
public boolean ecToApplet(List<CustomerInfoRequest> queryListData) { public boolean ecToApplet(List<CustomerInfoRequest> queryListData) {
for (CustomerInfoRequest customerInfoItem : queryListData) { for (CustomerInfoRequest customerInfoItem : queryListData) {
try { try {
insertSelectiveSync(customerInfoItem); insertSelectiveSync(customerInfoItem);
} catch (Exception e) { } catch (Exception e) {
log.error("ec同步至招商小程序报错"+JSONObject.toJSONString(e)); log.error("ec同步至招商小程序报错" + JSONObject.toJSONString(e));
sendFeiShuRobotMessage("推送:"+JSONObject.toJSONString(e),"27243d49-97ca-4981-8aec-7c3bf84eb660"); sendFeiShuRobotMessage("推送:" + JSONObject.toJSONString(e), "27243d49-97ca-4981-8aec-7c3bf84eb660");
} }
} }
return false; return false;
@@ -135,6 +139,33 @@ public class EcSyncServiceImpl implements EcSyncService {
return Boolean.TRUE; return Boolean.TRUE;
} }
@Override
public String getLastCrmCreateTime() {
return hyPartnerUserInfoDAO.selectLastCrmCreateTime();
}
@SneakyThrows
@Override
public Boolean historyLine(List<CustomerInfoRequest> resultCustomerInfoList) {
for (CustomerInfoRequest customerInfoRequest : resultCustomerInfoList) {
customerInfoRequest.setUpdateTime(DateUtil.parse(customerInfoRequest.getCrmCreateTime(), DatePattern.NORM_DATETIME_PATTERN));
insertSelectiveSync(customerInfoRequest);
}
return Boolean.TRUE;
}
@Override
public Integer historyLineTrajectory(List<HyPartnerEcTrackLogDO> resultTrajectoryList) {
for (HyPartnerEcTrackLogDO hyPartnerEcTrackLogDO : resultTrajectoryList) {
HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByMobile(hyPartnerEcTrackLogDO.getMobile());
if (ObjectUtil.isNotNull(hyPartnerUserInfoDO)) {
hyPartnerEcTrackLogDO.setPartnerId(hyPartnerUserInfoDO.getPartnerId());
}
}
return mybatisBatchUtils.batchInsertOrUpdate(resultTrajectoryList, HyPartnerEcTrackLogMapper.class, (record, mapper) -> mapper.insertSelective(record)) ;
}
/** /**
* 同步ec数据到表中 同时将部分数据同步到ec * 同步ec数据到表中 同时将部分数据同步到ec
* *
@@ -157,8 +188,17 @@ public class EcSyncServiceImpl implements EcSyncService {
channelId = channelDO.getChannelId(); channelId = channelDO.getChannelId();
} }
String newPartnerId = UUIDUtils.get32UUID(); String newPartnerId = UUIDUtils.get32UUID();
HyPartnerBaseInfoDO resultBase = new HyPartnerBaseInfoDO();
HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO(); HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO();
resultUser.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile()).setUserChannelId(Convert.toInt(channelId)).setEcWantShopArea(customerInfoItem.getEcWantShopArea()); resultUser.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile()).setUserChannelId(Convert.toInt(channelId)).setEcWantShopArea(customerInfoItem.getEcWantShopArea());
Date time = new Date();
if (ObjectUtil.isNotNull(customerInfoItem.getUpdateTime())) {
time = customerInfoItem.getUpdateTime();
resultUser.setCrmCreateTime(time);
if (StringUtil.isNotEmpty(customerInfoItem.getLabelIds())) {
resultBase.setUserPortrait(","+customerInfoItem.getLabelIds()+",");
}
}
HyPartnerLineInfoDO resultLine = new HyPartnerLineInfoDO(); HyPartnerLineInfoDO resultLine = new HyPartnerLineInfoDO();
String followUserName = customerInfoItem.getFollowUserName(); String followUserName = customerInfoItem.getFollowUserName();
String followUserMobile = customerInfoItem.getFollowUserMobile(); String followUserMobile = customerInfoItem.getFollowUserMobile();
@@ -175,7 +215,7 @@ public class EcSyncServiceImpl implements EcSyncService {
resultLine.setWorkflowStage(WorkflowStageEnum.INTENT.getCode()) resultLine.setWorkflowStage(WorkflowStageEnum.INTENT.getCode())
.setLineStatus(StringUtil.isEmpty(customerInfoItem.getFollowUserName()) ? LineStatusEnum.PUBLIC_SEAS.getCode() : LineStatusEnum.PRIVATE_SEAS.getCode()); .setLineStatus(StringUtil.isEmpty(customerInfoItem.getFollowUserName()) ? LineStatusEnum.PUBLIC_SEAS.getCode() : LineStatusEnum.PRIVATE_SEAS.getCode());
HyPartnerBaseInfoDO resultBase = new HyPartnerBaseInfoDO();
resultBase.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile()); resultBase.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile());
HyPartnerUserInfoDO newUserInfo = hyPartnerUserInfoDAO.selectByMobile(resultUser.getMobile()); HyPartnerUserInfoDO newUserInfo = hyPartnerUserInfoDAO.selectByMobile(resultUser.getMobile());
@@ -183,7 +223,7 @@ public class EcSyncServiceImpl implements EcSyncService {
//有就更新ec没有就插入 //有就更新ec没有就插入
if (newUserInfo != null) { if (newUserInfo != null) {
//招商客户姓名为空 //招商客户姓名为空
if (ObjectUtil.isNull(newUserInfo.getUsername())||StringUtil.isEmpty(newUserInfo.getUsername())) { if (ObjectUtil.isNull(newUserInfo.getUsername()) || StringUtil.isEmpty(newUserInfo.getUsername())) {
newUserInfo.setUsername(resultUser.getUsername()); newUserInfo.setUsername(resultUser.getUsername());
hyPartnerUserInfoDAO.updateByPrimaryKeySelective(newUserInfo); hyPartnerUserInfoDAO.updateByPrimaryKeySelective(newUserInfo);
} }
@@ -201,7 +241,7 @@ public class EcSyncServiceImpl implements EcSyncService {
if (partnerLine != null) { if (partnerLine != null) {
// EC与沪姨合伙人同时存在的线索用户但存在不同的跟进人将沪姨合伙人跟进人信息同步至EC覆盖原EC跟进人信息 // EC与沪姨合伙人同时存在的线索用户但存在不同的跟进人将沪姨合伙人跟进人信息同步至EC覆盖原EC跟进人信息
if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) { if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) {
if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())&&!getFollowLineStatus(partnerLine)) { if (StringUtil.isNotEmpty(resultLine.getInvestmentManager()) && !getFollowLineStatus(partnerLine)) {
resultLine.setId(partnerLine.getId()).setUpdateTime(new Date()); resultLine.setId(partnerLine.getId()).setUpdateTime(new Date());
//沪姨合伙人线索存在黑名单EC该线索分配跟进人同步到沪姨合伙人但线索状态不变还存在黑名单中 //沪姨合伙人线索存在黑名单EC该线索分配跟进人同步到沪姨合伙人但线索状态不变还存在黑名单中
resultLine.setLineStatus(partnerLine.getLineStatus().intValue() == LineStatusEnum.BLACKLIST.getCode().intValue() resultLine.setLineStatus(partnerLine.getLineStatus().intValue() == LineStatusEnum.BLACKLIST.getCode().intValue()
@@ -237,48 +277,49 @@ public class EcSyncServiceImpl implements EcSyncService {
HyPartnerBaseInfoDO partnerIdAndLine = hyPartnerBaseInfoDAO.getByPartnerIdAndLineId(partnerLine.getPartnerId(), partnerLine.getId()); HyPartnerBaseInfoDO partnerIdAndLine = hyPartnerBaseInfoDAO.getByPartnerIdAndLineId(partnerLine.getPartnerId(), partnerLine.getId());
if (partnerIdAndLine == null) { if (partnerIdAndLine == null) {
resultBase.setPartnerId(newPartnerId).setPartnerLineId(partnerLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). resultBase.setPartnerId(newPartnerId).setPartnerLineId(partnerLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date()); setCreateTime(time).setUpdateTime(time);
hyPartnerBaseInfoDAO.insertSelective(resultBase); hyPartnerBaseInfoDAO.insertSelective(resultBase);
} }
} else { } else {
resultLine.setPartnerId(newPartnerId).setCreateTime(new Date()); resultLine.setPartnerId(newPartnerId).setCreateTime(time).setUpdateTime(time);
hyPartnerLineInfoDAO.insertSelective(resultLine); hyPartnerLineInfoDAO.insertSelective(resultLine);
resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date()); setCreateTime(time).setUpdateTime(time);
hyPartnerBaseInfoDAO.insertSelective(resultBase); hyPartnerBaseInfoDAO.insertSelective(resultBase);
} }
newUserInfo.setEcWantShopArea(resultUser.getEcWantShopArea()); newUserInfo.setEcWantShopArea(resultUser.getEcWantShopArea());
//添加ec意向区域同步 //添加ec意向区域同步
hyPartnerUserInfoDAO.updateByPrimaryKeySelective(newUserInfo); hyPartnerUserInfoDAO.updateByPrimaryKeySelective(newUserInfo);
} else { } else {
resultUser.setPartnerId(newPartnerId).setCreateTime(new Date()); resultUser.setPartnerId(newPartnerId).setCreateTime(time).setUpdateTime(time);
hyPartnerUserInfoDAO.insertSelective(resultUser); hyPartnerUserInfoDAO.insertSelective(resultUser);
resultLine.setPartnerId(newPartnerId).setCreateTime(new Date()); resultLine.setPartnerId(newPartnerId).setCreateTime(time).setUpdateTime(time);
hyPartnerLineInfoDAO.insertSelective(resultLine); hyPartnerLineInfoDAO.insertSelective(resultLine);
resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())). resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date()); setCreateTime(time).setUpdateTime(time);
hyPartnerBaseInfoDAO.insertSelective(resultBase); hyPartnerBaseInfoDAO.insertSelective(resultBase);
} }
} }
/** /**
*招商公海内跟进次数大于等于1的用户EC同步该用户进去公海,假若跟进次数为0的同步到EC跟进人就是唐佑玉 * 招商公海内跟进次数大于等于1的用户EC同步该用户进去公海,假若跟进次数为0的同步到EC跟进人就是唐佑玉
* @param partnerLine *
* @param partnerLine
* @return true为公海 false:私海 * @return true为公海 false:私海
*/ */
public Boolean getFollowLineStatus(HyPartnerLineInfoDO partnerLine){ public Boolean getFollowLineStatus(HyPartnerLineInfoDO partnerLine) {
if(partnerLine.getLineStatus()!=0){ if (partnerLine.getLineStatus() != 0) {
return Boolean.FALSE; return Boolean.FALSE;
} }
ArrayList<String> list = new ArrayList<>(); ArrayList<String> list = new ArrayList<>();
list.add(partnerLine.getPartnerId()); list.add(partnerLine.getPartnerId());
List<LineCountDTO> followCountList = hyPartnerLineInfoDAO.getFollowCountList(list); List<LineCountDTO> followCountList = hyPartnerLineInfoDAO.getFollowCountList(list);
if (!CollectionUtils.isEmpty(followCountList)) { if (!CollectionUtils.isEmpty(followCountList)) {
return followCountList.get(0).getFollowCount()>0; return followCountList.get(0).getFollowCount() > 0;
} }
return Boolean.FALSE; return Boolean.FALSE;
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.service.impl; package com.cool.store.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil; 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;
@@ -10,18 +11,12 @@ 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.follow.FollowTaskNumDTO;
import com.cool.store.dto.log.LineLogInfo;
import com.cool.store.dto.log.LogFieldDTO; 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.dto.partner.PartnerSimpleInfoDTO;
import com.cool.store.entity.CallRecordDO; import com.cool.store.entity.*;
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.enums.*;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest; import com.cool.store.mapper.HyPartnerEcTrackLogMapper;
import com.cool.store.request.follow.AddFollowLogRequest; import com.cool.store.request.follow.AddFollowLogRequest;
import com.cool.store.request.follow.AddFollowTaskRequest; import com.cool.store.request.follow.AddFollowTaskRequest;
import com.cool.store.request.follow.FollowTaskIdRequest; import com.cool.store.request.follow.FollowTaskIdRequest;
@@ -34,6 +29,7 @@ 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;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@@ -73,6 +69,10 @@ public class FollowTaskServiceImpl implements FollowTaskService {
private RedisUtilPool redisUtilPool; private RedisUtilPool redisUtilPool;
@Resource @Resource
private NoticeService noticeService; private NoticeService noticeService;
@Resource
private HyPartnerEcTrackLogMapper hyPartnerEcTrackLogMapper;
@Value("${feishu.notice.link.url}") @Value("${feishu.notice.link.url}")
private String linkUrl; private String linkUrl;
@@ -252,6 +252,19 @@ public class FollowTaskServiceImpl implements FollowTaskService {
} }
} }
@Override
public PageInfo<HyPartnerEcTrackLogDO> getEcFollowLogPage(Integer pageNum, Integer pageSize, String partnerId) {
if(Objects.isNull(partnerId)){
return new PageInfo<>();
}
PageHelper.startPage(pageNum, pageSize);
Page<HyPartnerEcTrackLogDO> logPage = hyPartnerEcTrackLogMapper.getEcLogPageByPartnerId(partnerId);
for (HyPartnerEcTrackLogDO hyPartnerEcTrackLogDO : logPage) {
hyPartnerEcTrackLogDO.setDetailContent(HyPartnerEcTrackLogDO.getDetailContentJoint(hyPartnerEcTrackLogDO));
}
return new PageInfo(logPage);
}
/** /**
* 线索校验 * 线索校验
* @param partnerLineId * @param partnerLineId

View File

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.cool.store.constants.ExcelErrorConstants; import com.cool.store.constants.ExcelErrorConstants;
import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.CurrentUserHolder;
import com.cool.store.dao.*; import com.cool.store.dao.*;
import com.cool.store.dto.partner.MobileCheckDTO;
import com.cool.store.entity.*; import com.cool.store.entity.*;
import com.cool.store.enums.*; import com.cool.store.enums.*;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
@@ -30,6 +31,7 @@ import javax.annotation.Resource;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -79,7 +81,7 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
if (ObjectUtil.isNotNull(hyPartnerUserInfoDO)) { if (ObjectUtil.isNotNull(hyPartnerUserInfoDO)) {
throw new ServiceException(ErrorCodeEnum.PARTNER_MOBILE_EXIST); throw new ServiceException(ErrorCodeEnum.PARTNER_MOBILE_EXIST);
} }
return add(request,"add"); return add(request, "add");
} }
@@ -88,8 +90,8 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
* *
* @param request * @param request
*/ */
public boolean add(AddLineRequest request,String type) { public boolean add(AddLineRequest request, String type) {
Boolean flag =false; Boolean flag = false;
String partnerId = UUIDUtils.get32UUID(); String partnerId = UUIDUtils.get32UUID();
HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO(); HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO();
resultUser.setUsername(request.getPartnerName()).setMobile(request.getMobile()).setPartnerId(partnerId).setCreateTime(new Date()).setAcceptAdjustType(request.getAcceptAdjustType()) resultUser.setUsername(request.getPartnerName()).setMobile(request.getMobile()).setPartnerId(partnerId).setCreateTime(new Date()).setAcceptAdjustType(request.getAcceptAdjustType())
@@ -104,10 +106,10 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
//判断招商经理是否为空 //判断招商经理是否为空
if (StringUtil.isNotEmpty(request.getInvestmentManager())) { if (StringUtil.isNotEmpty(request.getInvestmentManager())) {
resultLine.setInvestmentManager(request.getInvestmentManager()).setLineStatus(LineStatusEnum.PRIVATE_SEAS.getCode()); resultLine.setInvestmentManager(request.getInvestmentManager()).setLineStatus(LineStatusEnum.PRIVATE_SEAS.getCode());
flag=true; flag = true;
} else { } else {
//是否分配跟进人 //是否分配跟进人
flag = hyPartnerLineInfoService.assignFollowUser(partnerId, request.getWantShopArea(), request.getAcceptAdjustType(), Boolean.TRUE); flag = hyPartnerLineInfoService.assignFollowUser(partnerId, request.getWantShopArea(), request.getAcceptAdjustType(), Boolean.TRUE);
if (flag) { if (flag) {
//查询跟进人 //查询跟进人
String investmentManager = hyPartnerLineInfoService.getAssignFollowUser(partnerId, "intent"); String investmentManager = hyPartnerLineInfoService.getAssignFollowUser(partnerId, "intent");
@@ -136,18 +138,18 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
Map<Integer, Map<Integer, List<String>>> styleCells = new HashMap<>(4); Map<Integer, Map<Integer, List<String>>> styleCells = new HashMap<>(4);
if (lineDOList.size() > excelMaxSize) { if (lineDOList.size() > excelMaxSize) {
//超出五百条的excel都标红 //超出五百条的excel都标红
for (int i = excelMaxSize; i < lineDOList.size() ; i++) { for (int i = excelMaxSize; i < lineDOList.size(); i++) {
lineDOList.get(i).setErrorInfo(ExcelErrorConstants.COUNT_MORE); lineDOList.get(i).setErrorInfo(ExcelErrorConstants.COUNT_MORE);
styleCells.put(i,new HashMap<>(4)); styleCells.put(i, new HashMap<>(4));
} }
ExcelUtil.setRowStyle(styleCells,ExcelUtil.FONT_RED,7); ExcelUtil.setRowStyle(styleCells, ExcelUtil.FONT_RED, 7);
util.exportExcel(outputStream, lineDOList, "", styleCells); util.exportExcel(outputStream, lineDOList, "", styleCells);
InputStream stream = new ByteArrayInputStream(outputStream.toByteArray()); InputStream stream = new ByteArrayInputStream(outputStream.toByteArray());
String fileStr = ossServer.uploadFileServer(stream, dir + getExcelName()); String fileStr = ossServer.uploadFileServer(stream, dir + getExcelName());
return new ResponseResult(500, "共上传" + lineDOList.size() + "条线索,其中" + styleCells.size() + "条存在异常", new ErrorExcelResponse(lineDOList.size(), styleCells.size(), fileStr)); return new ResponseResult(500, "共上传" + lineDOList.size() + "条线索,其中" + styleCells.size() + "条存在异常", new ErrorExcelResponse(lineDOList.size(), styleCells.size(), fileStr));
} }
//获取重复手机号集合 //获取重复手机号集合
List<String> uniqueList = lineDOList.stream().filter(item->StringUtil.isNotEmpty(item.getMobile())).collect(Collectors.groupingBy(HyPartnerLineDO::getMobile, Collectors.counting())) List<String> uniqueList = lineDOList.stream().filter(item -> StringUtil.isNotEmpty(item.getMobile())).collect(Collectors.groupingBy(HyPartnerLineDO::getMobile, Collectors.counting()))
.entrySet().stream().filter(e -> e.getValue() > 1) .entrySet().stream().filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey).collect(Collectors.toList()); .map(Map.Entry::getKey).collect(Collectors.toList());
for (int i = 0; i < lineDOList.size(); i++) { for (int i = 0; i < lineDOList.size(); i++) {
@@ -156,8 +158,8 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
if (StringUtil.isEmpty(partnerName)) { if (StringUtil.isEmpty(partnerName)) {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.NAME_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.NAME_LOSE)); hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.NAME_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.NAME_LOSE));
ExcelUtil.setStyleMap(styleCells, i, 0, new String[]{ExcelUtil.FONT_RED}); ExcelUtil.setStyleMap(styleCells, i, 0, new String[]{ExcelUtil.FONT_RED});
}else { } else {
if (partnerName.length()>10) { if (partnerName.length() > 10) {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.NAME_OVER_LENGTH : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.NAME_OVER_LENGTH)); hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.NAME_OVER_LENGTH : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.NAME_OVER_LENGTH));
ExcelUtil.setStyleMap(styleCells, i, 0, new String[]{ExcelUtil.FONT_RED}); ExcelUtil.setStyleMap(styleCells, i, 0, new String[]{ExcelUtil.FONT_RED});
} }
@@ -219,7 +221,7 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
if (StringUtil.isEmpty(acceptAdjustType)) { if (StringUtil.isEmpty(acceptAdjustType)) {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE)); hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE));
ExcelUtil.setStyleMap(styleCells, i, 4, new String[]{ExcelUtil.FONT_RED}); ExcelUtil.setStyleMap(styleCells, i, 4, new String[]{ExcelUtil.FONT_RED});
}else { } else {
Integer enumByName = AcceptAdjustTypeEnum.findEnumByName(acceptAdjustType); Integer enumByName = AcceptAdjustTypeEnum.findEnumByName(acceptAdjustType);
if (ObjectUtil.isNull(enumByName)) { if (ObjectUtil.isNull(enumByName)) {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE)); hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.ACCEPT_ADJUST_TYPE_LOSE));
@@ -251,16 +253,32 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
AddLineRequest addLineRequest = new AddLineRequest(); AddLineRequest addLineRequest = new AddLineRequest();
BeanUtil.copyProperties(hyPartnerLineDO, addLineRequest); BeanUtil.copyProperties(hyPartnerLineDO, addLineRequest);
addLineRequest.setWantShopArea(hyPartnerLineDO.getWantShopArea().toString()); addLineRequest.setWantShopArea(hyPartnerLineDO.getWantShopArea().toString());
add(addLineRequest,"import"); add(addLineRequest, "import");
} }
return new ResponseResult(ResponseCodeEnum.SUCCESS.getCode(), "共上传" + lineDOList.size() + "条线索", new ErrorExcelResponse(lineDOList.size(), styleCells.size(), fileStr)); return new ResponseResult(ResponseCodeEnum.SUCCESS.getCode(), "共上传" + lineDOList.size() + "条线索", new ErrorExcelResponse(lineDOList.size(), styleCells.size(), fileStr));
} }
@Override
public Boolean addCheckout(String mobile) {
if (!isPhone(mobile)) {
throw new ServiceException(ErrorCodeEnum.PARTNER_MOBILE_INCORRECT);
}
MobileCheckDTO mobileCheckDTO = hyPartnerUserInfoDAO.selectByCheckMobile(mobile);
if (ObjectUtil.isNotNull(mobileCheckDTO)) {
if (mobileCheckDTO.getLineStatus().equals(LineStatusEnum.PUBLIC_SEAS.getCode())) {
throw new ServiceException(ErrorCodeEnum.PUBLIC_LINE_NOT_FOLLOW);
} else {
throw new ServiceException(MessageFormat.format(ErrorCodeEnum.LINE_EXIST_FOLLOW.getMessage(),mobileCheckDTO.getInvestmentManager()));
}
}
return Boolean.TRUE;
}
/** /**
* @param phone 字符串类型的手机号 * @param phone 字符串类型的手机号
* 传入手机号,判断后返回 * 传入手机号,判断后返回
* true为手机号,false相反 * true为手机号,false相反
* */ */
public static boolean isPhone(String phone) { public static boolean isPhone(String phone) {
String regex = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$"; String regex = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";
if (phone.length() != 11) { if (phone.length() != 11) {
@@ -277,7 +295,7 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
* *
* @return * @return
*/ */
private String getExcelName() { private String getExcelName() {
String format = DateUtil.format(new Date(), "yyyyMMdd").concat(Constants.D_LINE).concat(IdUtil.simpleUUID().substring(0, 10)); String format = DateUtil.format(new Date(), "yyyyMMdd").concat(Constants.D_LINE).concat(IdUtil.simpleUUID().substring(0, 10));
return format.concat(Constants.POMINT).concat(Constants.EXCEL_XLSX); return format.concat(Constants.POMINT).concat(Constants.EXCEL_XLSX);
} }

View File

@@ -52,6 +52,9 @@ public class TokenValidateFilter implements Filter {
"/partner/pc/flow/qualificationReview/callback", "/partner/pc/flow/qualificationReview/callback",
"/**/ecSync/ecToApplet/**", "/**/ecSync/ecToApplet/**",
"/**/ecSync/labelInfo/**", "/**/ecSync/labelInfo/**",
"/**/ecSync/getCrmCreateTime/**",
"/**/ecSync/historyLine/**",
"/**/ecSync/historyLineTrajectory/**",
"/partner/pc/websocket/**", "/partner/pc/websocket/**",
"/partner/pc/call/**"); "/partner/pc/call/**");

View File

@@ -1,11 +1,11 @@
package com.cool.store.controller; package com.cool.store.controller;
import com.cool.store.entity.HyPartnerEcTrackLogDO;
import com.cool.store.request.CustomerInfoRequest; import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest; import com.cool.store.request.GetTagRequest;
import com.cool.store.response.ResponseResult; import com.cool.store.response.ResponseResult;
import com.cool.store.service.EcSyncService; import com.cool.store.service.EcSyncService;
import com.cool.store.vo.InterviewScheduleInfoVO;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -24,15 +24,35 @@ public class EcSyncController {
private EcSyncService ecSyncService; private EcSyncService ecSyncService;
@PostMapping(path = "/ecToApplet") @PostMapping(path = "/ecToApplet")
@ApiOperation("ec同步数据到小程序") @ApiOperation("ec同步数据到招商系统")
public ResponseResult<Boolean> ecToApplet(@RequestBody List<CustomerInfoRequest> queryListData){ public ResponseResult<Boolean> ecToApplet(@RequestBody List<CustomerInfoRequest> queryListData){
return ResponseResult.success(ecSyncService.ecToApplet(queryListData)); return ResponseResult.success(ecSyncService.ecToApplet(queryListData));
} }
@PostMapping(path = "/labelInfo") @PostMapping(path = "/labelInfo")
@ApiOperation("ec同步标签数据到小程序") @ApiOperation("ec同步标签数据到招商系统")
public ResponseResult<Boolean> labelInfo(@RequestBody List<GetTagRequest> getTagRequestList){ public ResponseResult<Boolean> labelInfo(@RequestBody List<GetTagRequest> getTagRequestList){
return ResponseResult.success(ecSyncService.labelInfo(getTagRequestList)); return ResponseResult.success(ecSyncService.labelInfo(getTagRequestList));
} }
@GetMapping(path = "/getCrmCreateTime")
@ApiOperation("ec同步标签数据到招商系统")
public ResponseResult<String> getCrmCreateTime(){
return ResponseResult.success(ecSyncService.getLastCrmCreateTime());
}
@PostMapping(path = "/historyLine")
@ApiOperation("ec同步线索到招商系统")
public ResponseResult<Boolean> historyLine(@RequestBody List<CustomerInfoRequest> resultCustomerInfoList){
return ResponseResult.success(ecSyncService.historyLine(resultCustomerInfoList));
}
@PostMapping(path = "/historyLineTrajectory")
@ApiOperation("ec同步跟进记录到招商系统")
public ResponseResult<Integer> historyLineTrajectory(@RequestBody List<HyPartnerEcTrackLogDO> resultTrajectoryList){
return ResponseResult.success(ecSyncService.historyLineTrajectory(resultTrajectoryList));
}
} }

View File

@@ -1,6 +1,7 @@
package com.cool.store.controller; package com.cool.store.controller;
import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.CurrentUserHolder;
import com.cool.store.entity.HyPartnerEcTrackLogDO;
import com.cool.store.request.follow.AddFollowLogRequest; import com.cool.store.request.follow.AddFollowLogRequest;
import com.cool.store.request.follow.AddFollowTaskRequest; import com.cool.store.request.follow.AddFollowTaskRequest;
import com.cool.store.request.follow.FollowTaskIdRequest; import com.cool.store.request.follow.FollowTaskIdRequest;
@@ -17,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
@@ -46,6 +46,12 @@ public class FollowTaskController {
return ResponseResult.success(followTaskService.getFollowLogPage(pageNum, pageSize, partnerLineId)); return ResponseResult.success(followTaskService.getFollowLogPage(pageNum, pageSize, partnerLineId));
} }
@ApiOperation("获取线索ec跟进日志")
@GetMapping("/follow/ecLog/page")
public ResponseResult<PageInfo<HyPartnerEcTrackLogDO>> getEcFollowLogPage(@RequestParam("pageNum")Integer pageNum, @RequestParam("pageSize")Integer pageSize, @RequestParam("partnerId")String partnerId){
return ResponseResult.success(followTaskService.getEcFollowLogPage(pageNum, pageSize, partnerId));
}
@ApiOperation("添加跟进日志") @ApiOperation("添加跟进日志")
@PostMapping("/follow/log/add") @PostMapping("/follow/log/add")
public ResponseResult<Integer> addFollowLog(@RequestBody @Validated AddFollowLogRequest request){ public ResponseResult<Integer> addFollowLog(@RequestBody @Validated AddFollowLogRequest request){

View File

@@ -6,11 +6,11 @@ import com.cool.store.request.AddLineRequest;
import com.cool.store.response.ResponseResult; import com.cool.store.response.ResponseResult;
import com.cool.store.service.LineHighSeasService; import com.cool.store.service.LineHighSeasService;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
/** /**
@@ -39,4 +39,11 @@ public class LineHighSeasController {
public ResponseResult importLine(@RequestParam(value = "file") MultipartFile file) throws Exception { public ResponseResult importLine(@RequestParam(value = "file") MultipartFile file) throws Exception {
return lineHighSeasService.importLine(file); return lineHighSeasService.importLine(file);
} }
@GetMapping("/addCheckout")
@ApiOperation("线索手机号校验")
public ResponseResult addCheckout(@Param("partnerMobile")String partnerMobile) throws ApiException {
return ResponseResult.success(lineHighSeasService.addCheckout(partnerMobile));
}
} }