Merge remote-tracking branch 'origin/cc_20230520_partner' into cc_20230520_partner

This commit is contained in:
zhangchenbiao
2023-06-29 09:41:54 +08:00
106 changed files with 2634 additions and 299 deletions

View File

@@ -0,0 +1,29 @@
package com.cool.store.http;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class UserSourceResponse {
private Integer code;
private String msg;
private List<ChannelSource> data;
@Data
@Accessors(chain = true)
public static class ChannelSource{
private String createTime;
private Long id;
private String name;
private Integer userId;
}
}

View File

@@ -0,0 +1,93 @@
package com.cool.store.job;
import cn.hutool.core.date.DateUtil;
import com.cool.store.entity.SyncEcCustomerDO;
import com.cool.store.mapper.HyPartnerLineInfoMapper;
import com.cool.store.mapper.HyPartnerUserInfoMapper;
import com.cool.store.sdk.ec.EcClient;
import com.cool.store.sdk.ec.request.SyncEcCustomerRequest;
import com.cool.store.service.EcSyncService;
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.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class EcSyncDataJob {
@XxlJob("SyncUserSourceJob")
public void syncUserSourceJob() {
XxlJobHelper.log("-------------------------------定时同步客户来源开始-------------------------------");
syncUserSourceExecute();
XxlJobHelper.log("-------------------------------定时同步客户来源结束-------------------------------");
XxlJobHelper.handleSuccess();
}
@Value("${ec.baseUrl:null}")
private String baseUrl;
@XxlJob("SyncAppletToEcJob")
public void syncAppletToEcJob() {
XxlJobHelper.log("-------------------------------定时同步小程序数据到ec开始-------------------------------");
syncAppletToEcExecute();
XxlJobHelper.log("-------------------------------定时同步小程序数据到ec结束-------------------------------");
XxlJobHelper.handleSuccess();
}
@Resource
private EcSyncService ecSyncService;
@Resource
private HyPartnerUserInfoMapper hyPartnerUserInfoMapper;
//定时同步用户来源开始
private void syncUserSourceExecute() {
ecSyncService.getChannelSource();
}
private final Integer count=50;
//定时同步小程序数据到ec
private void syncAppletToEcExecute() {
//获取总数
int size = hyPartnerUserInfoMapper.selectByHourDateCount(getHourDayDate(-5, 0), DateUtil.now());
//执行数
int counts = size / count;
//取余如果大于1就再加一
int yu = size % count;
if (yu > 0) {
counts += 1;
}
for (int i = 1; i <= counts; i++) {
List<SyncEcCustomerDO> list = hyPartnerUserInfoMapper.selectByHourDate(getHourDayDate(-5, 0), DateUtil.now(),count * (i - 1),count);
SyncEcCustomerRequest syncEcCustomerRequest = new SyncEcCustomerRequest();
syncEcCustomerRequest.setParameter(list);
EcClient ecClient = new EcClient();
ecClient.exec(baseUrl,syncEcCustomerRequest);
}
}
private static String getHourDayDate(int hour, int day) {
Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.HOUR, hour);
calendar.add(Calendar.DAY_OF_MONTH, day);
Date twoDay = calendar.getTime();
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(twoDay);
}
}

View File

@@ -0,0 +1,37 @@
package com.cool.store.sdk.ec;
import com.alibaba.fastjson.JSON;
import com.cool.store.sdk.ec.core.EcRequest;
import com.cool.store.sdk.ec.core.EcResponse;
import com.cool.store.utils.Get;
import com.cool.store.utils.MapUtil;
import com.cool.store.utils.Post;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import java.util.HashMap;
public class EcClient {
@SneakyThrows
public <T extends EcResponse> T exec(String baseUrl,EcRequest<T> request) {
String apiUrl = request.getApiUrl();
// if (accessToken != null) {
// apiUrl += "?token=" + accessToken;
// }
String method = request.getMethod();
String result = "";
if (method.equals("GET")) {
result = Get.send(baseUrl+apiUrl, MapUtil.entityToUrlParam(request.getParameter()));
} else {
HashMap<String,String> headers = new HashMap<>(1);
headers.put("Content-Type", "application/json");
result = Post.send(baseUrl+apiUrl, JSON.toJSONString(request.getParameter()), headers);
}
return JSON.parseObject(result, request.getResponseClass());
}
}

View File

@@ -0,0 +1,24 @@
package com.cool.store.sdk.ec.bo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author hxd
*/
@Data
@Accessors(chain = true)
public class ChangeFollowUserBo {
//跟进人
private Long crmId;
private String username;
private String mobile;
private Long followUserId;
//1:更新跟进人 2创建跟进人并更改跟进人
private Integer type;
}

View File

@@ -0,0 +1,9 @@
package com.cool.store.sdk.ec.bo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class SyncEcCustomerBo {
}

View File

@@ -0,0 +1,16 @@
package com.cool.store.sdk.ec.bo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class UpdateCustomerBo {
private String username;
private String mobile;
private Long crmId;
}

View File

@@ -0,0 +1,28 @@
package com.cool.store.sdk.ec.core;
/**
* @author hxd
*/
abstract public class EcRequest <T extends EcResponse> implements EcRequestI<T> {
private Object parameter;
@Override
public String getMethod() {
return "POST";
}
@Override
public Object getParameter() {
return parameter;
}
public void setParameter(Object parameter) {
this.parameter = parameter;
}
@Override
public Class<T> getResponseClass() {
return null;
}
}

View File

@@ -0,0 +1,28 @@
package com.cool.store.sdk.ec.core;
public interface EcRequestI<T extends EcResponse> {
/**
* 地址
* @return -
*/
String getApiUrl();
/**
* 方法
* @return -
*/
String getMethod();
/**
* 设置参数
* @return -
*/
Object getParameter();
/**
* 响应类类型
* @return -
*/
Class<T> getResponseClass();
}

View File

@@ -0,0 +1,14 @@
package com.cool.store.sdk.ec.core;
import lombok.Data;
@Data
public class EcResponse {
private Integer code;
private String msg;
}

View File

@@ -0,0 +1,19 @@
package com.cool.store.sdk.ec.request;
import com.cool.store.sdk.ec.core.EcRequest;
import com.cool.store.sdk.ec.response.ChangeFollowUserResponse;
public class ChangeFollowUserRequest extends EcRequest<ChangeFollowUserResponse> {
@Override
public String getApiUrl() {
return "/ec/selectChangeUser";
}
@Override
public Class<ChangeFollowUserResponse> getResponseClass() {
return ChangeFollowUserResponse.class;
}
}

View File

@@ -0,0 +1,26 @@
package com.cool.store.sdk.ec.request;
import com.cool.store.sdk.ec.core.EcRequest;
import com.cool.store.sdk.ec.response.SyncEcCustomerResponse;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author hxd
*/
@Data
@Accessors(chain = true)
public class SyncEcCustomerRequest extends EcRequest<SyncEcCustomerResponse> {
@Override
public String getApiUrl() {
return "/ec/appletToEc";
}
@Override
public Class<SyncEcCustomerResponse> getResponseClass() {
return SyncEcCustomerResponse.class;
}
}

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.UpdateCustomerResponse;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class UpdateCustomerRequest extends EcRequest<UpdateCustomerResponse> {
@Override
public String getApiUrl() {
return "/ec/updateCustomer";
}
@Override
public Class<UpdateCustomerResponse> getResponseClass() {
return UpdateCustomerResponse.class;
}
}

View File

@@ -0,0 +1,15 @@
package com.cool.store.sdk.ec.response;
import com.cool.store.sdk.ec.core.EcResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author hxd
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ChangeFollowUserResponse extends EcResponse {
}

View File

@@ -0,0 +1,16 @@
package com.cool.store.sdk.ec.response;
import com.cool.store.sdk.ec.core.EcResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @author hxd
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class SyncEcCustomerResponse extends EcResponse {
}

View File

@@ -0,0 +1,16 @@
package com.cool.store.sdk.ec.response;
import com.cool.store.sdk.ec.core.EcResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @author hxd
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class UpdateCustomerResponse extends EcResponse {
}

View File

@@ -0,0 +1,13 @@
package com.cool.store.service;
import com.cool.store.exception.ApiException;
import com.cool.store.request.GetTipsInfoReq;
/**
* @Author: young.yu
* @Date: 2023-06-28 21:34
* @Description:
*/
public interface CommonService {
String getTipsInfo(GetTipsInfoReq request) throws ApiException;
}

View File

