Merge remote-tracking branch 'hs/dev/feat/partner1.4_20231009' into dev/feat/partner1.4_20231009

# Conflicts:
#	coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
This commit is contained in:
zhangchenbiao
2023-09-13 20:19:56 +08:00
63 changed files with 893 additions and 164 deletions

View File

@@ -29,4 +29,6 @@ public class ExcelErrorConstants {
public static final String COUNT_MORE = "每次数据最多导入500条请分批上传";
public static final String MOBILE_REPEAT = "手机号重复";
}

View File

@@ -67,7 +67,9 @@ public enum ErrorCodeEnum {
NO_TRANSFER_REQUIRED(500013, "招商经理现有私海线索无需转让,请检查后重试!", null),
NO_BATCH_TRANSFER_REQUIRED(500014, "已选线索包含此招商经理现有私海线索,无需转让,请检查后重试!", null),
PARTNER_MOBILE_EXIST(500010, "手机号码已存在,请核实!", null),
PARTNER_MOBILE_EXIST_0(500016, "手机号码已存在", null),
MOBILE_EXIST(500015, "手机号码已存在,请修改后重试", null),
INVESTMENT_MANAGER_NOT_EXIST(500016, "当前招商经理不存在", null),
PARTNER_MOBILE_EXIST_0(500017, "手机号码已存在", null),
INTERVIEW_ENTER_FAIL(1021101, "进入面试间失败", null),
DINGDING_USER_NOT_EXIST(1021102, "用户钉钉信息不存在,无法发起资质审核!", null),
@@ -84,11 +86,16 @@ public enum ErrorCodeEnum {
INTERVIEW_LINE_ID_IS_NULL(1021113, "线索id为空", null),
INTERVIEW_INTERVIEW_TIME_IS_UNUSABLE(1021114, "当前预约时间不可用,请和线索用户协商其他时间后确定预约时间\n面试人{0} 手机号:{1}", null),
INTERVIEW_PARTNER_NOT_EXIST(1021115, "线索下的加盟商不存在!", null),
INTERVIEW_STATUS_NOT_TRANSFER(1021116, "当前面试状态不允许转让! 面试状态:{0}", null),
MOBILE_WECHAT_EXIST(1021116, "此号码已绑定其他微信,请更换手机号码或微信后重试。", null),
ROOM_STATUS_ERROR(10211156, "当前面试房间状态不允许进行该操作!", null),
MOBILE_APP_NOT_ONLINE_ERROR(10211157, "呼叫失败,请确认呼出号码正确并检查是否安装并打开呼叫插件", null),
CALL_RECORD_NOT_EXIST_ERROR(10211158, "通话记录不存在!", null),
CALL_UP_ERROR(10211159, "拨出电话异常!", null),
CREATE_CALL_REQUEST_ERROR(10211160, "创建电话请求失败!", null),
CREATE_APPOINTMENT_TIME_ERROR(10211161, "当前时间不可预约面试,请选择其他时间", null),
CONTENT_DUPLICATED(10211200, "动态标题重复!", null),
SIGN_FAIL(600000, "验签失败", null),
GET_ACCESSTOKEN_ERROR(600001, "获取小程序TOKEN错误", null),

View File

@@ -15,7 +15,7 @@ public enum FeiShuNoticeMsgEnum {
BATCH_TRANS_INVESTMENT_MANAGER("收到新线索", "有{0}条新线索于 {1} 转让给您,请及时跟进", "img_v2_33296002-829e-490e-bd11-0d9ae763a67g"),
INTENTION_APPLY("加盟意向申请", "您有一个【加盟意向申请】待审核,申请人 {0} 手机号 {1} 于 {2} 提交加盟意向申请,请及时处理", "img_v2_c909097d-67d1-4c11-a911-a2584b67ca6g"),
FOLLOW_TASK("线索跟进任务", "{0}", "img_v2_1960b7ef-8c4e-4c3d-8b67-3d918a85578g"),
INTERVIEW_APPOINTMENT("面试预约申请", "{0}","img_v2_107bb06b-2a7a-43e1-a6ae-e5d2f2dae17g"),
INTERVIEW_APPOINTMENT("面试预约申请", "您有一个【面试预约申请】待处理,预约人 {0} 手机号 {1} ,预约面试时间 {2} ","img_v2_107bb06b-2a7a-43e1-a6ae-e5d2f2dae17g"),
;
private String title;

View File

@@ -119,6 +119,11 @@ public class HyOpenAreaInfoDAO {
return hyOpenAreaInfoMapper.getAllOpenArea();
}
public List<HyOpenAreaInfoDO> selectAllCity(){
return hyOpenAreaInfoMapper.selectAllCity();
}
/**
* 过滤叶子节点
* @param openAreaIds

View File

@@ -94,6 +94,13 @@ public class HyPartnerInterviewPlanDAO {
return hyPartnerInterviewPlanMapper.selectInterviewIdByLineId(lineId);
}
public HyPartnerInterviewPlanDO getInterviewPlanByLineId(Long lineId){
if (lineId==null){
return null;
}
return hyPartnerInterviewPlanMapper.getInterviewPlanByLineId(lineId);
}
/**
* 根据线索表ID查询
* @param lindIds

View File

@@ -123,4 +123,6 @@ public interface HyOpenAreaInfoMapper {
List<HyOpenAreaInfoDO> getProvinceAllCode(@Param("id") String id);
HyOpenAreaInfoDO selectByAreaPath(@Param("areaPath") String areaPath);
List<HyOpenAreaInfoDO> selectAllCity();
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.mapper;
import com.cool.store.entity.HyPartnerBaseInfoDO;
import com.cool.store.entity.SyncEcCustomerLabelDO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -63,4 +64,10 @@ public interface HyPartnerBaseInfoMapper {
@Param("idCardPhotoBlack") String idCardPhotoBlack,
@Param("partnerLineId") Long partnerLineId);
int selectAllList();
List<SyncEcCustomerLabelDO> selectListByLimit(@Param("limit1") Integer limit1, @Param("limit2") Integer limit2);
void updateByMobile(HyPartnerBaseInfoDO record);
}

View File

@@ -244,4 +244,10 @@ public interface HyPartnerLineInfoMapper {
*/
List<HyPartnerLineInfoDO> getHyPartnerLineInfoList(@Param("lineIds") List<Long> lineIds,String investmentManager);
/**
* 获取线索转让次数
* @param partnerLineId 线索 id
* @return 线索转让次数
*/
Integer getTransferTimes(@Param("lineId") Long partnerLineId);
}

View File

@@ -310,4 +310,11 @@
WHERE area_path= concat('/',#{areaPath},'/') and deleted=0 and province_city_flag=0
</select>
<select id="selectAllCity" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"></include>
FROM `hy_open_area_info`
WHERE deleted=0 and province_city_flag = 1 and parent_id is not null
</select>
</mapper>

View File

@@ -297,6 +297,12 @@
left join hy_partner_line_info b on a.partner_line_id = b.id
where a.id_card = #{idCard} and ( b.line_status != 3 and b.deleted = 0 )
</select>
<select id="selectAllList" resultType="java.lang.Integer">
SELECT count(*) FROM hy_partner_base_info where mobile is not null and user_portrait is null
</select>
<select id="selectListByLimit" resultType="com.cool.store.entity.SyncEcCustomerLabelDO">
SELECT id,mobile,user_portrait as userPortrait FROM hy_partner_base_info where mobile is not null and user_portrait is null LIMIT #{limit1},#{limit2}
</select>
<update id="cleanIdCardInfoByPartnerLineId">
update hy_partner_base_info
@@ -306,5 +312,15 @@
id_card_photo_black = #{idCardPhotoBlack}
where partner_line_id = #{partnerLineId}
</update>
<update id="updateByMobile">
update hy_partner_base_info
<set>
update_time=now(),
<if test="userPortrait != null and userPortrait!=''">
user_portrait = concat(",",#{userPortrait},","),
</if>
</set>
where mobile = #{mobile}
</update>
</mapper>

View File

@@ -25,12 +25,14 @@
<result column="weakness" jdbcType="VARCHAR" property="weakness" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="detailed_address" jdbcType="VARCHAR" property="detailedAddress" />
<result column="email" jdbcType="VARCHAR" property="email" />
</resultMap>
<sql id="Base_Column_List">
id, partner_id, partner_line_id, live_area, want_shop_area, accept_adjust_type, is_have_want_shop,
want_shop_info, max_budget, money_source, money_prove, education, work_year, is_have_work_exp,
work_exp, is_consumer, other_band, brand_strength, need_improve, strength, weakness,
create_time, update_time
create_time, update_time,detailed_address,email
</sql>
<select id="selectByPrimaryKeySelective" resultMap="BaseResultMap">
select
@@ -109,6 +111,15 @@
<if test="record.updateTime != null">
update_time,
</if>
<if test="record.otherBand != null">
other_band,
</if>
<if test="record.detailedAddress != null">
detailed_address,
</if>
<if test="record.email != null">
email,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="record.partnerId != null">
@@ -177,6 +188,12 @@
<if test="record.updateTime != null">
#{record.updateTime},
</if>
<if test="record.detailedAddress != null">
#{record.detailedAddress},
</if>
<if test="record.email != null">
#{record.email},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective">
@@ -248,6 +265,12 @@
<if test="record.updateTime != null">
update_time = #{record.updateTime},
</if>
<if test="record.detailedAddress != null">
detailed_address = #{record.detailedAddress},
</if>
<if test="record.email != null">
email = #{record.email},
</if>
</set>
where id = #{record.id}
</update>

View File

@@ -356,6 +356,8 @@
hpuinfo.username as partnerUserName,
hpuc.channel_name as channelName,
hpii.education as education,
hpii.detailed_address as detailAddress,
hpii.email as email,
hpl.phone_address as phoneAddress
from hy_partner_line_info a
left join hy_partner_base_info b on a.id = b.partner_line_id
@@ -734,4 +736,13 @@
</where>
</select>
<!-- 获取线索转让次数 -->
<select id="getTransferTimes" resultType="java.lang.Integer">
select count(*)
from hy_partner_task_info_log
where operate_type = 'entrust_others'
and partner_line_id = #{lineId}
-- and deleted = 0
</select>
</mapper>

View File

@@ -121,6 +121,7 @@ public class EnterpriseUserDTO implements Serializable {
enterpriseUserDO.setJobnumber(user.getJobnumber());
enterpriseUserDO.setUserStatus(UserStatusEnum.NORMAL.getCode());
enterpriseUserDO.setIsLeader(Boolean.FALSE);
enterpriseUserDO.setLeaderDeptIds("[]");
List<String> departmentLists = user.getDepartmentLists();
List<String> regionPaths = new ArrayList<>();
if(CollectionUtils.isNotEmpty(departmentLists)){
@@ -184,6 +185,7 @@ public class EnterpriseUserDTO implements Serializable {
//创建的时候给个默认值
if(FSEventTypeEnum.USER_CREATED.equals(eventType)){
enterpriseUserDO.setIsLeader(Boolean.FALSE);
enterpriseUserDO.setLeaderDeptIds("[]");
}
Collection<String> deptIds = leaderDeptMap.get(user.getUserId());
if(CollectionUtils.isNotEmpty(deptIds)){

View File

@@ -84,4 +84,10 @@ public class PartnerLineInfoAndBaseInfoDTO {
private String education;
private String developmentDirector;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("邮箱")
private String email;
}

View File

@@ -98,4 +98,10 @@ public class HyPartnerIntentInfoDO implements Serializable {
@ApiModelProperty("通过证明")
private String passCertifyFile;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("邮箱地址")
private String email;
}

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
@@ -16,6 +17,7 @@ import java.util.Date;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HyPartnerLabelDO {
@ApiModelProperty("")
private Long id;

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
@@ -16,6 +17,7 @@ import java.util.Date;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HyPartnerLabelGroupDO {
@ApiModelProperty("id")

View File

@@ -0,0 +1,16 @@
package com.cool.store.entity;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class SyncEcCustomerLabelDO {
private String mobile;
private String userPortrait;
}

View File

@@ -14,4 +14,16 @@ public class CallRecordBackReq {
@ApiModelProperty(value = "录音上传地址", required = true)
private String recordUrl;
@ApiModelProperty(value = "呼叫状态: 1-呼叫接听, 2-呼叫未接听, 3-呼叫失败", required = true)
private Integer callStatus;
@ApiModelProperty(value = "呼叫失败的情况下必传,说明呼叫失败的原因")
private String failReason;
@ApiModelProperty(value = "呼叫接听情况下必传通话开始时间格式yyyy-MM-dd HH:mm:ss")
private String callStartTime;
@ApiModelProperty(value = "呼叫接听情况下必传通话结束时间格式yyyy-MM-dd HH:mm:ss")
private String callEndTime;
}

View File

@@ -0,0 +1,27 @@
package com.cool.store.request;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author hxd
*/
@Data
@Accessors(chain = true)
public class GetTagRequest {
private Long groupId;
private String groupName;
private Integer sort;
private Integer type;
private List<GetTagItem> list;
@Data
@Accessors(chain = true)
public static class GetTagItem{
private Long classId;
private String className;
private int sort;
}
}

View File

@@ -27,6 +27,12 @@ public class PartnerIntentInfoRequest {
@ApiModelProperty("常驻区域")
private String liveArea;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("邮箱地址")
private String email;
@ApiModelProperty("意向开店区域")
private String wantShopArea;

View File

@@ -0,0 +1,18 @@
package com.cool.store.vo;
import lombok.Data;
/**
* @Author suzhuhong
* @Date 2023/8/30 15:16
* @Version 1.0
*/
@Data
public class BatchTransferVO {
private String partnerUserName;
private String partnerMobile;
private String errorMessage;
}

View File

@@ -39,6 +39,9 @@ public class PartnerIntentInfoVO {
@ApiModelProperty("常驻区域")
private String liveArea;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("意向开店区域")
private String wantShopArea;

View File

@@ -76,6 +76,12 @@ public class PartnerLineInfoAndBaseInfoVO {
@ApiModelProperty("常驻区域")
private String liveArea;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("邮箱")
private String email;
@ApiModelProperty("意向开店区域")
private String wantShopArea;

View File

@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;

View File

@@ -0,0 +1,91 @@
package com.cool.store.job;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.cool.store.entity.HyPartnerBaseInfoDO;
import com.cool.store.entity.SyncEcCustomerDO;
import com.cool.store.entity.SyncEcCustomerLabelDO;
import com.cool.store.mapper.HyPartnerBaseInfoMapper;
import com.cool.store.sdk.ec.EcClient;
import com.cool.store.sdk.ec.request.SyncEcCustomerLabelRequest;
import com.cool.store.sdk.ec.request.SyncEcCustomerRequest;
import com.cool.store.sdk.ec.response.SyncEcCustomerLabelResponse;
import com.cool.store.service.HyPartnerBaseInfoService;
import com.cool.store.utils.MybatisBatchUtils;
import com.cool.store.utils.StringUtil;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author hxd
*/
@Slf4j
@Component
public class SyncEcCustomerLabelJob {
@Value("${ec.baseUrl:null}")
private String baseUrl;
@Resource
private HyPartnerBaseInfoMapper hyPartnerBaseInfoMapper;
@XxlJob("SyncEcCustomerLabelJob")
public void execute() {
XxlJobHelper.log("-------------------------------同步ec客户标签数据到小程序开始-------------------------------");
syncEcLabelExecute();
XxlJobHelper.log("-------------------------------同步ec标签数据到小程序结束-------------------------------");
XxlJobHelper.handleSuccess();
}
@Autowired
private MybatisBatchUtils mybatisBatchUtils;
private final Integer count = 20;
/**
* 同步ec标签到招商数据库中
*/
private void syncEcLabelExecute() {
//获取总数
int size = hyPartnerBaseInfoMapper.selectAllList();
//执行数
int counts = size / count;
//取余如果大于1就再加一
int yu = size % count;
if (yu > 0) {
counts += 1;
}
for (int i = 1; i <= counts; i++) {
XxlJobHelper.log("执行limit1" + count * (i - 1) + "执行limit2" + count);
List<SyncEcCustomerLabelDO> list = hyPartnerBaseInfoMapper.selectListByLimit(count * (i - 1), count);
SyncEcCustomerLabelRequest syncEcCustomerLabelRequest = new SyncEcCustomerLabelRequest();
syncEcCustomerLabelRequest.setParameter(list);
EcClient ecClient = new EcClient();
SyncEcCustomerLabelResponse exec = ecClient.exec(baseUrl, syncEcCustomerLabelRequest);
if (ObjectUtil.isNull(exec)) {
continue;
}
List<SyncEcCustomerLabelDO> execList = exec.getData();
if (CollectionUtils.isEmpty(execList)) {
continue;
}
List<HyPartnerBaseInfoDO> collect = execList.stream().map((item) -> {
HyPartnerBaseInfoDO hyPartnerBaseInfoDO = new HyPartnerBaseInfoDO();
BeanUtil.copyProperties(item, hyPartnerBaseInfoDO);
return hyPartnerBaseInfoDO;
}).collect(Collectors.toList());
mybatisBatchUtils.batchInsertOrUpdate(collect, HyPartnerBaseInfoMapper.class, (record, mapper) -> mapper.updateByMobile(record));
}
}
}

View File

@@ -0,0 +1,21 @@
package com.cool.store.sdk.ec.request;
import com.cool.store.sdk.ec.core.EcRequest;
import com.cool.store.sdk.ec.response.SyncEcCustomerLabelResponse;
/**
* @author hxd
*/
public class SyncEcCustomerLabelRequest extends EcRequest<SyncEcCustomerLabelResponse> {
@Override
public String getApiUrl() {
return "/ec/appletToEcLabel";
}
@Override
public Class<SyncEcCustomerLabelResponse> getResponseClass() {
return SyncEcCustomerLabelResponse.class;
}
}

View File

@@ -0,0 +1,22 @@
package com.cool.store.sdk.ec.response;
import com.cool.store.entity.SyncEcCustomerLabelDO;
import com.cool.store.sdk.ec.core.EcResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author hxd
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class SyncEcCustomerLabelResponse extends EcResponse {
private List<SyncEcCustomerLabelDO> data;
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.service;
import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest;
import java.util.List;
@@ -8,4 +9,7 @@ public interface EcSyncService {
boolean ecToApplet(List<CustomerInfoRequest> queryListData);
void getChannelSource();
Boolean labelInfo(List<GetTagRequest> getTagRequestList);
}

View File

@@ -58,7 +58,7 @@ public interface HyPartnerLineInfoService {
*/
Boolean transferInvestmentManager(LoginUserInfo user, TransferInvestmentManagerRequest request,Boolean sendFlag) throws ApiException;
Boolean batchTransferInvestmentManager(LoginUserInfo user, BatchTransferInvestmentManagerRequest request) throws ApiException;
List<BatchTransferVO> batchTransferInvestmentManager(LoginUserInfo user, BatchTransferInvestmentManagerRequest request) throws ApiException;
/**
* 分配招商经理
@@ -66,7 +66,7 @@ public interface HyPartnerLineInfoService {
* @param lineIdList
* @return
*/
Boolean allocationInvestmentManager(LoginUserInfo user, List<Long> lineIdList);
Boolean allocationInvestmentManager(LoginUserInfo user, String userId,List<Long> lineIdList);
/**

View File

@@ -4,6 +4,7 @@ import com.cool.store.dto.label.LabelGroupAddDTO;
import com.cool.store.dto.label.LabelGroupDeleteDTO;
import com.cool.store.dto.label.LabelGroupListDTO;
import com.cool.store.dto.label.LabelGroupUpdateDTO;
import com.cool.store.entity.HyPartnerLabelGroupDO;
import com.cool.store.exception.ApiException;
import com.cool.store.vo.LabelGroupListVo;
@@ -44,4 +45,12 @@ public interface LabelGroupService {
*/
List<LabelGroupListVo> getAllLabelGroupList();
/**
* 添加ec标签组
* @param hyPartnerLabelGroupDO
*/
void addEcLabelGroup(HyPartnerLabelGroupDO hyPartnerLabelGroupDO);
HyPartnerLabelGroupDO selectByPrimaryKey(Long id);
}

View File

@@ -4,6 +4,7 @@ import com.cool.store.dto.label.LabelAddDTO;
import com.cool.store.dto.label.LabelDeleteDTO;
import com.cool.store.dto.label.LabelListDTO;
import com.cool.store.dto.label.LabelUpdateDTO;
import com.cool.store.entity.HyPartnerLabelDO;
import com.cool.store.exception.ApiException;
import com.cool.store.vo.LabelListVo;
@@ -55,4 +56,9 @@ public interface LabelService {
* @param dto
*/
void deleteLabel(LabelDeleteDTO dto);
HyPartnerLabelDO selectByPrimaryKey(Long classId);
void addEcLabel(HyPartnerLabelDO hyPartnerLabelDO);
}

View File

@@ -64,5 +64,12 @@ public interface OpenAreaService {
*/
OpenProvinceVO getOpenProvince();
/**
* V1.4
* 意向区域添加不限
* 每个市下面添加一个不限
*/
Boolean addOpenArea();
}

View File

@@ -137,6 +137,12 @@ public class CallServiceImpl implements CallService {
if(callRecordDO == null){
throw new ApiException(ErrorCodeEnum.CALL_RECORD_NOT_EXIST_ERROR);
}
callRecordDO.setCallStatus(request.getCallStatus());
callRecordDO.setFailReason(request.getFailReason());
if(StringUtils.isNotEmpty(request.getCallStartTime())&&StringUtils.isNotEmpty(request.getCallEndTime())){
callRecordDO.setCallStartTime(DateUtil.parse(request.getCallStartTime()));
callRecordDO.setCallEndTime(DateUtil.parse(request.getCallEndTime()));
}
callRecordDO.setRecordUrl(request.getRecordUrl());
callRecordDO.setUpdater("system-app");
callRecordDO.setUpdateTime(new Date());

View File

@@ -16,8 +16,11 @@ import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.http.UserSourceResponse;
import com.cool.store.mapper.HyPartnerLabelGroupMapper;
import com.cool.store.mapper.HyPartnerLabelMapper;
import com.cool.store.mapper.HyPartnerUserChannelMapper;
import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest;
import com.cool.store.sdk.ec.EcClient;
import com.cool.store.sdk.ec.bo.ChangeFollowUserBo;
import com.cool.store.sdk.ec.bo.UpdateCustomerBo;
@@ -26,6 +29,8 @@ import com.cool.store.sdk.ec.request.UpdateCustomerRequest;
import com.cool.store.sdk.ec.response.ChangeFollowUserResponse;
import com.cool.store.sdk.ec.response.UpdateCustomerResponse;
import com.cool.store.service.EcSyncService;
import com.cool.store.service.LabelGroupService;
import com.cool.store.service.LabelService;
import com.cool.store.utils.Post;
import com.cool.store.utils.StringUtil;
import com.cool.store.utils.UUIDUtils;
@@ -48,10 +53,10 @@ import java.util.List;
public class EcSyncServiceImpl implements EcSyncService {
@Value("${ec.baseUrl:null}")
private String baseUrl;
@Resource
private HyPartnerLineInfoDAO hyPartnerLineInfoDAO;
@@ -68,6 +73,12 @@ public class EcSyncServiceImpl implements EcSyncService {
@Resource
private HyPartnerUserChannelMapper hyPartnerUserChannelMapper;
@Resource
private LabelGroupService labelGroupService;
@Resource
private LabelService labelService;
@Override
public boolean ecToApplet(List<CustomerInfoRequest> queryListData) {
@@ -102,6 +113,28 @@ public class EcSyncServiceImpl implements EcSyncService {
}
}
@Override
public Boolean labelInfo(List<GetTagRequest> getTagRequestList) {
for (GetTagRequest getTagRequest : getTagRequestList) {
Long groupId = getTagRequest.getGroupId();
if (ObjectUtil.isNotNull(labelGroupService.selectByPrimaryKey(groupId))) {
continue;
}
HyPartnerLabelGroupDO hyPartnerLabelGroupDO = new HyPartnerLabelGroupDO();
hyPartnerLabelGroupDO.setLabelGroupName(getTagRequest.getGroupName()).setId(groupId);
labelGroupService.addEcLabelGroup(hyPartnerLabelGroupDO);
for (GetTagRequest.GetTagItem item : getTagRequest.getList()) {
if (ObjectUtil.isNotNull(labelService.selectByPrimaryKey(item.getClassId()))) {
continue;
}
HyPartnerLabelDO hyPartnerLabelDO = new HyPartnerLabelDO();
hyPartnerLabelDO.setLabelName(item.getClassName()).setId(item.getClassId()).setLabelGroupId(groupId);
labelService.addEcLabel(hyPartnerLabelDO);
}
}
return Boolean.TRUE;
}
/**
* 同步ec数据到表中 同时将部分数据同步到ec
*
@@ -169,7 +202,7 @@ public class EcSyncServiceImpl implements EcSyncService {
if (partnerLine != null) {
// EC与沪姨合伙人同时存在的线索用户但存在不同的跟进人将沪姨合伙人跟进人信息同步至EC覆盖原EC跟进人信息
if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) {
if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())) {
if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())&&!getFollowLineStatus(partnerLine)) {
resultLine.setId(partnerLine.getId()).setUpdateTime(new Date());
//沪姨合伙人线索存在黑名单EC该线索分配跟进人同步到沪姨合伙人但线索状态不变还存在黑名单中
resultLine.setLineStatus(partnerLine.getLineStatus().intValue() == LineStatusEnum.BLACKLIST.getCode().intValue()
@@ -248,7 +281,6 @@ public class EcSyncServiceImpl implements EcSyncService {
return Boolean.FALSE;
}
/**
* 得到不带86开头的号码
*

View File

@@ -267,6 +267,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
if(CollectionUtils.isNotEmpty(existDeptIds)){
existDeptIds.remove(departmentDetail.getId());
}
if(CollectionUtils.isEmpty(existDeptIds)){
enterpriseUser.setIsLeader(Boolean.FALSE);
}
enterpriseUser.setLeaderDeptIds(JSONObject.toJSONString(existDeptIds));
}
enterpriseUserDAO.batchInsertOrUpdate(leaderUserList);
@@ -319,5 +322,4 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
}
enterpriseUserDAO.batchInsertOrUpdate(userList);
}
}

View File

@@ -185,6 +185,7 @@ public class HyPartnerIntentInfoServiceImpl implements HyPartnerIntentInfoServic
partnerIntentInfoVO.setPartnerUserName(hyPartnerUserInfoDO.getUsername());
partnerIntentInfoVO.setWorkflowStage(hyPartnerLineInfoDO.getWorkflowStage());
partnerIntentInfoVO.setWorkflowStatus(hyPartnerLineInfoDO.getWorkflowStatus());
partnerIntentInfoVO.setDetailedAddress(hyPartnerIntentInfoDO.getDetailedAddress());
partnerIntentInfoVO.setPartnerUserPhone(hyPartnerUserInfoDO.getMobile());
HyOpenAreaInfoDO hyOpenAreaInfoDO = hyOpenAreaInfoDAO.selectById(Long.valueOf(hyPartnerUserInfoDO.getWantShopArea()));
partnerIntentInfoVO.setWantShopAreaName(hyOpenAreaInfoDO.getAreaPath().replace("/"," "));
@@ -442,6 +443,8 @@ public class HyPartnerIntentInfoServiceImpl implements HyPartnerIntentInfoServic
intentInfoDO.setPartnerLineId(request.getPartnerLineId());
intentInfoDO.setLiveArea(request.getLiveArea());
intentInfoDO.setWantShopArea(request.getWantShopArea());
intentInfoDO.setDetailedAddress(request.getDetailedAddress());
intentInfoDO.setEmail(request.getEmail());
intentInfoDO.setAcceptAdjustType(request.getAcceptAdjustType());
intentInfoDO.setIsHaveWantShop(request.getIsHaveWantShop());
intentInfoDO.setWantShopInfo("");

View File

@@ -225,7 +225,7 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
//更新会议开始时间为5分钟之内的房间状态为开启,会议状态变为已开始
Date startTime = new Date();
List<HyPartnerLineInfoDO> waitForOpenInterviewLineList = hyPartnerLineInfoMapper.getWaitForOpenInterviewLineList(DateUtil.offsetDay(startTime,-2), DateUtil.offsetMinute(startTime, 5));
List<HyPartnerLineInfoDO> waitForOpenInterviewLineList = hyPartnerLineInfoMapper.getWaitForOpenInterviewLineList(DateUtil.offsetDay(startTime,-1), DateUtil.offsetMinute(startTime, 5));
if(CollectionUtils.isEmpty(waitForOpenInterviewLineList)){
return;
}

View File

@@ -169,6 +169,7 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
}
@Override
@Transactional
public Boolean transferInvestmentManager(LoginUserInfo user, TransferInvestmentManagerRequest request,Boolean sendFlag) throws ApiException {
if (StringUtil.isBlank(request.getUserId())||request.getLineId()==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
@@ -178,8 +179,10 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
if (request.getUserId().equals(hyPartnerLineInfoDO.getInvestmentManager())){
throw new ServiceException(ErrorCodeEnum.NO_TRANSFER_REQUIRED);
}
hyPartnerLineInfoDAO.updateInvestmentManager(request.getUserId(), Arrays.asList(request.getLineId()));
//校验 合格资格面试阶段 面试状态已开始 不允许转让
if(WorkflowStageEnum.INTERVIEW.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage())&&WorkflowStatusEnum.INTERVIEW_3.getCode().equals(hyPartnerLineInfoDO.getWorkflowStatus())){
throw new ServiceException(ErrorCodeEnum.INTERVIEW_STATUS_NOT_TRANSFER,WorkflowStatusEnum.INTERVIEW_3.getMessage());
}
List<String> userIdList = new ArrayList<>();
userIdList.add(request.getUserId());
if (StringUtils.isNotEmpty(hyPartnerLineInfoDO.getInvestmentManager())){
@@ -188,17 +191,28 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
List<EnterpriseUserDO> userList = enterpriseUserDAO.getUserInfoByUserIds(userIdList);
Map<String, EnterpriseUserDO> userDOMap = userList.stream().collect(Collectors.toMap(EnterpriseUserDO::getUserId, data -> data));
//更新面试官
if (WorkflowStageEnum.INTERVIEW.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage())
&& WorkflowStatusEnum.INTERVIEW_2.getCode().equals(hyPartnerLineInfoDO.getWorkflowStatus())){
//更新面试官(预约面试全阶段和合作资格面试待面试阶段都需要变更面试官)
//待预约状态及之前还未生成面试信息,因此不做变更面试官操作
if ( (WorkflowStageEnum.INTERVIEW.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage()) && WorkflowStatusEnum.INTERVIEW_2.getCode().equals(hyPartnerLineInfoDO.getWorkflowStatus()))
|| (WorkflowStageEnum.RESERVATION.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage())) && !WorkflowStatusEnum.RESERVATION_0.getCode().equals(hyPartnerLineInfoDO.getWorkflowStatus())) {
workFlowService.transferInvestmentManager(WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),request);
}
//发送飞书工作通知
if (sendFlag){
//转让招商经理
hyPartnerLineInfoDAO.updateInvestmentManager(request.getUserId(), Arrays.asList(request.getLineId()));
String dateTime = DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_7);
HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByPartnerId(hyPartnerLineInfoDO.getPartnerId());
//发送飞书工作通知
if (sendFlag){
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),dateTime,hyPartnerUserInfoDO.getUsername(),hyPartnerUserInfoDO.getMobile());
}
//如果是面试预约待审批阶段还要发送面试预约申请通知
if (WorkflowStageEnum.RESERVATION.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage()) && WorkflowStatusEnum.RESERVATION_1.getCode().equals(hyPartnerLineInfoDO.getWorkflowStatus())) {
HyPartnerInterviewPlanDO interviewPlanByLine = hyPartnerInterviewPlanDAO.getInterviewPlanByLineId(request.getLineId());
if (interviewPlanByLine!=null && interviewPlanByLine.getStartTime()!=null ){
String startTime = DateUtil.format(interviewPlanByLine.getStartTime(), CoolDateUtils.DATE_FORMAT_SEC_7);
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.INTERVIEW_APPOINTMENT, Arrays.asList(request.getUserId()),hyPartnerUserInfoDO.getUsername(),hyPartnerUserInfoDO.getMobile(),startTime);
}
}
//作废待完成&已逾期的任务
hyFollowTaskDAO.cancelUndoFollowTask(request.getLineId());
@@ -220,37 +234,61 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
}
@Override
public Boolean batchTransferInvestmentManager(LoginUserInfo user, BatchTransferInvestmentManagerRequest request) throws ApiException {
public List<BatchTransferVO> batchTransferInvestmentManager(LoginUserInfo user, BatchTransferInvestmentManagerRequest request) throws ApiException {
if (CollectionUtils.isEmpty(request.getLineIds())||StringUtils.isEmpty(request.getUserId())){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
int num = request.getLineIds().size();
List<HyPartnerLineInfoDO> hyPartnerLineInfoList = hyPartnerLineInfoDAO.getHyPartnerLineInfoList(request.getLineIds(), request.getUserId());
//如果选中的线索中有线索招商经理已经是被装让的招商经理,则不允许批量操作
if (CollectionUtils.isNotEmpty(hyPartnerLineInfoList)){
throw new ServiceException(ErrorCodeEnum.NO_BATCH_TRANSFER_REQUIRED);
}
List<BatchTransferVO> result = new ArrayList<>();
List<HyPartnerLineInfoDO> hyPartnerLineInfoList = hyPartnerLineInfoDAO.getHyPartnerLineInfoList(request.getLineIds(), null);
Map<Long, String> partnerMap = hyPartnerLineInfoList.stream().collect(Collectors.toMap(HyPartnerLineInfoDO::getId, HyPartnerLineInfoDO::getPartnerId));
List<String> partnerIdList = hyPartnerLineInfoList.stream().filter(x->StringUtils.isNotEmpty(x.getPartnerId()))
.map(HyPartnerLineInfoDO::getPartnerId).distinct().collect(Collectors.toList());
List<HyPartnerUserInfoDO> hyPartnerUserInfoDOS = hyPartnerUserInfoDAO.selectByPartnerIds(partnerIdList);
Map<String, HyPartnerUserInfoDO> partnerUserInfoDOMap = hyPartnerUserInfoDOS.stream().collect(Collectors.toMap(HyPartnerUserInfoDO::getPartnerId, x -> x));
List<Long> successLineIds = new ArrayList<>();
for (Long lineId:request.getLineIds()) {
TransferInvestmentManagerRequest transferInvestmentManagerRequest = new TransferInvestmentManagerRequest();
transferInvestmentManagerRequest.setUserId(request.getUserId());
transferInvestmentManagerRequest.setLineId(lineId);
try {
this.transferInvestmentManager(user,transferInvestmentManagerRequest,num<=1?true:false);
} catch (ApiException e) {
log.info("transferInvestmentManager_success Transfer_interview_management_failed,lineId:{}",lineId);
this.transferInvestmentManager(user,transferInvestmentManagerRequest,Boolean.FALSE);
successLineIds.add(lineId);
} catch (Exception e) {
log.info("transferInvestmentManager_success Transfer_interview_management_failed,lineId:{}e:{}",lineId,e.getMessage());
HyPartnerUserInfoDO hyPartnerUserInfoDO = partnerUserInfoDOMap.get(partnerMap.get(lineId));
BatchTransferVO batchTransferVO = new BatchTransferVO();
batchTransferVO.setErrorMessage(e.getMessage());
if (e instanceof ServiceException){
batchTransferVO.setErrorMessage(((ServiceException)e).getErrorMessage());
}
batchTransferVO.setPartnerMobile(hyPartnerUserInfoDO.getMobile());
batchTransferVO.setPartnerUserName(hyPartnerUserInfoDO.getUsername());
result.add(batchTransferVO);
}
}
if (num>1){
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.BATCH_TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),num,DateUtil.format(new Date(),CoolDateUtils.DATE_FORMAT_SEC_7));
try {
if (successLineIds.size()>1){
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.BATCH_TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),successLineIds.size(),DateUtil.format(new Date(),CoolDateUtils.DATE_FORMAT_SEC_7));
}else if (successLineIds.size()==1){
String dateTime = DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_7);
HyPartnerUserInfoDO hyPartnerUserInfoDO = partnerUserInfoDOMap.get(partnerMap.get(successLineIds.get(0)));
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.TRANS_INVESTMENT_MANAGER,Arrays.asList(request.getUserId()),dateTime,hyPartnerUserInfoDO.getUsername(),hyPartnerUserInfoDO.getMobile());
}
return Boolean.TRUE;
} catch (Exception e) {
log.info("batchTransferInvestmentManager_error:{}",e.getMessage());
}
return result;
}
@Override
public Boolean allocationInvestmentManager(LoginUserInfo user, List<Long> lineIdList) {
if (user==null|| CollectionUtils.isEmpty(lineIdList)){
public Boolean allocationInvestmentManager(LoginUserInfo operateUser,String userId, List<Long> lineIdList) {
if (StringUtils.isEmpty(userId)|| CollectionUtils.isEmpty(lineIdList)){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(userId);
if (user==null){
throw new ServiceException(ErrorCodeEnum.INVESTMENT_MANAGER_NOT_EXIST);
}
//加盟上线索集合
List<HyPartnerLineInfoDO> partnerLineInfoList= hyPartnerLineInfoDAO.getLineListByLineIds(lineIdList);
//过滤出已结束的线索 这块线索需要重新生成新的线索
@@ -262,7 +300,7 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
closeLineList.stream().forEach(x->{
HyPartnerLineInfoDO hyPartnerLineInfoDO = new HyPartnerLineInfoDO();
hyPartnerLineInfoDO.setPartnerId(x.getPartnerId());
hyPartnerLineInfoDO.setInvestmentManager(user.getUserId());
hyPartnerLineInfoDO.setInvestmentManager(userId);
hyPartnerLineInfoDO.setWorkflowStage(WorkflowStageEnum.INTENT.getCode());
hyPartnerLineInfoDO.setWorkflowStatus(WorkflowStatusEnum.INTENT_0.getCode());
hyPartnerLineInfoDO.setLineStatus(1);
@@ -282,22 +320,22 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
//没有结束的线索直接分配招商经理
List<HyPartnerLineInfoDO> otherLineList = partnerLineInfoList.stream().filter(x -> x.getCloseTime() == null).collect(Collectors.toList());
List<Long> otherLineIdList = otherLineList.stream().map(HyPartnerLineInfoDO::getId).collect(Collectors.toList());
hyPartnerLineInfoDAO.updateInvestmentManager(user.getUserId(), otherLineIdList);
hyPartnerLineInfoDAO.updateInvestmentManager(userId, otherLineIdList);
//添加日志
partnerLineInfoList.forEach(x->{
//给招商经理发送飞书工作通知
List<String> userIdList = new ArrayList<>();
userIdList.add(user.getUserId());
userIdList.add(userId);
HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByPartnerId(x.getPartnerId());
String dateTime = DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_7);
noticeService.sendFeiShuNotice(FeiShuNoticeMsgEnum.ALLOCATION_INVESTMENT_MANAGER,userIdList,dateTime,hyPartnerUserInfoDO.getUsername(),hyPartnerUserInfoDO.getMobile());
LineLogInfo lineLogInfo = new LineLogInfo(x.getPartnerId(), x.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.ALLOCATION_INVESTMENT_MANAGER,
LineLogInfo lineLogInfo = new LineLogInfo(x.getPartnerId(), x.getId(), operateUser.getUserId(),
operateUser.getName(), OperateTypeEnum.ALLOCATION_INVESTMENT_MANAGER,
WorkflowStageEnum.getWorkflowStageByCode(x.getWorkflowStage()),
x.getWorkflowStatus(), "");
AllocationInvestmentManagerLogDTO logDTO = AllocationInvestmentManagerLogDTO.builder().allocationUserId(user.getUserId()).allocationUsername(user.getName())
.mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).build();
AllocationInvestmentManagerLogDTO logDTO = AllocationInvestmentManagerLogDTO.builder().allocationUserId(operateUser.getUserId()).allocationUsername(operateUser.getName())
.mobile(operateUser.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).build();
lineLogInfo.setData(logDTO);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
});
@@ -485,9 +523,9 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
//通过 拒绝添加日志
if ("pass".equals(closeFollowRequest.getType())||"reject".equals(closeFollowRequest.getType())){
if (WorkflowStageEnum.INTENT.getCode().equals(hyPartnerLineInfoDO.getWorkflowStage())&&"reject".equals(closeFollowRequest.getType())){
LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), hyPartnerLineInfoDO.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.REMOVE_BLACKLIST,
user.getName(), OperateTypeEnum.CLOSE_FOLLOW,
WorkflowStageEnum.getWorkflowStageByCode(oldWorkflowStage),
oldWorkflowStatus, "");
CloseOrPassFollowLogDTO log = CloseOrPassFollowLogDTO.builder().operateUserId(user.getUserId()).passReason(closeFollowRequest.getPassReason()).rejectRealReason(closeFollowRequest.getRejectRealReason())
@@ -957,6 +995,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
partnerLineInfoAndBaseInfoVO.setAcceptAdjustType(partnerLineInfoAndBaseInfoDTO.getAcceptAdjustType());
partnerLineInfoAndBaseInfoVO.setWantShopArea(partnerLineInfoAndBaseInfoDTO.getWantShopArea());
partnerLineInfoAndBaseInfoVO.setLiveArea(partnerLineInfoAndBaseInfoDTO.getLiveArea());
partnerLineInfoAndBaseInfoVO.setDetailedAddress(partnerLineInfoAndBaseInfoDTO.getDetailedAddress());
partnerLineInfoAndBaseInfoVO.setEmail(partnerLineInfoAndBaseInfoDTO.getEmail());
partnerLineInfoAndBaseInfoVO.setIdCard(partnerLineInfoAndBaseInfoDTO.getIdCard());
partnerLineInfoAndBaseInfoVO.setChannelName(partnerLineInfoAndBaseInfoDTO.getChannelName());
partnerLineInfoAndBaseInfoVO.setDevelopmentDirector(partnerLineInfoAndBaseInfoDTO.getDevelopmentDirector());

View File

@@ -13,10 +13,7 @@ import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyIntendDevMappingDAO;
import com.cool.store.dao.HyInterviewDAO;
import com.cool.store.dto.calendar.CreateCalendarEventDTO;
import com.cool.store.dto.calendar.DeleteCalendarEventDTO;
import com.cool.store.dto.calendar.UserCalendarsEventDTO;
import com.cool.store.dto.calendar.UserFreeBusyInfoDTO;
import com.cool.store.dto.calendar.*;
import com.cool.store.dto.log.*;
import com.cool.store.dto.message.SendCardMessageDTO;
import com.cool.store.dto.partner.EnterInterviewDto;
@@ -156,38 +153,66 @@ public class InterviewServiceImpl implements InterviewService {
@Override
@Transactional
public void entrustOthers(EntrustOthersReq request) throws ApiException {
//只有房间状态是待开放才可以委托他人
Integer roomStatus = hyPartnerInterviewPlanMapper.getRoomStatus(request.getInterviewPlanId());
if (!roomStatus.equals(RoomStatus.WAIT_FOR_OPEN.getCode())) {
throw new ApiException(ErrorCodeEnum.ROOM_STATUS_ERROR);
}
InterviewVO interviewInfo = hyPartnerInterviewPlanMapper.getInterviewInfo(request.getInterviewPlanId());
HyPartnerLineInfoDO lineInfo = hyPartnerLineInfoMapper.selectByPrimaryKeySelective(request.getPartnerLineId());
//如果面试信息为空,抛出异常
if (interviewInfo == null) {
throw new ApiException(ErrorCodeEnum.INTERVIEW_PLAN_NOT_EXIST);
}
if(RoomStatus.WAIT_FOR_OPEN.getCode() != Integer.parseInt(interviewInfo.getRoomStatus())){
throw new ApiException(ErrorCodeEnum.ROOM_STATUS_ERROR);
//只有预约面试阶段和合作资格面试待面试阶段才能变更面试官
if ( !WorkflowStatusEnum.INTERVIEW_2.getCode().equals(lineInfo.getWorkflowStatus())
&& !WorkflowStageEnum.RESERVATION.getCode().equals(lineInfo.getWorkflowStage())) {
throw new ApiException(ErrorCodeEnum.INTERVIEW_STATUS_ERROR);
}
//1.新面试官日程新增
CreateCalendarEventDTO createCalendarEventDTO = new CreateCalendarEventDTO();
createCalendarEventDTO.setStartTime(DateUtil.parse(interviewInfo.getStartTime()).getTime());
createCalendarEventDTO.setEndTime(DateUtil.parse(interviewInfo.getEndTime()).getTime());
createCalendarEventDTO.setUserId(request.getNewInterviewerId());
createCalendarEventDTO.setJoinUserIds(Arrays.asList(request.getNewInterviewerId()));
createCalendarEventDTO.setSummary(generateInterviewTitle(request.getPartnerLineId()));
UserCalendarsEventDTO userCalendarEvent = isvHttpRequest.createUserCalendarEvent(createCalendarEventDTO);
if(userCalendarEvent == null ){
throw new ApiException(ErrorCodeEnum.CREATE_CALENDAR_EVENT_FAIL);
// //1.新面试官日程新增
// CreateCalendarEventDTO createCalendarEventDTO = new CreateCalendarEventDTO();
// createCalendarEventDTO.setStartTime(DateUtil.parse(interviewInfo.getStartTime()).getTime());
// createCalendarEventDTO.setEndTime(DateUtil.parse(interviewInfo.getEndTime()).getTime());
// createCalendarEventDTO.setUserId(request.getNewInterviewerId());
// createCalendarEventDTO.setJoinUserIds(Arrays.asList(request.getNewInterviewerId()));
// createCalendarEventDTO.setSummary(generateInterviewTitle(request.getPartnerLineId()));
// UserCalendarsEventDTO userCalendarEvent = isvHttpRequest.createUserCalendarEvent(createCalendarEventDTO);
// if(userCalendarEvent == null ){
// throw new ApiException(ErrorCodeEnum.CREATE_CALENDAR_EVENT_FAIL);
// }
// //2.原面试官日程删除
// DeleteCalendarEventDTO deleteCalendarEventDTO = new DeleteCalendarEventDTO();
// deleteCalendarEventDTO.setCalendarId(interviewInfo.getFeishuCalendarId());
// deleteCalendarEventDTO.setEventId(interviewInfo.getFeishuScheduleId());
// deleteCalendarEventDTO.setUserId(interviewInfo.getInterviewerId());
// UserCalendarsEventDTO userCalendarsEventDTO = isvHttpRequest.deleteUserCalendarEvent(deleteCalendarEventDTO);
// if(userCalendarsEventDTO == null ){
// throw new ApiException(ErrorCodeEnum.FEISHU_DELETE_SCHEDULE_ERROR);
// }
//有可能还未同意面试预约,这时候没有建立日程,只需要修改面试官
//1.4 优化多次转让,线索转让次数 >= 1 无需添加日程,只转让线索的招商经理及面试官
Integer transferTimes = hyPartnerLineInfoMapper.getTransferTimes(request.getPartnerLineId());
if (interviewInfo.getFeishuCalendarId() != null && interviewInfo.getFeishuScheduleId() != null
&& transferTimes < 1) {
//V1.3 需求变更为将新面试官拉入原面试官日程,而非删除和新增日程
//1. 原面试官面试日程信息
String oldInterviewerId = CurrentUserHolder.getUserId();
UpdateCalendarEventDTO updateCalendarEventDTO = new UpdateCalendarEventDTO();
updateCalendarEventDTO.setUserId(oldInterviewerId);
updateCalendarEventDTO.setCalendarId(interviewInfo.getFeishuCalendarId());
updateCalendarEventDTO.setEventId(interviewInfo.getFeishuScheduleId());
updateCalendarEventDTO.setStartTime(DateUtil.parse(interviewInfo.getStartTime()).getTime());
updateCalendarEventDTO.setEndTime(DateUtil.parse(interviewInfo.getEndTime()).getTime());
updateCalendarEventDTO.setSummary(generateInterviewTitle(request.getPartnerLineId()));
//2. 邀请新面试官加入日程
List<String> list = new ArrayList();
list.add(request.getNewInterviewerId());
//当前招商经理不是面试官,但是日程在招商经理这里
if (!oldInterviewerId.equals(list.get(0))) {
list.add(oldInterviewerId);
}
//2.原面试官日程删除
DeleteCalendarEventDTO deleteCalendarEventDTO = new DeleteCalendarEventDTO();
deleteCalendarEventDTO.setCalendarId(interviewInfo.getFeishuCalendarId());
deleteCalendarEventDTO.setEventId(interviewInfo.getFeishuScheduleId());
deleteCalendarEventDTO.setUserId(interviewInfo.getInterviewerId());
UserCalendarsEventDTO userCalendarsEventDTO = isvHttpRequest.deleteUserCalendarEvent(deleteCalendarEventDTO);
updateCalendarEventDTO.setJoinUserIds(list);
UserCalendarsEventDTO userCalendarsEventDTO = isvHttpRequest.updateUserCalendarEvent(updateCalendarEventDTO);
if(userCalendarsEventDTO == null ){
throw new ApiException(ErrorCodeEnum.FEISHU_DELETE_SCHEDULE_ERROR);
throw new ApiException(ErrorCodeEnum.FEISHU_UPDATE_SCHEDULE_ERROR);
}
}
// 3.面试信息计划变更
@@ -195,8 +220,8 @@ public class InterviewServiceImpl implements InterviewService {
record.setId(Long.valueOf(request.getInterviewPlanId()));
record.setInterviewer(request.getNewInterviewerId());
record.setUpdateTime(new Date());
record.setFeishuCalendarId(userCalendarEvent.getCalendarId());
record.setFeishuScheduleId(userCalendarEvent.getEventId());
// record.setFeishuCalendarId(userCalendarEvent.getCalendarId());
// record.setFeishuScheduleId(userCalendarEvent.getEventId());
hyPartnerInterviewPlanMapper.updateByPrimaryKeySelective(record);
//更新面试信息
@@ -254,7 +279,13 @@ public class InterviewServiceImpl implements InterviewService {
createCalendarEventDTO.setStartTime(DateUtil.parse(request.getNewStartBookingTime()).getTime());
createCalendarEventDTO.setEndTime(DateUtil.parse(request.getNewEndBookingTime()).getTime());
createCalendarEventDTO.setUserId(interviewInfo.getInterviewerId());
createCalendarEventDTO.setJoinUserIds(Arrays.asList(interviewInfo.getInterviewerId()));
List<String> list = Arrays.asList(interviewInfo.getInterviewerId());
//可能当前招商经理不是面试官,但是日程在招商经理这里
String userId = CurrentUserHolder.getUserId();
if (!userId.equals(list.get(0))) {
list.add(userId);
}
createCalendarEventDTO.setJoinUserIds(list);
createCalendarEventDTO.setSummary(generateInterviewTitle(interviewInfo.getPartnerLineId()));
UserCalendarsEventDTO userCalendarEvent = isvHttpRequest.createUserCalendarEvent(createCalendarEventDTO);
if (userCalendarEvent == null) {
@@ -391,6 +422,10 @@ public class InterviewServiceImpl implements InterviewService {
if(request.getPartnerLineId() == null || request.getPartnerLineId()<=0){
throw new ApiException(ErrorCodeEnum.INTERVIEW_LINE_ID_IS_NULL);
}
//如果开始时间小于当前时间需要报错
if(DateUtil.date().isAfter(DateUtil.parse(request.getStartBookingTime()))){
throw new ApiException(ErrorCodeEnum.CREATE_APPOINTMENT_TIME_ERROR);
}
HyPartnerInterviewPlanDO hyPartnerInterviewPlanDO = new HyPartnerInterviewPlanDO();
hyPartnerInterviewPlanDO.setPartnerLineId(request.getPartnerLineId());
hyPartnerInterviewPlanDO.setDeleted(false);
@@ -505,6 +540,13 @@ public class InterviewServiceImpl implements InterviewService {
record.setFeishuCalendarId(userCalendarEvent.getCalendarId());
record.setFeishuScheduleId(userCalendarEvent.getEventId());
record.setApplicationApproved(1);
//如果同意的时候已经超过预约的时间前 5 分钟,直接进入面试已开始阶段
DateTime interviewStartTime = DateUtil.offsetMinute(DateUtil.parseDateTime(interviewVO.getStartTime()), -5);
Date now = new Date();
if (interviewStartTime.isBeforeOrEquals(now)) {
record.setRoomStatus(RoomStatus.OPEN.getCode());
record.setActualEndTime(new Date());
}
record.setUpdateTime(new Date());
hyPartnerInterviewPlanMapper.updateByPrimaryKeySelective(record);
@@ -512,7 +554,11 @@ public class InterviewServiceImpl implements InterviewService {
HyPartnerInterviewDO hyPartnerInterviewDO = new HyPartnerInterviewDO();
hyPartnerInterviewDO.setId(Long.valueOf(interviewVO.getInterviewId()));
//更新面试状态和线索子流程状态
if (interviewStartTime.isBeforeOrEquals(now)) {
interviewDAO.updateInterviewWorkflowStatus(request.getInterviewPlanId(), WorkflowStatusEnum.INTERVIEW_3);
} else {
interviewDAO.updateInterviewWorkflowStatus(request.getInterviewPlanId(), WorkflowStatusEnum.INTERVIEW_2);
}
// hyPartnerInterviewDO.setStatus(Integer.valueOf(WorkflowStatusEnum.INTERVIEW_2.getCode()));
hyPartnerInterviewDO.setUpdateTime(new Date());
hyPartnerInterviewMapper.updateByPrimaryKeySelective(hyPartnerInterviewDO);

View File

@@ -14,6 +14,7 @@ import com.cool.store.mapper.HyPartnerLabelMapper;
import com.cool.store.service.LabelGroupService;
import com.cool.store.vo.LabelGroupListVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -33,6 +34,10 @@ public class LabelGroupServiceImpl implements LabelGroupService {
@Autowired
private HyPartnerLabelMapper labelMapper;
@Value("${ec.sync.createUserId:null}")
private String createUserId;
/**
* 查询标签组信息列表
* @param dto 查询条件
@@ -110,6 +115,18 @@ public class LabelGroupServiceImpl implements LabelGroupService {
return labelGroupMapper.getLabelGroupList(labelGroupDO);
}
@Override
public HyPartnerLabelGroupDO selectByPrimaryKey(Long id){
return labelGroupMapper.selectByPrimaryKey(id);
}
@Override
public void addEcLabelGroup(HyPartnerLabelGroupDO hyPartnerLabelGroupDO) {
hyPartnerLabelGroupDO.setCreateTime(new Date()).setCreateUserId(createUserId).setEditDate(new Date())
.setEditUserId(createUserId);
labelGroupMapper.insertSelective(hyPartnerLabelGroupDO);
}
/**
* 某个标签组内是否有未删除的标签
* @param id 标签组 id

View File

@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -32,6 +33,11 @@ public class LabelServiceImpl implements LabelService {
@Autowired
private HyPartnerLabelMapper labelMapper;
@Value("${ec.sync.createUserId:null}")
private String createUserId;
/**
* 获取数组列表
*
@@ -98,6 +104,18 @@ public class LabelServiceImpl implements LabelService {
labelMapper.updateByPrimaryKeySelective(labelDO);
}
@Override
public HyPartnerLabelDO selectByPrimaryKey(Long classId) {
return labelMapper.selectByPrimaryKey(classId);
}
@Override
public void addEcLabel(HyPartnerLabelDO hyPartnerLabelDO) {
hyPartnerLabelDO.setEditDate(new Date()).setCreateTime(new Date()).setEditUserId(createUserId).setCreateUserId(createUserId)
.setUpdateUserId(createUserId);
labelMapper.insertSelective(hyPartnerLabelDO);
}
private Boolean whetherLabelRepeat(HyPartnerLabelDO label) throws ApiException {
Long id = label.getId();
label.setId(null);

View File

@@ -36,6 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Service
public class LineHighSeasServiceImpl implements LineHighSeasService {
@@ -145,6 +146,10 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
String fileStr = ossServer.uploadFileServer(stream, dir + getExcelName());
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()))
.entrySet().stream().filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey).collect(Collectors.toList());
for (int i = 0; i < lineDOList.size(); i++) {
HyPartnerLineDO hyPartnerLineDO = lineDOList.get(i);
String partnerName = hyPartnerLineDO.getPartnerName();
@@ -174,6 +179,11 @@ public class LineHighSeasServiceImpl implements LineHighSeasService {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.MOBILE_EXIST : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.MOBILE_EXIST));
ExcelUtil.setStyleMap(styleCells, i, 1, new String[]{ExcelUtil.FONT_RED});
}
//手机号重复
if (uniqueList.contains(mobile)) {
hyPartnerLineDO.setErrorInfo(StringUtil.isEmpty(hyPartnerLineDO.getErrorInfo()) ? ExcelErrorConstants.MOBILE_REPEAT : hyPartnerLineDO.getErrorInfo().concat(Constants.SEMICOLON).concat(ExcelErrorConstants.MOBILE_REPEAT));
ExcelUtil.setStyleMap(styleCells, i, 1, new String[]{ExcelUtil.FONT_RED});
}
}
//常驻区域为空
String liveArea = hyPartnerLineDO.getLiveAreaReplace().trim();

View File

@@ -6,6 +6,7 @@ import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.HyOpenAreaInfoDAO;
import com.cool.store.dto.partner.ApplyReservationProvinceDTO;
import com.cool.store.entity.HyOpenAreaInfoDO;
import com.cool.store.mapper.HyOpenAreaInfoMapper;
import com.cool.store.request.OpenAreaRequest;
import com.cool.store.service.OpenAreaService;
import com.cool.store.utils.RedisUtilPool;
@@ -36,6 +37,8 @@ public class OpenAreaServiceImpl implements OpenAreaService {
@Resource
private HyOpenAreaInfoDAO hyOpenAreaInfoDAO;
@Resource
private HyOpenAreaInfoMapper hyOpenAreaInfoMapper;
@Resource
private RedisUtilPool redisUtilPool;
@@ -190,6 +193,25 @@ public class OpenAreaServiceImpl implements OpenAreaService {
return openProvinceVO;
}
@Override
public Boolean addOpenArea() {
//查询出所有的市
List<HyOpenAreaInfoDO> openArea = hyOpenAreaInfoDAO.selectAllCity();
if (CollectionUtils.isNotEmpty(openArea)){
//在每个市下面添加名称为不限的区
openArea.forEach(x->{
Long id = x.getId();
HyOpenAreaInfoDO hyOpenAreaInfoDO = new HyOpenAreaInfoDO();
hyOpenAreaInfoDO.setAreaStatus("open");
hyOpenAreaInfoDO.setAreaName("不限");
hyOpenAreaInfoDO.setParentId(id);
hyOpenAreaInfoDO.setAreaPath(x.getAreaPath()+"不限/");
hyOpenAreaInfoMapper.insertSelective(hyOpenAreaInfoDO);
});
}
return true;
}
private OpenAreaVO convertDoToVo(HyOpenAreaInfoDO hyOpenAreaInfoDO){
OpenAreaVO openAreaVO = new OpenAreaVO();
openAreaVO.setId(hyOpenAreaInfoDO.getId());
@@ -259,6 +281,7 @@ public class OpenAreaServiceImpl implements OpenAreaService {
}
}
return jsonArray;
}
}
}

View File

@@ -184,6 +184,10 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
if(RoomStatus.WAIT_FOR_OPEN.getCode() != Integer.parseInt(interviewInfo.getRoomStatus())){
throw new ApiException(ErrorCodeEnum.ROOM_STATUS_ERROR);
}
//如果开始时间小于当前时间需要报错
if(DateUtil.date().isAfter(DateUtil.parse(request.getNewStartBookingTime()))){
throw new ApiException(ErrorCodeEnum.CREATE_APPOINTMENT_TIME_ERROR);
}
HyPartnerInterviewPlanDO record = new HyPartnerInterviewPlanDO();
record.setId(Long.valueOf(request.getInterviewPlanId()));
record.setStartTime(Convert.toDate(request.getNewStartBookingTime()));

View File

@@ -104,6 +104,13 @@ public class PartnerUserInfoServiceImpl implements PartnerUserInfoService {
UserInfoUpdateDTO.UserInfoUpdate beforeUserinfoUpdate = new UserInfoUpdateDTO.UserInfoUpdate(hyPartnerUserInfoDO.getUsername(), hyPartnerUserInfoDO.getMobile(), hyPartnerUserInfoDO.getLiveArea(), hyPartnerUserInfoDO.getWantShopArea(), hyPartnerUserInfoDO.getAcceptAdjustType());
UserInfoUpdateDTO.UserInfoUpdate afterUserinfoUpdate = new UserInfoUpdateDTO.UserInfoUpdate(partnerUserInfoRequest.getUsername(), partnerUserInfoRequest.getMobile(), partnerUserInfoRequest.getLiveArea(), partnerUserInfoRequest.getWantShopArea(), partnerUserInfoRequest.getAcceptAdjustType());
//如果手机号不相同 校验手机号
if (StringUtils.isNotEmpty(hyPartnerUserInfoDO.getMobile()) && !hyPartnerUserInfoDO.getMobile().equals(partnerUserInfoRequest.getMobile())){
HyPartnerUserInfoDO userInfo = hyPartnerUserInfoDAO.selectByMobile(partnerUserInfoRequest.getMobile());
if (userInfo != null){
throw new ServiceException(ErrorCodeEnum.MOBILE_EXIST);
}
}
ApplyBaseInfoVO applyBaseInfoVO = new ApplyBaseInfoVO();
fillUserInfoDOByRequest(hyPartnerUserInfoDO, partnerUserInfoRequest);
hyPartnerUserInfoDAO.updateByPrimaryKeySelective(hyPartnerUserInfoDO);

View File

@@ -1,6 +1,7 @@
package com.cool.store.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.cool.store.utils.StringUtil;
import com.cool.store.vo.interview.CalendarInfo;
import com.cool.store.vo.interview.FreeBusyInfo;
@@ -17,7 +18,7 @@ public class TimeSlotGenerator {
List<CalendarInfo> daySlots = generateDaySlots(startDate, endDate);
for (CalendarInfo daySlot : daySlots) {
System.out.println(daySlot);
System.out.println(JSON.toJSON(daySlot));
}
}
@@ -36,7 +37,7 @@ public class TimeSlotGenerator {
int day = startCal.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);
List<FreeBusyInfo> hourSlots = generateHourSlots();
List<FreeBusyInfo> hourSlots = generateHalfHourSlots();
CalendarInfo daySlot = new CalendarInfo(transDayOfWeek(dayOfWeek),
String.valueOf(year),
StringUtil.addZeroForNum(String.valueOf(month),2),
@@ -65,6 +66,29 @@ public class TimeSlotGenerator {
return hourSlots;
}
private static List<FreeBusyInfo> generateHalfHourSlots() {
List<FreeBusyInfo> hourSlots = new ArrayList<>();
//循环打印半小时的时间段
for (int hour = 10; hour < 17; hour++) {
if(hour == 12){
continue;
}
String startTime = String.format("%02d:00", hour);
String endTime = String.format("%02d:30", hour);
//默认空闲
FreeBusyInfo hourSlot = new FreeBusyInfo(startTime, endTime, true);
hourSlots.add(hourSlot);
String startTime2 = String.format("%02d:30", hour);
String endTime2 = String.format("%02d:00", hour + 1);
//默认空闲
FreeBusyInfo hourSlot2 = new FreeBusyInfo(startTime2, endTime2, true);
hourSlots.add(hourSlot2);
}
return hourSlots;
}
public static int transDayOfWeek(int dayOfWeek) {
switch (dayOfWeek) {
case 1:

View File

@@ -106,6 +106,12 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService {
// 微信未授权过
if(hyPartnerUserPlatformBindDO == null){
hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByMobile(phoneInfoDTO.getPhoneInfo().getPhoneNumber());
if(hyPartnerUserInfoDO != null){
HyPartnerUserPlatformBindDO hy = hyPartnerUserPlatformBindDAO.getByPartnerId(hyPartnerUserInfoDO.getPartnerId());
if (hy!=null){
throw new ServiceException(ErrorCodeEnum.MOBILE_WECHAT_EXIST);
}
}
if(hyPartnerUserInfoDO == null){
hyPartnerUserInfoDO = new HyPartnerUserInfoDO();
hyPartnerUserInfoDO.setMobile(phoneInfoDTO.getPhoneInfo().getPhoneNumber());

View File

@@ -1,11 +1,29 @@
package com.cool.store.service.impl.workflow;
import cn.hutool.core.date.DateUtil;
import com.cool.store.entity.HyPartnerInterviewDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.RoomStatus;
import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.mapper.HyPartnerInterviewPlanMapper;
import com.cool.store.request.CloseFollowRequest;
import com.cool.store.request.EntrustOthersReq;
import com.cool.store.request.TransferInvestmentManagerRequest;
import com.cool.store.service.InterviewService;
import com.cool.store.vo.interview.InterviewVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: IntentWorkFlowService

View File

@@ -74,13 +74,15 @@ public class InterviewWorkFlowService extends WorkFlowBaseService {
if (CollectionUtils.isEmpty(interviewBaseInfos)) {
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
LoginUserInfo operator = CurrentUserHolder.getUser();
HyPartnerInterviewDO interviewBaseInfo = interviewBaseInfos.get(0);
InterviewVO interviewInfo = hyPartnerInterviewPlanMapper.getInterviewInfo(String.valueOf(interviewBaseInfo.getInterviewPlanId()));
if(Integer.parseInt(WorkflowStatusEnum.INTERVIEW_2.getCode()) == interviewBaseInfo.getStatus()
&& StringUtils.isNotEmpty(interviewInfo.getRoomStatus())
&& String.valueOf(RoomStatus.WAIT_FOR_OPEN.getCode()).equals(interviewInfo.getRoomStatus())
&& StringUtils.isNotEmpty(interviewInfo.getFeishuCalendarId())
&& StringUtils.isNotEmpty(interviewInfo.getFeishuScheduleId())){
&& StringUtils.isNotEmpty(interviewInfo.getFeishuScheduleId())
&& interviewInfo.getInterviewerId().equals(operator.getUserId())){
// 原面试官日程删除
DeleteCalendarEventDTO deleteCalendarEventDTO = new DeleteCalendarEventDTO();
deleteCalendarEventDTO.setCalendarId(interviewInfo.getFeishuCalendarId());
@@ -100,7 +102,6 @@ public class InterviewWorkFlowService extends WorkFlowBaseService {
}
interviewService.rejectInterviewAndSuspendLine(interviewBaseInfo.getId(),interviewBaseInfo.getInterviewPlanId(),null);
//记录日志
LoginUserInfo operator = CurrentUserHolder.getUser();
RejectInterviewDTO log = RejectInterviewDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getUserId()).operateUsername(operator.getName()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.rejectRealReason(request.getRejectRealReason()).rejectPublicReason(request.getRejectPublicReason()).certifyFile(request.getCertifyFile()).build();
logService.recordBizLog(operator,request.getLineId(), OperateTypeEnum.REJECT_INTERVIEW,log);

View File

@@ -1,11 +1,26 @@
package com.cool.store.service.impl.workflow;
import com.cool.store.entity.HyPartnerInterviewDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.mapper.HyPartnerInterviewPlanMapper;
import com.cool.store.request.CloseFollowRequest;
import com.cool.store.request.EntrustOthersReq;
import com.cool.store.request.TransferInvestmentManagerRequest;
import com.cool.store.service.InterviewService;
import com.cool.store.vo.interview.InterviewVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: ReservationWorkFlowService
@@ -16,6 +31,15 @@ import org.springframework.stereotype.Service;
@Service
public class ReservationWorkFlowService extends WorkFlowBaseService {
@Autowired
private HyPartnerInterviewMapper hyPartnerInterviewMapper;
@Autowired
private HyPartnerInterviewPlanMapper hyPartnerInterviewPlanMapper;
@Autowired
private InterviewService interviewService;
@Override
public WorkflowStageEnum getWorkFlowStage() {
return WorkflowStageEnum.RESERVATION;
@@ -27,7 +51,25 @@ public class ReservationWorkFlowService extends WorkFlowBaseService {
}
@Override
public void transferInvestmentManager(TransferInvestmentManagerRequest request) {
log.info("转让招商经理~");
public void transferInvestmentManager(TransferInvestmentManagerRequest request) throws ApiException {
Long lineId = request.getLineId();
//根据线索id查询面试信息
List<HyPartnerInterviewDO> interviewBaseInfos = hyPartnerInterviewMapper.getInterviewBaseInfoListByLineIds(Arrays.asList(lineId));
if (CollectionUtils.isEmpty(interviewBaseInfos)) {
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
HyPartnerInterviewDO interviewBaseInfo = interviewBaseInfos.get(0);
InterviewVO interviewInfo = hyPartnerInterviewPlanMapper.getInterviewInfo(String.valueOf(interviewBaseInfo.getInterviewPlanId()));
if (null == interviewInfo) {
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
//还未提交面试预约就未创建面试信息,自然不存在转让面试官操作
if (!WorkflowStatusEnum.RESERVATION_0.getCode().equals(interviewBaseInfo.getStatus().toString())) {
EntrustOthersReq entrustOthersReq = new EntrustOthersReq();
entrustOthersReq.setInterviewPlanId(interviewInfo.getInterviewPlanId());
entrustOthersReq.setNewInterviewerId(request.getUserId());
entrustOthersReq.setPartnerLineId(interviewInfo.getPartnerLineId());
interviewService.entrustOthers(entrustOthersReq);
}
}
}

View File

@@ -26,7 +26,7 @@ public abstract class WorkFlowBaseService {
public abstract void endProcess(CloseFollowRequest request) throws ApiException;
/**
* 转让招商经理
* 转让招商经理(实际是转让面试官,转让招商经理的操作在前置已进行)
* @param request
*/
public abstract void transferInvestmentManager(TransferInvestmentManagerRequest request) throws ApiException;

View File

@@ -0,0 +1,56 @@
package com.cool.store.utils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.function.BiConsumer;
@Component
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
public class MybatisBatchUtils {
/**
* 每次处理500条
*/
private static final int BATCH_SIZE = 500;
@Resource
private SqlSessionFactory sqlSessionFactory;
/**
* 批量处理修改或者插入
*
* @param data 需要被处理的数据
* @param mapperClass Mybatis的Mapper类
* @param consumer 自定义处理逻辑
* @return int 影响的总行数
* @author renwd
*/
public <T, U> int batchInsertOrUpdate(List<T> data, Class<U> mapperClass, BiConsumer<T, U> consumer) {
int i = 1;
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
U mapper = sqlSession.getMapper(mapperClass);
int size = data.size();
for (T element : data) {
consumer.accept(element, mapper);
if ((i % BATCH_SIZE == 0) || i == size) {
sqlSession.flushStatements();
}
i++;
}
sqlSession.commit();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
sqlSession.close();
}
return i - 1;
}
}

View File

@@ -604,14 +604,15 @@ public class ExcelUtil<T> {
Map<Integer, List<String>> columnListMap = styleMap.get(row);
if (columnListMap.containsKey(sort)) {
List<String> list = columnListMap.get(sort);
list.addAll(Arrays.asList(styles));
List<String> arrList = new ArrayList<String>(Arrays.asList(styles));
list.addAll(arrList);
columnListMap.put(sort, list);
}else {
columnListMap.put(sort, Arrays.asList(styles));
columnListMap.put(sort, new ArrayList<String>(Arrays.asList(styles)));
}
} else {
styleMap.put(row, new HashMap<Integer, List<String>>() {{
put(sort, Arrays.asList(styles));
put(sort, new ArrayList<String>(Arrays.asList(styles)));
}});
}
}

View File

@@ -51,6 +51,7 @@ public class TokenValidateFilter implements Filter {
//TODO 800回调地址暂时不做验证
"/partner/pc/flow/qualificationReview/callback",
"/**/ecSync/ecToApplet/**",
"/**/ecSync/labelInfo/**",
"/partner/pc/websocket/**",
"/partner/pc/call/**");

View File

@@ -52,7 +52,7 @@ public class Swagger2Config {
.groupName(groupName)
.select()
.apis(this.scanBasePackage(packages))
.paths(PathSelectors.regex(".*/getPartnerIntentInfo|.*/queryPartnerClerkInfoList|.*/queryPartnerBaseInfo"))
//.paths(PathSelectors.regex(".*/getPartnerIntentInfo|.*/queryPartnerClerkInfoList|.*/queryPartnerBaseInfo"))
.build()
.globalOperationParameters(pars);
}

View File

@@ -37,12 +37,12 @@ public class CallController {
return ResponseResult.success(res);
}
@PostMapping("/finish/callback")
@ApiOperation("通话结束回调")
public ResponseResult callFinishBack(@RequestBody CallFinishBackReq request) throws ApiException {
callService.callFinishBack(request);
return ResponseResult.success();
}
// @PostMapping("/finish/callback")
// @ApiOperation("通话结束回调")
// public ResponseResult callFinishBack(@RequestBody CallFinishBackReq request) throws ApiException {
// callService.callFinishBack(request);
// return ResponseResult.success();
// }
@PostMapping("/record/callback")
@ApiOperation("录音上传回调")

View File

@@ -190,7 +190,7 @@ public class DeskController {
@ApiOperation("分配招商经理/批量分配招商经理")
public ResponseResult<Boolean> allocationInvestmentManager(@RequestBody AllocationInvestmentManagerRequest request){
return ResponseResult.success(hyPartnerLineInfoService.allocationInvestmentManager(CurrentUserHolder.getUser(),request.getLineIdList()));
return ResponseResult.success(hyPartnerLineInfoService.allocationInvestmentManager(CurrentUserHolder.getUser(),request.getUserId(),request.getLineIdList()));
}
@@ -202,7 +202,7 @@ public class DeskController {
@PostMapping(path = "/batchTransferInvestmentManager")
@ApiOperation("批量转让招商经理")
public ResponseResult<Boolean> batchTransferInvestmentManager(@RequestBody BatchTransferInvestmentManagerRequest request) throws ApiException {
public ResponseResult<List<BatchTransferVO>> batchTransferInvestmentManager(@RequestBody BatchTransferInvestmentManagerRequest request) throws ApiException {
return ResponseResult.success(hyPartnerLineInfoService.batchTransferInvestmentManager(CurrentUserHolder.getUser(),request ));
}

View File

@@ -2,6 +2,7 @@ package com.cool.store.controller;
import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.request.GetTagRequest;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.EcSyncService;
import com.cool.store.vo.InterviewScheduleInfoVO;
@@ -28,4 +29,10 @@ public class EcSyncController {
return ResponseResult.success(ecSyncService.ecToApplet(queryListData));
}
@PostMapping(path = "/labelInfo")
@ApiOperation("ec同步标签数据到小程序")
public ResponseResult<Boolean> labelInfo(@RequestBody List<GetTagRequest> getTagRequestList){
return ResponseResult.success(ecSyncService.labelInfo(getTagRequestList));
}
}

View File

@@ -280,4 +280,9 @@ public class TestController {
followTaskService.followTaskAnHourAgoRemind();
return ResponseResult.success();
}
@GetMapping("/initOpenArea")
public ResponseResult initOpenArea() {
return ResponseResult.success(openAreaService.addOpenArea());
}
}

View File

@@ -1,5 +1,5 @@
spring.application.name=hsay-partner-webb
spring.profiles.active=@profileActive@
spring.profiles.active=dev
server.port=31000
server.servlet.context-path=/partner/pc

View File

@@ -1,5 +1,5 @@
spring.application.name=hsay-partner-webc
spring.profiles.active=@profileActive@
spring.profiles.active=dev
server.port=30900
server.servlet.context-path=/partner/mini/program