@@ -0,0 +1,11 @@
package com.cool.store.service;
import com.cool.store.request.CustomerInfoRequest;
import java.util.List;
public interface EcSyncService {
boolean ecToApplet(List<CustomerInfoRequest> queryListData);
void getChannelSource();
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.service;
import com.cool.store.exception.ApiException;
import com.cool.store.vo.InterviewDetailInfoVO;
import com.cool.store.vo.PartnerInterviewInfoVO;
import com.github.pagehelper.PageInfo;
@@ -46,7 +47,7 @@ public interface HyPartnerInterviewPlanService {
* updateInterviewOverTime
* @return
*/
void updateInterviewOverTime();
void updateInterviewOverTime() throws ApiException;
/**
* 批量打开十分钟之内开始的面试房间
@@ -60,5 +61,5 @@ public interface HyPartnerInterviewPlanService {
* updateInterviewOverTime
* @return
*/
void updateAbsentInterview();
void updateAbsentInterview() throws ApiException;
}

View File

@@ -6,6 +6,7 @@ import com.cool.store.exception.ApiException;
import com.cool.store.request.CloseFollowRequest;
import com.cool.store.request.LineRequest;
import com.cool.store.request.PrivateSeaLineListRequest;
import com.cool.store.request.TransferInvestmentManagerRequest;
import com.cool.store.vo.*;
import com.cool.store.vo.interview.InterviewVO;
import com.github.pagehelper.PageInfo;
@@ -57,7 +58,7 @@ public interface HyPartnerLineInfoService {
* @param lineId
* @return
*/
Boolean transferInvestmentManager(LoginUserInfo user,String userId,String userName,Long lineId);
Boolean transferInvestmentManager(LoginUserInfo user, TransferInvestmentManagerRequest request) throws ApiException;
/**
* 分配招商经理
@@ -82,7 +83,7 @@ public interface HyPartnerLineInfoService {
* @param joinReason
* @return
*/
Boolean joinBlackList(LoginUserInfo user, Long lineId, Integer status, String joinReason);
Boolean joinBlackList(LoginUserInfo user, Long lineId, Integer status, String joinReason) throws ApiException;
/**
* 移除黑名单
@@ -99,7 +100,7 @@ public interface HyPartnerLineInfoService {
* @param closeFollowRequest
* @return
*/
Boolean closeOrPassFollow(LoginUserInfo user,CloseFollowRequest closeFollowRequest);
Boolean closeOrPassFollow(LoginUserInfo user,CloseFollowRequest closeFollowRequest) throws ApiException;
/**
* 公海线索

View File

@@ -68,4 +68,5 @@ public interface InterviewService {
public String getInterviewerByPartner(String partnerId,String lineId)throws ApiException;
public void rejectInterviewAndSuspendLine(Long iterviewId,Long interviewPlanId,String certifyFile);
}

View File

@@ -0,0 +1,16 @@
package com.cool.store.service;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.vo.PartnerUserInfoVO;
/**
* @Author: young.yu
* @Date: 2023-06-28 00:10
* @Description:
*/
public interface LogService {
public void recordBizLog(LoginUserInfo operator, Long lineId, OperateTypeEnum operateTypeEnum, Object logData);
public void recordPartnerBizLog(PartnerUserInfoVO operator , Long lineId, OperateTypeEnum operateTypeEnum, Object logData);
}

View File

@@ -0,0 +1,20 @@
package com.cool.store.service;
import com.cool.store.entity.MDMAreaDO;
import java.util.List;
public interface MDMAreaService {
/**
* 获取省级数据
*/
List<MDMAreaDO> getProvince();
/**
* 获取子级地区
* @param code 父级 code
*/
List<MDMAreaDO> getSonArea(String code);
}

View File

@@ -1,6 +1,7 @@
package com.cool.store.service;
import com.cool.store.dto.partner.EnterInterviewDto;
import com.cool.store.dto.partner.LineQueryInterviewDto;
import com.cool.store.exception.ApiException;
import com.cool.store.request.ModifyInterviewTimeReq;
import com.cool.store.vo.EnterInterviewVO;
@@ -16,6 +17,8 @@ public interface PartnerInterviewService {
*/
PartnerInterviewInfoVO queryByPartnerId(String partnerId);
PartnerInterviewInfoVO queryByPartnerLineId(LineQueryInterviewDto request) throws ApiException;
/**
* 进入面试间的方法
* 修改一些面试状态
@@ -35,4 +38,6 @@ public interface PartnerInterviewService {
*/
void modifyInterviewTime(ModifyInterviewTimeReq request) throws ApiException;
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.service;
import com.cool.store.dto.trtc.callback.VideoCallBackDTO;
import com.cool.store.request.TRTCVideoCallBackReq;
public interface TRTCVideoService {
@@ -7,6 +8,8 @@ public interface TRTCVideoService {
/**
* 音视频上传成功后的回调处理
*/
void handleVideoCallBack(TRTCVideoCallBackReq req);
// void handleVideoCallBack(TRTCVideoCallBackReq req);
void handleVideoCallBack(VideoCallBackDTO videoCallBackDTO);
}

View File

@@ -18,7 +18,7 @@ public interface WorkFlowService {
* @param workflowStage
* @param request
*/
void endProcess(WorkflowStageEnum workflowStage, CloseFollowRequest request);
void endProcess(WorkflowStageEnum workflowStage, CloseFollowRequest request) throws ApiException;
/**
* 转让招商经理

View File

@@ -0,0 +1,129 @@
package com.cool.store.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.dto.log.LogFieldDTO;
import com.cool.store.entity.HyPartnerCertificationInfoDO;
import com.cool.store.entity.HyPartnerLineInfoDO;
import com.cool.store.entity.HyPartnerTaskInfoLogDO;
import com.cool.store.enums.OperateLogFieldValueEnum;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.mapper.HyPartnerCertificationInfoMapper;
import com.cool.store.mapper.HyPartnerLineInfoMapper;
import com.cool.store.mapper.HyPartnerTaskInfoLogMapper;
import com.cool.store.request.GetTipsInfoReq;
import com.cool.store.service.CommonService;
import com.cool.store.utils.StringUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* @Author: young.yu
* @Date: 2023-06-28 21:35
* @Description:
*/
@Service
public class CommonServiceImpl implements CommonService {
@Autowired
private HyPartnerTaskInfoLogMapper hyPartnerTaskInfoLogMapper;
@Autowired
private HyPartnerLineInfoMapper hyPartnerLineInfoMapper;
@Autowired
private HyPartnerCertificationInfoMapper hyPartnerCertificationInfoMapper;
@Override
public String getTipsInfo(GetTipsInfoReq request) throws ApiException {
List<HyPartnerLineInfoDO> lineInfoList = hyPartnerLineInfoMapper.getHyPartnerLineInfoListByIds(Arrays.asList(Long.parseLong(request.getPartnerLineId())));
if (CollectionUtils.isEmpty(lineInfoList)) {
return null;
}
HyPartnerLineInfoDO hyPartnerLineInfoDO = lineInfoList.get(0);
String workflowStage = hyPartnerLineInfoDO.getWorkflowStage();
String workflowStatus = hyPartnerLineInfoDO.getWorkflowStatus();
Long partnerLineId = hyPartnerLineInfoDO.getId();
if (workflowStage.equals(WorkflowStageEnum.INTERVIEW.getCode()) && workflowStatus.equals(WorkflowStatusEnum.INTERVIEW_2.getCode())) {
return getInterviewTips(partnerLineId, OperateTypeEnum.INTERVIEW_APPOINTMENT, "提交面试预约时间");
} else if (workflowStage.equals(WorkflowStageEnum.INTERVIEW.getCode()) && workflowStatus.equals(WorkflowStatusEnum.INTERVIEW_3.getCode())) {
String tips = getInterviewTips(partnerLineId, OperateTypeEnum.MODIFY_INTERVIEW_TIME, "");
if (StringUtils.isNotEmpty(tips)) {
return tips + ("修改面试预约时间");
} else {
return getInterviewTips(partnerLineId, OperateTypeEnum.INTERVIEW_APPOINTMENT, "提交面试预约时间");
}
} else if (workflowStage.equals(WorkflowStageEnum.INTERVIEW.getCode()) && workflowStatus.equals(WorkflowStatusEnum.INTERVIEW_4.getCode())) {
return getInterviewTips(partnerLineId, OperateTypeEnum.FINISH_INTERVIEW, "结束面试");
}else if (workflowStage.equals(WorkflowStageEnum.INTERVIEW.getCode()) && workflowStatus.equals(WorkflowStatusEnum.INTERVIEW_5.getCode())) {
HyPartnerCertificationInfoDO partnerCertificationInfoDO = hyPartnerCertificationInfoMapper.selectByPartnerLineId(partnerLineId);
String intentionContractNo = null;
if(partnerCertificationInfoDO != null){
intentionContractNo = partnerCertificationInfoDO.getIntentionContractNo();
}
return getInterviewTips(partnerLineId, OperateTypeEnum.FINISH_INTERVIEW, "发起加盟商资质审核|"+intentionContractNo);
}else if (workflowStage.equals(WorkflowStageEnum.INTERVIEW.getCode()) && workflowStatus.equals(WorkflowStatusEnum.INTERVIEW_6.getCode())) {
HyPartnerCertificationInfoDO partnerCertificationInfoDO = hyPartnerCertificationInfoMapper.selectByPartnerLineId(partnerLineId);
String intentionContractNo = null;
if(partnerCertificationInfoDO != null){
intentionContractNo = partnerCertificationInfoDO.getIntentionContractNo();
}
return getInterviewTips(partnerLineId, OperateTypeEnum.FINISH_INTERVIEW, "审核通过|"+intentionContractNo);
}
return null;
}
public String getInterviewTips(Long partnerLineId, OperateTypeEnum operateTypeEnum, String action) {
StringBuffer sb = new StringBuffer();
sb.append(StringUtil.REPLACE_0)
.append(" ")
.append(StringUtil.REPLACE_1)
.append("").append(StringUtil.REPLACE_2).append(" ").append(action);
String content = sb.toString();
return getSuitableTipsInfo(content, partnerLineId,
operateTypeEnum,
OperateLogFieldValueEnum.OPERATE_USER_NAME.getCode(),
OperateLogFieldValueEnum.MOBILE.getCode(),
OperateLogFieldValueEnum.OPERATE_TIME.getCode());
}
public String getSuitableTipsInfo(String content, Long partnerLineId, OperateTypeEnum operateTypeEnum, String... replaceKeys) {
List<HyPartnerTaskInfoLogDO> hyPartnerTaskInfoLogDOS = hyPartnerTaskInfoLogMapper.selectByPartnerLineIdAndOperateType(partnerLineId, operateTypeEnum.getCode());
if (CollectionUtils.isEmpty(hyPartnerTaskInfoLogDOS)) {
return null;
}
HyPartnerTaskInfoLogDO hyPartnerTaskInfoLogDO = hyPartnerTaskInfoLogDOS.get(0);
String fieldCopy = hyPartnerTaskInfoLogDO.getFieldCopy();
List<LogFieldDTO> logFieldDTOS = JSONObject.parseArray(fieldCopy, LogFieldDTO.class);
List<String> params = new ArrayList<>();
for (String replaceKey : replaceKeys) {
String value = "";
Optional<LogFieldDTO> logFieldDTOOptional = logFieldDTOS.stream().filter(l -> l.getCode().equals(replaceKey)).findFirst();
if (logFieldDTOOptional.isPresent()) {
value = logFieldDTOOptional.get().getValue();
try {
value = DateUtil.format(DateUtil.parseDateTime(value), "yyyy/MM/dd HH:mm:ss");
} catch (Exception e) {
//异常代表不是时间格式,不做处理
}
}
params.add(value);
}
return MessageFormat.format(content, params.toArray());
}
}

View File

@@ -0,0 +1,278 @@
package com.cool.store.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyPartnerBaseInfoDAO;
import com.cool.store.dao.HyPartnerLineInfoDAO;
import com.cool.store.dao.HyPartnerUserInfoDAO;
import com.cool.store.entity.*;
import com.cool.store.enums.LineStatusEnum;
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.HyPartnerUserChannelMapper;
import com.cool.store.request.CustomerInfoRequest;
import com.cool.store.sdk.ec.EcClient;
import com.cool.store.sdk.ec.bo.ChangeFollowUserBo;
import com.cool.store.sdk.ec.bo.UpdateCustomerBo;
import com.cool.store.sdk.ec.request.ChangeFollowUserRequest;
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.utils.Post;
import com.cool.store.utils.StringUtil;
import com.cool.store.utils.UUIDUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
public class EcSyncServiceImpl implements EcSyncService {
@Value("${ec.baseUrl:null}")
private String baseUrl;
@Resource
private HyPartnerLineInfoDAO hyPartnerLineInfoDAO;
@Resource
private HyPartnerBaseInfoDAO hyPartnerBaseInfoDAO;
@Resource
private HyPartnerUserInfoDAO hyPartnerUserInfoDAO;
@Resource
private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private HyPartnerUserChannelMapper hyPartnerUserChannelMapper;
@Override
public boolean ecToApplet(List<CustomerInfoRequest> queryListData) {
for (CustomerInfoRequest customerInfoItem : queryListData) {
try {
Thread.sleep(500L);
insertSelectiveSync(customerInfoItem);
} catch (Exception e) {
e.printStackTrace();
sendFeiShuRobotMessage("推送:"+JSONObject.toJSONString(e),"27243d49-97ca-4981-8aec-7c3bf84eb660");
}
}
return false;
}
@Override
public void getChannelSource() {
String s = HttpUtil.get(baseUrl+"/ec/getChannelSource");
UserSourceResponse userSourceResponse = JSONObject.parseObject(s, UserSourceResponse.class);
for (UserSourceResponse.ChannelSource channelSource : userSourceResponse.getData()) {
Long id = channelSource.getId();
HyPartnerUserChannelDO selectByChannel = hyPartnerUserChannelMapper.selectByChannelId(id);
HyPartnerUserChannelDO hyPartnerUserChannel = new HyPartnerUserChannelDO();
hyPartnerUserChannel.setChannelId(channelSource.getId()).setChannelName(channelSource.getName());
//有就更新 没有插入
if (ObjectUtil.isNotNull(selectByChannel)) {
hyPartnerUserChannel.setUpdateTime(new Date()).setId(selectByChannel.getId());
hyPartnerUserChannelMapper.updateByPrimaryKeySelective(hyPartnerUserChannel);
}else {
hyPartnerUserChannel.setCreateTime(new Date());
hyPartnerUserChannelMapper.insertSelective(hyPartnerUserChannel);
}
}
}
/**
* 同步ec数据到表中 同时将部分数据同步到ec
*
* @param customerInfoItem
*/
@Transactional(rollbackFor = Exception.class)
public void insertSelectiveSync(CustomerInfoRequest customerInfoItem) throws ApiException {
if (StringUtil.isNotEmpty(customerInfoItem.getMobile())) {
customerInfoItem.setMobile(customerInfoItem.getMobile().split(" ")[1]);
}
//获取客户来源id
String channel = customerInfoItem.getChannel();
HyPartnerUserChannelDO hyPartnerUserChannelDO = hyPartnerUserChannelMapper.selectByChannelName(channel);
Long channelId =null;
if (StringUtil.isNotEmpty(channel)) {
if (ObjectUtil.isNull(hyPartnerUserChannelDO)||ObjectUtil.isNull(hyPartnerUserChannelDO.getId())) {
getChannelSource();
HyPartnerUserChannelDO channelDO = hyPartnerUserChannelMapper.selectByChannelName(channel);
channelId=channelDO.getId();
}else {
HyPartnerUserChannelDO channelDO = hyPartnerUserChannelMapper.selectByChannelName(channel);
channelId=channelDO.getId();
}
}
String newPartnerId = UUIDUtils.get32UUID();
HyPartnerUserInfoDO resultUser = new HyPartnerUserInfoDO();
resultUser.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile());
HyPartnerLineInfoDO resultLine = new HyPartnerLineInfoDO();
String followUserName = customerInfoItem.getFollowUserName();
String followUserMobile = customerInfoItem.getFollowUserMobile();
//传递过来有跟进人的情况下查询跟进人是否存在
if (StringUtil.isNotEmpty(followUserMobile)&&StringUtil.isNotEmpty(followUserMobile)) {
String userId = enterpriseUserDAO.selectByMobile("+86"+followUserMobile);
if (StringUtil.isEmpty(userId)) {
// 给飞书群发送消息 跟进人找不到
sendFeiShuRobotMessage("推送:飞书架构中找不到该用户:【" + followUserName + "】,该用户电话号码为:" + followUserMobile,"27243d49-97ca-4981-8aec-7c3bf84eb660");
throw new ApiException("飞书架构中找不到该用户:【" + followUserName + "】,该用户电话号码为:" + followUserMobile);
}
resultLine.setInvestmentManager(userId);
}
resultLine.setWorkflowStage(WorkflowStageEnum.INTENT.getCode()).setUserChannelId(Convert.toInt(channelId))
.setLineStatus(StringUtil.isEmpty(customerInfoItem.getFollowUserName()) ? LineStatusEnum.PUBLIC_SEAS.getCode() : LineStatusEnum.PRIVATE_SEAS.getCode());
HyPartnerBaseInfoDO resultBase = new HyPartnerBaseInfoDO();
resultBase.setUsername(customerInfoItem.getName()).setMobile(customerInfoItem.getMobile());
HyPartnerUserInfoDO newUserInfo = hyPartnerUserInfoDAO.selectByMobile(resultUser.getMobile());
EcClient ecClient=new EcClient();
//有就更新ec没有就插入
if (newUserInfo != null) {
// EC与沪姨合伙人同时存在的线索用户但用户姓名不同将沪姨合伙人线索姓名同步至EC覆盖原EC线索姓名
if (!newUserInfo.getUsername().equals(resultUser.getUsername())) {
UpdateCustomerRequest updateUserRequest=new UpdateCustomerRequest();
UpdateCustomerBo updateCustomerBo = new UpdateCustomerBo();
updateCustomerBo.setUsername(newUserInfo.getUsername()).setMobile(newUserInfo.getMobile()).setCrmId(customerInfoItem.getCrmId());
updateUserRequest.setParameter(updateCustomerBo);
UpdateCustomerResponse updateUserExec = ecClient.exec(baseUrl,updateUserRequest);
}
String oldPartnerId = newUserInfo.getPartnerId();
//线索表
HyPartnerLineInfoDO partnerLine = hyPartnerLineInfoDAO.getByPartnerId(oldPartnerId);
if (partnerLine != null) {
// EC与沪姨合伙人同时存在的线索用户但存在不同的跟进人将沪姨合伙人跟进人信息同步至EC覆盖原EC跟进人信息
if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) {
if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())) {
resultLine.setId(partnerLine.getId()).setUpdateTime(new Date());
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(resultLine);
}
}else {
EnterpriseUserDO enterpriseUser = enterpriseUserDAO.getUserInfoById(partnerLine.getInvestmentManager());
enterpriseUser.setMobile(getNoWith86Number(enterpriseUser.getMobile()));
//电话相同但是名字不同
if (enterpriseUser.getMobile().equals(followUserMobile) && !enterpriseUser.getName().equals(followUserName)) {
ChangeFollowUserRequest changeFollowUserRequest = new ChangeFollowUserRequest();
ChangeFollowUserBo changeFollowUserBo = new ChangeFollowUserBo();
changeFollowUserBo.setFollowUserId(customerInfoItem.getLastFollowUserId()).setCrmId(customerInfoItem.getCrmId())
.setType(1).setUsername(enterpriseUser.getName()).setMobile(enterpriseUser.getMobile());
changeFollowUserRequest.setParameter(changeFollowUserBo);
ChangeFollowUserResponse changeFollowUserExec = ecClient.exec(baseUrl,changeFollowUserRequest);
}
//电话不同
if (!enterpriseUser.getMobile().equals(followUserMobile)) {
ChangeFollowUserRequest changeFollowUserRequest = new ChangeFollowUserRequest();
ChangeFollowUserBo changeFollowUserBo = new ChangeFollowUserBo();
changeFollowUserBo.setFollowUserId(customerInfoItem.getLastFollowUserId()).setCrmId(customerInfoItem.getCrmId())
.setType(2).setUsername(enterpriseUser.getName()).setMobile(enterpriseUser.getMobile());
changeFollowUserRequest.setParameter(changeFollowUserBo);
ChangeFollowUserResponse changeFollowUserExec = ecClient.exec(baseUrl,changeFollowUserRequest);
}
}
//base表
HyPartnerBaseInfoDO partnerIdAndLine = hyPartnerBaseInfoDAO.getByPartnerIdAndLineId(partnerLine.getPartnerId(), partnerLine.getId());
if (partnerIdAndLine == null) {
resultBase.setPartnerId(newPartnerId).setPartnerLineId(partnerLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date());
hyPartnerBaseInfoDAO.insertSelective(resultBase);
}
} else {
resultLine.setPartnerId(newPartnerId).setCreateTime(new Date());
hyPartnerLineInfoDAO.insertSelective(resultLine);
resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date());
hyPartnerBaseInfoDAO.insertSelective(resultBase);
}
} else {
resultUser.setPartnerId(newPartnerId).setCreateTime(new Date());
hyPartnerUserInfoDAO.insertSelective(resultUser);
resultLine.setPartnerId(newPartnerId).setCreateTime(new Date());
hyPartnerLineInfoDAO.insertSelective(resultLine);
resultBase.setPartnerId(newPartnerId).setPartnerLineId(resultLine.getId()).setStatus(Integer.valueOf(WorkflowStatusEnum.INTENT_0.getCode())).
setCreateTime(new Date());
hyPartnerBaseInfoDAO.insertSelective(resultBase);
}
}
/**
* 得到不带86开头的号码
*
* @param number
* @return
*/
public static String getNoWith86Number(String number) {
String regular = number;
if (StringUtils.isNotBlank(regular)) {
// 去掉+号
while (regular.startsWith("+")) {
regular = regular.substring(1);
}
// 号码以0开始,去掉前缀
while (regular.startsWith("0")) {
regular = regular.substring(1);
}
// 号码以86开始,去掉前缀
while (regular.startsWith("86")) {
regular = regular.substring(2);
}
// 号码以0开始去掉前缀
while (regular.startsWith("0")) {
regular = regular.substring(1);
}
}
return regular;
}
/**
* 发送飞书机器人
*
* @param text
* @param token
* @return
*/
public String sendFeiShuRobotMessage(String text, String token) {
HashMap<String, Object> map = new HashMap<>(4);
HashMap<String, String> textMap = new HashMap<String, String>(4);
textMap.put("text", text);
map.put("content", textMap);
map.put("msg_type", "text");
String body = JSON.toJSONString(map);
String send = "";
try {
send = Post.send("https://open.feishu.cn/open-apis/bot/v2/hook/" + token, body, new HashMap<String, String>(4) {{
put("Content-Type", "application/json");
}});
} catch (IOException e) {
e.printStackTrace();
}
return send;
}
}

View File

@@ -83,6 +83,9 @@ public class EnterpriseUserServiceImpl implements EnterpriseUserService {
if (CommonConstants.TRANSFER.equals(type)){
enterpriseUserDOS = enterpriseUserDAO.searchUserByRegionIdsAndKeyword(new ArrayList<>(list), keyword, null);
}
if (CollectionUtils.isEmpty(enterpriseUserDOS)){
enterpriseUserDOS.add(userInfo);
}
return EnterpriseUserSingleInfoVO.convertVO(enterpriseUserDOS);
}

View File

@@ -6,12 +6,18 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyInterviewDAO;
import com.cool.store.dto.log.CreateQualifyVerifyDTO;
import com.cool.store.dto.log.ReInterviewDTO;
import com.cool.store.dto.mdm.AccessTokenDTO;
import com.cool.store.dto.response.MDMResultDTO;
import com.cool.store.entity.*;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
@@ -27,10 +33,8 @@ import com.cool.store.request.RpcGetMdmTokenReq;
import com.cool.store.request.data.flow.KeyText;
import com.cool.store.request.data.flow.SkrRelshipProve;
import com.cool.store.service.FlowService;
import com.cool.store.utils.PDFUtils;
import com.cool.store.utils.PassLetterUtils;
import com.cool.store.utils.RedisUtilPool;
import com.cool.store.utils.RestTemplateUtil;
import com.cool.store.service.LogService;
import com.cool.store.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -90,6 +94,8 @@ public class FlowServiceImpl implements FlowService {
@Autowired
private HyInterviewDAO interviewDAO;
@Autowired
private LogService logService;
@Override
@Transactional
public void createQualifyVerify(CreateQualifyVerifyReq request) throws ApiException, IOException {
@@ -181,20 +187,7 @@ public class FlowServiceImpl implements FlowService {
partnerCertificationInfoDO.setPartnerId(request.getPartnerId());
partnerCertificationInfoDO.setPartnerLineId(Long.valueOf(request.getLineId()));
partnerCertificationInfoDO.setPartnerInterviewId(Long.valueOf(request.getInterviewId()));
partnerCertificationInfoDO.setPartnership(String.valueOf(request.getPartnership()));
partnerCertificationInfoDO.setWantSignTime(DateUtil.parse(request.getWantSignTime()));
partnerCertificationInfoDO.setPartnerFee(request.getPartnerFee().toString());
partnerCertificationInfoDO.setSecurityFund(request.getSecurityFund().toString());
partnerCertificationInfoDO.setTechnicalServiceFee(request.getTechnicalServiceFee().toString());
partnerCertificationInfoDO.setIntentionMoney(request.getIntentionMoney().toString());
partnerCertificationInfoDO.setIntentionSignerUsername(request.getIntentionSignerUsername());
partnerCertificationInfoDO.setIntentionSignerMobile(request.getIntentionSignerMobile());
partnerCertificationInfoDO.setIntentionEdu(request.getIntentionEdu().toString());
partnerCertificationInfoDO.setRealControlUsername(request.getRealControlUsername());
partnerCertificationInfoDO.setRealControlIdcard(request.getRealControlIdcard());
partnerCertificationInfoDO.setSignerRealControlRelation(request.getSignerRealControlRelation().toString());
partnerCertificationInfoDO.setSignerOtherRealControlRelation(request.getSignerOtherRealControlRelation());
partnerCertificationInfoDO.setSignerRealControlRelationCert(request.getSignerRealControlRelationCert().toString());
partnerCertificationInfoDO.setCertificationInfoRecordJson(JSONObject.toJSONString(request));
partnerCertificationInfoDO.setCreateTime(new Date());
partnerCertificationInfoDO.setUpdateTime(new Date());
//set 资质审核流程id
@@ -207,8 +200,12 @@ public class FlowServiceImpl implements FlowService {
hyPartnerInterviewDO.setUpdateTime(new Date());
//更新面试信息
//更新面试状态
hyPartnerInterviewDO.setStatus(null);
interviewDAO.updateInterviewWorkflowStatus(request.getInterviewPlanId(), WorkflowStatusEnum.INTERVIEW_5);
//获取当前操作人
LoginUserInfo operator = CurrentUserHolder.getUser();
hyPartnerInterviewDO.setRecorder(operator.getUserId());
hyPartnerInterviewDO.setRecordTime(new Date());
hyPartnerInterviewDO.setAuthCode(authCode);
hyPartnerInterviewMapper.updateByPrimaryKeySelective(hyPartnerInterviewDO);
@@ -219,6 +216,10 @@ public class FlowServiceImpl implements FlowService {
hyPartnerLineInfoDO.setDevelopmentDirector(request.getDevtDirectorId());
hyPartnerLineInfoMapper.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
}
//记录日志
CreateQualifyVerifyDTO log = CreateQualifyVerifyDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getUserId()).operateUsername(operator.getName()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.summary(request.getSummary()).qualiVerifyContent(JSON.toJSONString(partnerCertificationInfoDO)).build();
logService.recordBizLog(operator,hyPartnerInterviewDO.getPartnerLineId(), OperateTypeEnum.CREATE_QUALIFYVERIFY,log);
}
@Override
@@ -226,7 +227,7 @@ public class FlowServiceImpl implements FlowService {
public void qualificationCallback(QualificationCallbackReq request) {
log.info("MDM800审批成功回调request{}", JSONObject.toJSONString(request));
//1. 信息是否完整
if (null == request.getSequenceStatus() || "".equals(request.getSequenceStatus())) {
if (null == request.getInstanceStatus() || "".equals(request.getInstanceStatus())) {
log.error("MDM回调入参缺失request{}", JSON.toJSONString(request));
throw new ServiceException("MDM回调错误");
}
@@ -237,7 +238,7 @@ public class FlowServiceImpl implements FlowService {
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
//审核通过
if ("FINISHED".equals(request.getSequenceStatus())) {
if ("FINISHED".equals(request.getInstanceStatus())) {
//更新面试状态
interviewDAO.updateInterviewWorkflowStatus(interviewPlanId, WorkflowStatusEnum.INTERVIEW_6);
//2. 准备需要的信息
@@ -258,8 +259,9 @@ public class FlowServiceImpl implements FlowService {
Date passDate = new Date(request.getModifiedTime());
//3. 生成通过函并修改数据库相关信息
genPassLetterAndUpdateDB(partnerName, verifyCity, passDate, interviewId);
// TODO 4. 修改流程状态到下一阶段 4 分配选址开发经理
//审核未通过
} else if ("CANCELED".equals(request.getSequenceStatus())) {
} else if ("CANCELED".equals(request.getInstanceStatus())) {
interviewDAO.updateInterviewWorkflowStatus(interviewPlanId, WorkflowStatusEnum.INTERVIEW_7);
}
}

View File

@@ -108,6 +108,21 @@ public class HyPartnerIntentInfoServiceImpl implements HyPartnerIntentInfoServic
//修改意向申请信息中的加盟商名称与手机号
hyPartnerBaseInfoDAO.updateByPartnerId(baseUserInfoRequest.getUsername(),baseUserInfoRequest.getMobile(),baseUserInfoRequest.getPartnerId());
// 更新线索状态
HyPartnerLineInfoDO hyPartnerLineInfoDO = hyPartnerLineInfoService.generateDefaultLineInfo(hyPartnerUserInfoDO.getPartnerId(), baseUserInfoRequest.getWantShopArea(), baseUserInfoRequest.getAcceptAdjustType());
String cacheKey = MessageFormat.format(RedisConstant.PARTNER_INTENTINFO_CACHE_KEY, baseUserInfoRequest.getPartnerId(), hyPartnerLineInfoDO.getId());
if (StringUtils.isNotBlank(redisUtilPool.getString(cacheKey))) {
PartnerIntentInfoRequest request = JSONObject.parseObject(redisUtilPool.getString(cacheKey), PartnerIntentInfoRequest.class);
if(!baseUserInfoRequest.getWantShopArea().equals(request.getWantShopArea())
|| !baseUserInfoRequest.getAcceptAdjustType().equals(request.getAcceptAdjustType())){
request.setWantShopArea(baseUserInfoRequest.getWantShopArea());
request.setAcceptAdjustType(baseUserInfoRequest.getAcceptAdjustType());
redisUtilPool.setString(cacheKey, JSONObject.toJSONString(request), RedisConstant.ONE_DAY_SECONDS);
}
}
return Boolean.TRUE;
}
@@ -166,6 +181,8 @@ public class HyPartnerIntentInfoServiceImpl implements HyPartnerIntentInfoServic
hyPartnerLineInfoDO.setInvestmentManager(investmentManager);
}
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
}
if (StringUtil.isNotBlank(request.getWantShopArea())){
HyOpenAreaInfoDO hyOpenAreaInfoDO = hyOpenAreaInfoDAO.selectById(Long.valueOf(request.getWantShopArea()));
return hyOpenAreaInfoDO != null ? hyOpenAreaInfoDO.getAreaStatus() : null;
}

View File

@@ -8,6 +8,7 @@ import com.cool.store.entity.*;
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.mapper.HyPartnerInterviewMapper;
import com.cool.store.mapper.HyPartnerInterviewPlanMapper;
import com.cool.store.mapper.HyPartnerLineInfoMapper;
@@ -64,6 +65,9 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
@Autowired
private HyInterviewDAO interviewDAO;
@Resource
EnterpriseUserDAO enterpriseUserDAO;
@Override
@@ -89,21 +93,20 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
return result;
}
@Resource
EnterpriseUserDAO enterpriseUserDAO;
@Override
public PageInfo<PartnerInterviewInfoVO> getPartnerInterviewInfoList(String userId ,String type,Integer pageSize,Integer pageNumber) {
String workflowStatus = "";
Boolean filter = Boolean.FALSE;
if (CommonConstants.PENDING.equals(type)) {
workflowStatus = WorkflowStatusEnum.RESERVATION_1.getCode();
filter = Boolean.TRUE;
}
if (CommonConstants.FOLLOW.equals(type)) {
workflowStatus = WorkflowStatusEnum.RESERVATION_0.getCode();
}
PageHelper.startPage(pageNumber,pageSize);
//查询预约面试列表
PageInfo partnerInterviewInfoList = new PageInfo(hyPartnerInterviewPlanDAO.getPartnerInterviewInfoList(userId, WorkflowStageEnum.RESERVATION.getCode(), workflowStatus));
PageInfo partnerInterviewInfoList = new PageInfo(hyPartnerInterviewPlanDAO.getPartnerInterviewInfoList(userId, WorkflowStageEnum.RESERVATION.getCode(), workflowStatus,filter));
List<PartnerInterviewInfoDTO> list = partnerInterviewInfoList.getList();
if (CollectionUtils.isEmpty(list)){
return partnerInterviewInfoList;
@@ -144,7 +147,7 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
PageHelper.startPage(pageNumber,pageSize);
//查询预约面试列表
PageInfo partnerInterviewInfoList = new PageInfo(hyPartnerInterviewPlanDAO.getPartnerInterviewInfoList(userId, WorkflowStageEnum.INTERVIEW.getCode(),workflowStatus));
PageInfo partnerInterviewInfoList = new PageInfo(hyPartnerInterviewPlanDAO.getPartnerInterviewInfoList(userId, WorkflowStageEnum.INTERVIEW.getCode(),workflowStatus,Boolean.TRUE));
List<PartnerInterviewInfoDTO> list = partnerInterviewInfoList.getList();
if (CollectionUtils.isEmpty(list)){
return partnerInterviewInfoList;
@@ -170,7 +173,7 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
@Override
@Transactional
public void updateInterviewOverTime() {
public void updateInterviewOverTime() throws ApiException {
List<HyPartnerLineInfoDO> overTimeReserveLineList = hyPartnerLineInfoMapper.getOverTimeReserveLineList(new Date(), WorkflowStageEnum.RESERVATION.getCode(), WorkflowStatusEnum.RESERVATION_0.getCode());
if(CollectionUtils.isEmpty(overTimeReserveLineList)){
return;
@@ -201,7 +204,7 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
@Override
@Transactional
public void updateAbsentInterview() {
public void updateAbsentInterview() throws ApiException {
Date now = new Date();
//查询当天未参加的面试
String startTime = DateUtil.formatDateTime(DateUtil.offsetHour(now,-6));
@@ -223,7 +226,7 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
* @param interviewBaseInfoList
* @param rejectPublicReason
*/
public void handleOverTimeInterview(List<HyPartnerInterviewDO> interviewBaseInfoList,String rejectPublicReason){
public void handleOverTimeInterview(List<HyPartnerInterviewDO> interviewBaseInfoList,String rejectPublicReason) throws ApiException {
//1.更新面试信息表中超时的面试信息
List<Long> interviewIds = interviewBaseInfoList.stream().map(HyPartnerInterviewDO::getId).distinct().collect(Collectors.toList());
hyPartnerInterviewMapper.batchUpdateInterviewStatus(interviewIds,Integer.valueOf(WorkflowStatusEnum.RESERVATION_8.getCode()),1);

View File

@@ -14,10 +14,7 @@ import com.cool.store.entity.*;
import com.cool.store.enums.*;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.request.CloseFollowRequest;
import com.cool.store.request.LineRequest;
import com.cool.store.request.PrivateSeaLineListRequest;
import com.cool.store.request.QueryByInterviewPlanIdReq;
import com.cool.store.request.*;
import com.cool.store.service.*;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.RedisUtilPool;
@@ -137,21 +134,26 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
}
@Override
public Boolean transferInvestmentManager(LoginUserInfo user,String userId,String userName, Long lineId) {
if (StringUtil.isBlank(userId)||lineId==null){
public Boolean transferInvestmentManager(LoginUserInfo user, TransferInvestmentManagerRequest request) throws ApiException {
if (StringUtil.isBlank(request.getUserId())||request.getLineId()==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
HyPartnerLineInfoDO hyPartnerLineInfoDO = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(lineId);
hyPartnerLineInfoDAO.updateInvestmentManager(userId, Arrays.asList(lineId));
HyPartnerLineInfoDO hyPartnerLineInfoDO = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(request.getLineId());
hyPartnerLineInfoDAO.updateInvestmentManager(request.getUserId(), Arrays.asList(request.getLineId()));
List<String> userIdList = new ArrayList<>();
userIdList.add(userId);
userIdList.add(request.getUserId());
if (StringUtils.isNotEmpty(hyPartnerLineInfoDO.getInvestmentManager())){
userIdList.add(hyPartnerLineInfoDO.getInvestmentManager());
}
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())){
workFlowService.transferInvestmentManager(WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),request);
}
//添加日志
LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), hyPartnerLineInfoDO.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.TRANSFER_INVESTMENT_MANAGER,
@@ -160,8 +162,8 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
TransferInvestmentManagerLogDTO logDTO = TransferInvestmentManagerLogDTO.builder().operateUserId(user.getUserId()).operateUsername(user.getName())
.beforeInvestmentManagerUsername(userDOMap.getOrDefault(hyPartnerLineInfoDO.getInvestmentManager(),new EnterpriseUserDO()).getName())
.beforeInvestmentManagerMobile(userDOMap.getOrDefault(hyPartnerLineInfoDO.getInvestmentManager(),new EnterpriseUserDO()).getMobile())
.afterInvestmentManagerMobile(userDOMap.getOrDefault(userId,new EnterpriseUserDO()).getMobile())
.afterInvestmentManagerUsername(userDOMap.getOrDefault(userId,new EnterpriseUserDO()).getName())
.afterInvestmentManagerMobile(userDOMap.getOrDefault(request.getUserId(),new EnterpriseUserDO()).getMobile())
.afterInvestmentManagerUsername(userDOMap.getOrDefault(request.getUserId(),new EnterpriseUserDO()).getName())
.mobile(user.getMobile()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC_2)).build();
lineLogInfo.setData(logDTO);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
@@ -242,7 +244,7 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
}
@Override
public Boolean joinBlackList(LoginUserInfo user, Long lineId, Integer status, String joinReason) {
public Boolean joinBlackList(LoginUserInfo user, Long lineId, Integer status, String joinReason) throws ApiException {
if (lineId==null){
throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED);
}
@@ -255,10 +257,13 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
hyPartnerLineInfoDO.setRejectRealReason(joinReason);
hyPartnerLineInfoDO.setCloseTime(new Date());
hyPartnerLineInfoDO.setCloseUserId(user.getUserId());
hyPartnerLineInfoDO.setWorkflowStage(WorkflowStageEnum.INTENT.getCode());
hyPartnerLineInfoDO.setWorkflowStatus(WorkflowStatusEnum.INTENT_0.getCode());
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
CloseFollowRequest closeFollowRequest = new CloseFollowRequest();
closeFollowRequest.setLineId(lineId);
closeFollowRequest.setRejectRealReason(joinReason);
workFlowService.endProcess(WorkflowStageEnum.getWorkflowStageByCode(line.getWorkflowStage()),closeFollowRequest);
//添加日志
LineLogInfo lineLogInfo = new LineLogInfo(line.getPartnerId(), line.getId(), user.getUserId(),
user.getName(), OperateTypeEnum.ADD_BLACKLIST,
@@ -281,7 +286,6 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
HyPartnerLineInfoDO hyPartnerLineInfo = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(lineId);
HyPartnerLineInfoDO hyPartnerLineInfoDO = new HyPartnerLineInfoDO();
hyPartnerLineInfoDO.setId(lineId);
hyPartnerLineInfoDO.setLineStatus(status);
hyPartnerLineInfoDO.setRemoveBlackReason(removeReason);
hyPartnerLineInfoDO.setDeleted(Boolean.TRUE);
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
@@ -316,7 +320,7 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean closeOrPassFollow(LoginUserInfo user,CloseFollowRequest closeFollowRequest) {
public Boolean closeOrPassFollow(LoginUserInfo user,CloseFollowRequest closeFollowRequest) throws ApiException {
HyPartnerLineInfoDO hyPartnerLineInfoDO = hyPartnerLineInfoDAO.selectByPrimaryKeySelective(closeFollowRequest.getLineId());
if (hyPartnerLineInfoDO==null){
throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST);
@@ -567,8 +571,14 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
}
//省内调剂 有重点或者开放的 分配
if (AcceptAdjustTypeEnum.PROVINCIAL_ADJUSTMENT.getCode().equals(acceptAdjustType)){
Integer apply = hyOpenAreaInfoDAO.getChildrenCount("apply", hyOpenAreaInfoDO.getId());
if (apply>CommonConstants.ZERO){
List<HyOpenAreaInfoDO> hyOpenAreaInfoDOList= new ArrayList<>();
if(hyOpenAreaInfoDO != null){
String areaPath = hyOpenAreaInfoDO.getAreaPath();
String province = areaPath.substring(0, areaPath.indexOf("/", areaPath.indexOf("/") + 1));
hyOpenAreaInfoDOList = hyOpenAreaInfoDAO.queryByKeyword(province, true, null, true);
}
if (hyOpenAreaInfoDOList.size()>CommonConstants.ZERO){
return Boolean.TRUE;
}
return Boolean.FALSE;
@@ -631,18 +641,23 @@ public class HyPartnerLineInfoServiceImpl implements HyPartnerLineInfoService {
public HyPartnerLineInfoDO generateDefaultLineInfo(String partnerId, String wantShopArea, Integer acceptAdjustType) {
// 生成一条线索
HyPartnerLineInfoDO hyPartnerLineInfoDO = hyPartnerLineInfoDAO.getByPartnerId(partnerId);
Boolean flag = this.assignFollowUser(partnerId, wantShopArea, acceptAdjustType);
String investmentManager = null;
if (flag){
investmentManager = getAssignFollowUser(partnerId, "intent");
}
if(hyPartnerLineInfoDO == null){
hyPartnerLineInfoDO = new HyPartnerLineInfoDO();
hyPartnerLineInfoDO.setPartnerId(partnerId);
hyPartnerLineInfoDO.setWorkflowStage(WorkflowStageEnum.INTENT.getCode());
hyPartnerLineInfoDO.setWorkflowStatus(WorkflowStatusEnum.INTENT_0.getCode());
Boolean flag = this.assignFollowUser(hyPartnerLineInfoDO.getPartnerId(), wantShopArea, acceptAdjustType);
hyPartnerLineInfoDO.setLineStatus(flag ? LineStatusEnum.PRIVATE_SEAS.getCode() : LineStatusEnum.PUBLIC_SEAS.getCode());
if (flag){
String investmentManager = getAssignFollowUser(partnerId, "intent");
hyPartnerLineInfoDO.setInvestmentManager(investmentManager);
}
hyPartnerLineInfoDO.setInvestmentManager(investmentManager);
hyPartnerLineInfoDAO.insertSelective(hyPartnerLineInfoDO);
}else {
hyPartnerLineInfoDO.setLineStatus(flag ? LineStatusEnum.PRIVATE_SEAS.getCode() : LineStatusEnum.PUBLIC_SEAS.getCode());
hyPartnerLineInfoDO.setInvestmentManager(investmentManager);
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(hyPartnerLineInfoDO);
}
return hyPartnerLineInfoDO;
}

View File

@@ -6,8 +6,17 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dao.EnterpriseUserDAO;
import com.cool.store.dao.HyInterviewDAO;
import com.cool.store.dto.calendar.*;
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.log.*;
import com.cool.store.dto.message.SendCardMessageDTO;
import com.cool.store.dto.partner.EnterInterviewDto;
import com.cool.store.entity.*;
@@ -15,19 +24,18 @@ import com.cool.store.enums.*;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest;
import com.cool.store.mapper.HyPartnerBaseInfoMapper;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.mapper.HyPartnerInterviewPlanMapper;
import com.cool.store.mapper.HyPartnerLineInfoMapper;
import com.cool.store.mapper.*;
import com.cool.store.request.*;
import com.cool.store.service.EnterpriseUserService;
import com.cool.store.service.HyPartnerLineInfoService;
import com.cool.store.service.InterviewService;
import com.cool.store.service.LogService;
import com.cool.store.service.SmsService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.StringUtil;
import com.cool.store.utils.TRTCUtils;
import com.cool.store.vo.EnterInterviewVO;
import com.cool.store.vo.EnterpriseUserBaseInfoVO;
import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.interview.CreateAppointmentVO;
import com.cool.store.vo.interview.InterviewVO;
import lombok.extern.slf4j.Slf4j;
@@ -85,12 +93,14 @@ public class InterviewServiceImpl implements InterviewService {
@Autowired
private SmsService smsService;
@Autowired
private HyPartnerLineInfoService hyPartnerLineInfoService;
@Autowired
private HyInterviewDAO interviewDAO;
@Autowired
private LogService logService;
@Autowired
private EnterpriseUserDAO enterpriseUserDAO;
@Override
public List<InterviewVO> getInterviewList(GetInterviewListReq request) {
List<InterviewVO> interviewList = hyPartnerInterviewPlanMapper.getInterviewList(request);
@@ -188,6 +198,16 @@ public class InterviewServiceImpl implements InterviewService {
hyPartnerInterviewDO.setUpdateTime(new Date());
hyPartnerInterviewMapper.updateByPrimaryKeySelective(hyPartnerInterviewDO);
//记录日志
LoginUserInfo operator = CurrentUserHolder.getUser();
EnterpriseUserDO enterpriseUserDO = enterpriseUserDAO.getUserInfoById(request.getNewInterviewerId());
EntrustOthersDTO log = EntrustOthersDTO.builder().operateUserId(operator.getUserId()).operateUsername(operator.getName())
.operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.beforeInterviwerMobile(interviewInfo.getInterviewerMobile())
.beforeInterviwerName(interviewInfo.getInterviewerName())
.afterInterviwerMobile(enterpriseUserDO.getMobile())
.afterInterviwerName(enterpriseUserDO.getName()).build();
logService.recordBizLog(operator,interviewInfo.getPartnerLineId(),OperateTypeEnum.ENTRUST_OTHERS,log);
}
/**
@@ -248,6 +268,13 @@ public class InterviewServiceImpl implements InterviewService {
hyPartnerInterviewDO.setInterviewer(interviewInfo.getInterviewerId());
hyPartnerInterviewDO.setUpdateTime(new Date());
hyPartnerInterviewMapper.updateByPrimaryKeySelective(hyPartnerInterviewDO);
//记录日志
LoginUserInfo operator = CurrentUserHolder.getUser();
ModifyInterviewTimeDTO log = ModifyInterviewTimeDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getUserId()).operateUsername(operator.getName())
.operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.beforeInterviewTime(interviewInfo.getStartTime()).afterInterviewTime(request.getNewStartBookingTime()).build();
logService.recordBizLog(operator,interviewInfo.getPartnerLineId(),OperateTypeEnum.MODIFY_INTERVIEW_TIME,log);
}
@Override
@@ -273,6 +300,11 @@ public class InterviewServiceImpl implements InterviewService {
// hyPartnerInterviewDO.setStatus(Integer.parseInt(WorkflowStatusEnum.INTERVIEW_4.getCode()));
hyPartnerInterviewDO.setUpdateTime(now);
hyPartnerInterviewMapper.updateByPrimaryKeySelective(hyPartnerInterviewDO);
//记录日志
LoginUserInfo operator = CurrentUserHolder.getUser();
LogBasicDTO log = LogBasicDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getUserId()).operateUsername(operator.getName()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC)).build();
logService.recordBizLog(operator,interviewInfo.getPartnerLineId(),OperateTypeEnum.FINISH_INTERVIEW,log);
}
/**
@@ -419,6 +451,12 @@ public class InterviewServiceImpl implements InterviewService {
sendCardMessageDTO.setTitle("面试预约申请");
sendCardMessageDTO.setContent(generateFeiShuInterviewMsg(interviewVO.getPartnerName(), interviewVO.getPartnerMobile(), interviewVO.getStartTime()));
isvHttpRequest.sendFeiShuCardMessage(sendCardMessageDTO);
//记录日志
PartnerUserInfoVO operator = PartnerUserHolder.getUser();
LogBasicDTO log = LogBasicDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getPartnerId()).operateUsername(operator.getUsername()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC)).mobile(operator.getMobile()).build();
logService.recordPartnerBizLog(operator,interviewVO.getPartnerLineId(),OperateTypeEnum.INTERVIEW_APPOINTMENT,log);
return vo;
}
@@ -501,6 +539,11 @@ public class InterviewServiceImpl implements InterviewService {
hyPartnerLineDO.setWorkflowStatus(WorkflowStatusEnum.RESERVATION_0.getCode());
hyPartnerLineDO.setUpdateTime(new Date());
hyPartnerLineInfoMapper.updateByPrimaryKeySelective(hyPartnerLineDO);
//记录日志
LoginUserInfo operator = CurrentUserHolder.getUser();
ReInterviewDTO log = ReInterviewDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getUserId()).operateUsername(operator.getName()).operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.rejectRealReason(request.getReason()).certifyFile(request.getCertifyFile()).build();
logService.recordBizLog(operator,interviewVO.getPartnerLineId(),OperateTypeEnum.REINTERVIEW,log);
}
// @Override

View File

@@ -0,0 +1,83 @@
package com.cool.store.service.impl;
import cn.hutool.core.date.DateUtil;
import com.cool.store.context.LoginUserInfo;
import com.cool.store.dao.HyPartnerTaskInfoLogDAO;
import com.cool.store.dto.log.LineLogInfo;
import com.cool.store.dto.log.LogBasicDTO;
import com.cool.store.entity.HyPartnerLineInfoDO;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.enums.WorkflowStageEnum;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.mapper.HyPartnerLineInfoMapper;
import com.cool.store.service.LogService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.Md5Utils;
import com.cool.store.vo.PartnerUserInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @Author: young.yu
* @Date: 2023-06-28 00:10
* @Description:
*/
@Service
public class LogServiceImpl implements LogService {
private static final Logger LOG = LoggerFactory.getLogger(Md5Utils.class);
@Autowired
private HyPartnerLineInfoMapper partnerLineInfoMapper;
@Autowired
private HyPartnerTaskInfoLogDAO hyPartnerTaskInfoLogDAO;
@Override
@Async
public void recordBizLog(LoginUserInfo operator,Long lineId,OperateTypeEnum operateTypeEnum,Object logData){
try {
List<HyPartnerLineInfoDO> lineInfos = partnerLineInfoMapper.getHyPartnerLineInfoListByIds(Arrays.asList(lineId));
if (lineInfos == null || lineInfos.size() == 0) {
return;
}
HyPartnerLineInfoDO hyPartnerLineInfoDO = lineInfos.get(0);
LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), lineId, operator.getUserId(),
operator.getName(), operateTypeEnum,
WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),
hyPartnerLineInfoDO.getWorkflowStatus(), "");
lineLogInfo.setData(logData);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
int i =1;
}catch (Exception e){
LOG.error("recordBizLog error",e);
e.printStackTrace();
}
}
@Override
@Async
public void recordPartnerBizLog(PartnerUserInfoVO operator, Long lineId, OperateTypeEnum operateTypeEnum, Object logData){
try {
List<HyPartnerLineInfoDO> lineInfos = partnerLineInfoMapper.getHyPartnerLineInfoListByIds(Arrays.asList(lineId));
if (lineInfos == null || lineInfos.size() == 0) {
return;
}
HyPartnerLineInfoDO hyPartnerLineInfoDO = lineInfos.get(0);
LineLogInfo lineLogInfo = new LineLogInfo(hyPartnerLineInfoDO.getPartnerId(), lineId, operator.getPartnerId(),
operator.getUsername(), operateTypeEnum,
WorkflowStageEnum.getWorkflowStageByCode(hyPartnerLineInfoDO.getWorkflowStage()),
hyPartnerLineInfoDO.getWorkflowStatus(), "");
lineLogInfo.setData(logData);
hyPartnerTaskInfoLogDAO.addOperateLog(lineLogInfo);
}catch (Exception e){
LOG.error("recordBizLog error",e);
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,60 @@
package com.cool.store.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.RedisConstant;
import com.cool.store.entity.MDMAreaDO;
import com.cool.store.mapper.MdmAreaMapper;
import com.cool.store.service.MDMAreaService;
import com.cool.store.utils.RedisUtilPool;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.MessageFormat;
import java.util.List;
@Service
public class MDMAreaServiceImpl implements MDMAreaService {
@Autowired
private RedisUtilPool redisUtilPool;
@Autowired
private MdmAreaMapper mdmAreaMapper;
/**
* 获取省级数据
*/
@Override
public List<MDMAreaDO> getProvince() {
String provincesJson = redisUtilPool.getString(RedisConstant.MDM_AREA_PROVINCE);
if (StringUtils.isNotEmpty(provincesJson)) {
return (List<MDMAreaDO>) JSONObject.parseObject(provincesJson, List.class);
}
List<MDMAreaDO> areaDOList = mdmAreaMapper.getProvince();
//过期时间三小时
redisUtilPool.setString(RedisConstant.MDM_AREA_PROVINCE, JSONObject.toJSONString(areaDOList), 3 * 60 * 60);
return areaDOList;
}
/**
* 获取子级地区
* @param code 父级 code
*/
@Override
public List<MDMAreaDO> getSonArea(String code) {
String provincesJson = redisUtilPool.getString(MessageFormat.format(RedisConstant.MDM_AREA_OTHERS, code));
if (StringUtils.isNotEmpty(provincesJson)) {
return (List<MDMAreaDO>) JSONObject.parseObject(provincesJson, List.class);
}
List<MDMAreaDO> areaDOList = mdmAreaMapper.getSonArea(code);
//数据库也没有该数据就缓存空值,但是只缓存一分钟
if (areaDOList == null || areaDOList.size() == 0) {
redisUtilPool.setString(MessageFormat.format(RedisConstant.MDM_AREA_OTHERS, code), "", 60);
}
//过期时间三小时
redisUtilPool.setString(MessageFormat.format(RedisConstant.MDM_AREA_OTHERS, code), JSONObject.toJSONString(areaDOList), 3 * 60 * 60);
return areaDOList;
}
}

View File

@@ -3,11 +3,15 @@ package com.cool.store.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.cool.store.context.PartnerUserHolder;
import com.cool.store.dao.HyInterviewDAO;
import com.cool.store.dto.log.ModifyInterviewTimeDTO;
import com.cool.store.dto.partner.EnterInterviewDto;
import com.cool.store.dto.partner.LineQueryInterviewDto;
import com.cool.store.entity.HyPartnerInterviewDO;
import com.cool.store.entity.HyPartnerInterviewPlanDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.enums.OperateTypeEnum;
import com.cool.store.enums.RoomStatus;
import com.cool.store.enums.WorkflowStatusEnum;
import com.cool.store.exception.ApiException;
@@ -15,11 +19,14 @@ import com.cool.store.exception.ServiceException;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.mapper.HyPartnerInterviewPlanMapper;
import com.cool.store.request.ModifyInterviewTimeReq;
import com.cool.store.service.LogService;
import com.cool.store.service.PartnerInterviewService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.TRTCUtils;
import com.cool.store.vo.EnterInterviewVO;
import com.cool.store.vo.PartnerInterviewInfoVO;
import com.cool.store.vo.PartnerPassLetterDetailVO;
import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.interview.InterviewVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,6 +55,9 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
@Value("${trtc.secretKey}")
private String key;
@Autowired
private LogService logService;
/**
* 加盟商查询面试信息
*
@@ -59,6 +69,11 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
return interviewMapper.queryByPartnerId(partnerId);
}
@Override
public PartnerInterviewInfoVO queryByPartnerLineId(LineQueryInterviewDto request) throws ApiException {
return interviewMapper.queryByPartnerLineId(request.getPartnerLineId());
}
/**
* 进入面试间的方法
* 修改一些面试状态
@@ -175,6 +190,13 @@ public class PartnerInterviewServiceImpl implements PartnerInterviewService {
record.setEndTime(Convert.toDate(request.getNewEndBookingTime()));
record.setUpdateTime(new Date());
interviewPlanMapper.updateByPrimaryKeySelective(record);
//记录日志
PartnerUserInfoVO operator = PartnerUserHolder.getUser();
ModifyInterviewTimeDTO log = ModifyInterviewTimeDTO.builder().mobile(operator.getMobile()).operateUserId(operator.getPartnerId()).operateUsername(operator.getUsername())
.operateTime(DateUtil.format(new Date(), CoolDateUtils.DATE_FORMAT_SEC))
.beforeInterviewTime(interviewInfo.getStartTime()).afterInterviewTime(request.getNewStartBookingTime()).build();
logService.recordPartnerBizLog(operator,interviewInfo.getPartnerLineId(), OperateTypeEnum.MODIFY_INTERVIEW_TIME,log);
}
}

View File

@@ -82,7 +82,7 @@ public class PartnerUserInfoServiceImpl implements PartnerUserInfoService {
inviteCodeDetailVO.setInviteCode(hyPartnerUserInfoDO.getInviteCode());
inviteCodeDetailVO.setStoreName(hyPartnerUserInfoDO.getRecommendPartnerName());
inviteCodeDetailVO.setPartnerPhone(hyPartnerUserInfoDO.getRecommendPartnerMobile());
inviteCodeDetailVO.setStoreName(hyPartnerUserInfoDO.getShopName());
inviteCodeDetailVO.setPartnerName(hyPartnerUserInfoDO.getShopName());
return inviteCodeDetailVO;
}
@@ -112,14 +112,17 @@ public class PartnerUserInfoServiceImpl implements PartnerUserInfoService {
if (CollectionUtils.isNotEmpty(hyOpenAreaInfoDOS)) {
applyBaseInfoVO.setProvinceHasOpenArea(true);
}
applyBaseInfoVO.setPartnerLineId(hyPartnerLineInfoDO.getId());
applyBaseInfoVO.setLineStatus(hyPartnerLineInfoDO.getLineStatus());
String cacheKey = MessageFormat.format(RedisConstant.PARTNER_INTENTINFO_CACHE_KEY, partnerUserInfoRequest.getPartnerId(), hyPartnerLineInfoDO.getId());
if (StringUtils.isNotBlank(redisUtilPool.getString(cacheKey))) {
PartnerIntentInfoRequest request = JSONObject.parseObject(redisUtilPool.getString(cacheKey), PartnerIntentInfoRequest.class);
if(!partnerUserInfoRequest.getWantShopArea().equals(request.getWantShopArea())){
if(!partnerUserInfoRequest.getWantShopArea().equals(request.getWantShopArea())
|| !partnerUserInfoRequest.getAcceptAdjustType().equals(request.getAcceptAdjustType())){
request.setWantShopArea(partnerUserInfoRequest.getWantShopArea());
request.setAcceptAdjustType(partnerUserInfoRequest.getAcceptAdjustType());
redisUtilPool.setString(cacheKey, JSONObject.toJSONString(request), RedisConstant.ONE_DAY_SECONDS);
}
redisUtilPool.setString(cacheKey, JSONObject.toJSONString(request), RedisConstant.ONE_DAY_SECONDS);
}
return applyBaseInfoVO;
}

View File

@@ -1,5 +1,6 @@
package com.cool.store.service.impl;
import com.cool.store.dto.trtc.callback.VideoCallBackDTO;
import com.cool.store.mapper.HyPartnerInterviewMapper;
import com.cool.store.request.TRTCVideoCallBackReq;
import com.cool.store.service.TRTCVideoService;
@@ -15,12 +16,19 @@ public class TRTCVideoServiceImpl implements TRTCVideoService {
/**
* 音视频上传成功后的回调处理
*/
// @Override
// public void handleVideoCallBack(TRTCVideoCallBackReq req) {
// //将视频播放地址拼接到对应的面试信息字段中
// String videoUrl = req.getEventInfo().getPayLoad().getTencentVod().getVideoUrl();
// String roomId = req.getEventInfo().getRoomId();
// interviewMapper.addVideoUrl(roomId, videoUrl);
// }
@Override
public void handleVideoCallBack(TRTCVideoCallBackReq req) {
public void handleVideoCallBack(VideoCallBackDTO videoCallBackDTO) {
//将视频播放地址拼接到对应的面试信息字段中
String videoUrl = req.getEventInfo().getPayLoad().getTencentVod().getVideoUrl();
String roomId = req.getEventInfo().getRoomId();
String videoUrl = videoCallBackDTO.getEventInfo().getPayload().getTencentVod().getVideoUrl();
String roomId = videoCallBackDTO.getEventInfo().getRoomId();
interviewMapper.addVideoUrl(roomId, videoUrl);
}
}

View File

@@ -35,7 +35,7 @@ public class WorkFlowServiceImpl implements WorkFlowService{
@Override
public void endProcess(WorkflowStageEnum workflowStage, CloseFollowRequest request) {
public void endProcess(WorkflowStageEnum workflowStage, CloseFollowRequest request) throws ApiException {
getWorkflowService(workflowStage).endProcess(request);
}

View File

@@ -1,14 +1,15 @@
package com.cool.store.service.impl.workflow;
import cn.hutool.core.date.DateUtil;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.context.LoginUserInfo;
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.log.ReInterviewDTO;
import com.cool.store.dto.log.RejectInterviewDTO;
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.enums.*;
import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException;
import com.cool.store.http.ISVHttpRequest;
@@ -18,9 +19,12 @@ 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.service.LogService;
import com.cool.store.utils.CoolDateUtils;
import com.cool.store.vo.interview.InterviewVO;
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.stereotype.Service;
@@ -49,13 +53,16 @@ public class InterviewWorkFlowService extends WorkFlowBaseService {
@Autowired
private ISVHttpRequest isvHttpRequest;
@Autowired
private LogService logService;
@Override
public WorkflowStageEnum getWorkFlowStage() {
return WorkflowStageEnum.RESERVATION;
}
@Override
public void endProcess(CloseFollowRequest request) throws ServiceException{
public void endProcess(CloseFollowRequest request) throws ApiException {
Long lineId = request.getLineId();
//根据线索id查询面试信息
List<HyPartnerInterviewDO> interviewBaseInfos = hyPartnerInterviewMapper.getInterviewBaseInfoListByLineIds(Arrays.asList(lineId));
@@ -63,7 +70,28 @@ public class InterviewWorkFlowService extends WorkFlowBaseService {
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
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())){
// 原面试官日程删除
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);
}
}
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);
}
@Override

View File

@@ -23,7 +23,7 @@ public abstract class WorkFlowBaseService {
* 结束流程
* @param request
*/
public abstract void endProcess(CloseFollowRequest request);
public abstract void endProcess(CloseFollowRequest request) throws ApiException;
/**
* 转让招商经理

View File

@@ -0,0 +1,164 @@
package com.cool.store.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* @author leoxie
*/
public class Client {
private String url;
private String method = "POST";
private HashMap<String,String> header;
private String data;
private Integer timeout = 8000;
private Integer maxLength = 10000;
private static final Logger log = LoggerFactory.getLogger(Client.class);
public String exec() throws IOException {
HttpURLConnection connection = null;
OutputStreamWriter out = null;
BufferedReader reader = null;
StringBuilder res = null;
String result = null;
Long optTime = 0L;
InputStream is = null;
LocalDateTime beginTime = LocalDateTime.now();
URL url = new URL(getUrl());
connection = (HttpURLConnection) url.openConnection();
try {
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
//设置超时时间
connection.setConnectTimeout(getTimeout());
connection.setReadTimeout(getTimeout());
// 设置请求方式
connection.setRequestMethod(getMethod());
// 设置发送数据的格式
if (!getHeader().isEmpty()) {
for (Map.Entry<String, String> entry : getHeader().entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
//发起连接
connection.connect();
// utf-8编码[推送提交的参数]
if (!getData().isEmpty()) {
out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
out.append(getData());
out.flush();
out.close();
}
if(connection.getResponseCode() > 2000){
is = connection.getErrorStream();
}else{
is = connection.getInputStream();
}
// 读取响应
reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String line;
res = new StringBuilder();
while ((line = reader.readLine()) != null) {
res.append(line);
}
reader.close();
result = res.toString();
return result;
}catch (Exception e){
throw e;
}finally {
if (connection != null){
connection.disconnect();
}
if(out != null){
out.close();
}
if(reader != null){
reader.close();
}
// log.info("request url is : " + getUrl());
// log.info("request params is : " + getData());
// if(result != null && result.length() < maxLength) {
// log.info("response : " + result);
// }
// optTime = Duration.between(beginTime,LocalDateTime.now()).toMillis();
// log.info("response time: " + optTime.toString());
}
}
public String getUrl() {
assert !url.isEmpty();
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMethod() {
assert !method.isEmpty();
return method;
}
public void setMethod(String method) {
this.method = method;
}
public HashMap<String, String> getHeader() {
return header;
}
public void setHeader(HashMap<String, String> header) {
this.header = header;
}
public String getData() {
return data;
}
/**
* 提交参数
*
* 如果是json形式那么就是json字符串
* 如果是表单形式就是name1=value1&name2=value2 的形式
* @param data
*/
public void setData(String data) {
this.data = data;
}
public Integer getTimeout() {
return timeout;
}
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
}

View File

@@ -0,0 +1,104 @@
package com.cool.store.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author leoxie
*/
public class Get {
private static final Logger log = LoggerFactory.getLogger(Get.class);
private static final Integer connectTimeout = 1000;
private static final Integer timeout = 5000;
public static String send(String url, String param) throws IOException {
return send(url,param,true);
}
/**
* 向指定URL发送GET方法的请求
*
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String send(String url, String param,boolean hasLog) throws IOException {
return send(url, param, hasLog, null);
}
public static String send(String url, String param, boolean hasLog, HashMap<String,String> headers) throws IOException {
StringBuilder result = new StringBuilder();
BufferedReader reader = null;
HttpURLConnection connection = null;
try {
String urlNameString = url + (param.isEmpty()?"":"?" + param);
log.info("url:"+url);
log.info("param:"+param);
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
connection = (HttpURLConnection)realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
//添加头部信息
if(headers != null && !headers.isEmpty()){
for (Map.Entry<String,String> entry:headers.entrySet()) {
connection.setRequestProperty(entry.getKey(),entry.getValue());
}
}
connection.setConnectTimeout(connectTimeout);
connection.setReadTimeout(timeout);
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> responseHeader = connection.getHeaderFields();
// 遍历所有的响应头字段
if(hasLog) {
log.info("响应头");
for (String key : responseHeader.keySet()) {
log.info(key + "--->" + responseHeader.get(key));
}
}
// 定义 BufferedReader输入流来读取URL的响应
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
if(hasLog) {
log.info("响应结果:" + result.toString());
}
return result.toString();
} finally {
if (connection != null){
connection.disconnect();
}
if (reader != null) {
reader.close();
}
}
}
}

View File

@@ -0,0 +1,123 @@
package com.cool.store.utils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class MapUtil {
public static <T> void setMapValue(Map<String, Object> hashMap, String name, T value) {
if (value == null) {
return;
}
hashMap.put(name, value);
}
public static <T> void setMapObjectValue(Map<String, Object> hashMap, T obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
if (obj == null) {
return;
}
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
String uName = name.substring(0, 1).toUpperCase() + name.substring(1);
Method m = obj.getClass().getMethod("get" + uName);
Object value = m.invoke(obj);
if (value == null) {
continue;
}
// 基础类型
if (isBaseType(value)) {
setMapValue(hashMap, name, value);
} else if (value instanceof List) {
if (((List) value).size() > 0) {
setMapObjectValue(hashMap, ((List) value).get(0));
}
} else {
setMapObjectValue(hashMap, value);
}
}
}
public static boolean isBaseType(Object object) {
Class className = object.getClass();
return className.equals(Integer.class) ||
className.equals(Byte.class) ||
className.equals(Long.class) ||
className.equals(Double.class) ||
className.equals(Float.class) ||
className.equals(Character.class) ||
className.equals(Short.class) ||
className.equals(Boolean.class) ||
className.equals(String.class);
}
/**
* 实体类对象转URL参
* @param t 实体类对象
* @param callSuper 是否转换父类成员
* @param <T> 实体类泛型
* @return a=1&b=2
*/
public static <T> String entityToUrlParam(T t, boolean callSuper){
// URL 参数存储器
StringBuffer urlParam = new StringBuffer();
//扩展转换父类成员功能
entitySuperclassToUrlParam(t, t.getClass(),callSuper,urlParam);
if(urlParam.length()>0){
//去除最后一个&字符
urlParam.deleteCharAt(urlParam.length() - 1);
}
return urlParam.toString();
}
public static <T> String entityToUrlParam(T t) {
if (t == null) {
return null;
}
return entityToUrlParam(t, true);
}
/**
* 实体类对象转URL参
* @param t 实体类对象
* @param clazz 实体类类型
* @param callSuper 是否转换父类成员
* @param urlParam URL 参数存储器
* @param <T> 实体类泛型
* @return a=1&b=2
*/
@Deprecated
public static <T> void entitySuperclassToUrlParam(T t,Class clazz,boolean callSuper,StringBuffer urlParam){
//如果实体类对象为Object类型则不处理
if(!clazz.equals(Object.class)) {
//获取实体类对象下的所有成员,并保存到 URL 参数存储器中
Arrays.stream(clazz.getDeclaredFields()).forEach(field -> {
//设置可以操作私有成员
field.setAccessible(true);
try {
//获取成员值
Object value = field.get(t);
//成员值为 Null 时,则不处理
if (Objects.nonNull(value)) {
urlParam.append(field.getName()).append("=").append(value).append("&");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
//是否转换父类成员
if(callSuper){
//获取父类类型
clazz = clazz.getSuperclass();
//递归调用,获取父类的处理结果
entitySuperclassToUrlParam(t,clazz,callSuper,urlParam);
}
}
}
}

View File

@@ -0,0 +1,37 @@
package com.cool.store.utils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @author leoxie
*/
public class Post {
/**
* 向指定 URL 发送POST方法的请求
* @param url 发送请求的 URL
* @param data 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String send(String url, String data,HashMap<String,String> headers) throws IOException {
Client client = new Client();
client.setData(data);
client.setUrl(url);
HashMap<String, String> headerMap = new HashMap<>(16);
headerMap.put("Content-Type","application/x-www-form-urlencoded");
//添加头部信息
if(!headers.isEmpty()){
for (Map.Entry<String,String> entry:headers.entrySet()) {
headerMap.put(entry.getKey(),entry.getValue());
}
}
client.setHeader(headerMap);
return client.exec();
}
}