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

This commit is contained in:
苏竹红
2023-06-29 17:03:01 +08:00
25 changed files with 178 additions and 22 deletions

View File

@@ -243,4 +243,9 @@ public class RedisConstant {
*/
public static final String MDM_AREA_OTHERS = "mdm:area:others:{0}";
/**
* 动态标题
*/
public static final String CONTENT_TITLES = "content:titles";
}

View File

@@ -77,6 +77,7 @@ public enum ErrorCodeEnum {
INTERVIEW_INTERVIEW_TIME_IS_UNUSABLE(1021114, "当前预约时间不可用,请和线索用户协商其他时间后确定预约时间\n面试人{0} 手机号:{1}", null),
INTERVIEW_PARTNER_NOT_EXIST(1021115, "线索下的加盟商不存在!", null),
ROOM_STATUS_ERROR(10211156, "当前面试房间状态不允许进行该操作!", null),
CONTENT_DUPLICATED(10211200, "动态标题重复!", null),
SIGN_FAIL(600000, "验签失败", null),
GET_ACCESSTOKEN_ERROR(600001, "获取小程序TOKEN错误", null),
NEW_MOBILE_HAS_EXIST(600002,"加盟商用户信息已存在",null),

View File

@@ -39,9 +39,24 @@ public interface HyContentInfoMapper {
*/
List<HyContentInfoVO> queryContentList(ContentQueryListDto dto);
/**
* B 端使用的动态查询
*/
List<HyContentInfoVO> queryContentListForB(ContentQueryListDto dto);
/**
* 根据contentId查询动态详情
*/
HyContentInfoDO queryContentInfo(@Param("contentId") String contentId);
/**
* 标题是否重复
*/
Boolean whetherTitleDuplicated(@Param("contentTitle") String contentTitle);
/**
* 查询动态标题
*/
List<String> queryTitles();
}

View File

@@ -179,6 +179,29 @@
and user_id = #{updateUserId}
</select>
<!-- B 端使用的动态查询 -->
<select id="queryContentListForB" resultType="com.cool.store.vo.HyContentInfoVO">
select <include refid="Base_Column_List"></include>
from hy_content_info
where deleted = 0
and status = 1
<if test="contentTitle != null and contentTitle != ''">
and content_title like concat('%', #{contentTitle}, '%')
</if>
<if test="subject != null">
and subject = #{subject}
</if>
<if test="contentType != null">
and content_type = #{contentType}
</if>
<if test="startTime != null and startTime != ''">
and update_time &gt;= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
and update_time &lt;= #{endTime}
</if>
</select>
<!-- 查询动态详情 -->
<select id="queryContentInfo" resultType="com.cool.store.entity.HyContentInfoDO">
select <include refid="Base_Column_List"></include>
@@ -186,4 +209,19 @@
where deleted = 0
and id = #{contentId}
</select>
<!-- 标题是否重复 -->
<select id="whetherTitleDuplicated" resultType="java.lang.Boolean">
SELECT COUNT(*)
FROM hy_content_info
WHERE deleted = 0
AND content_title = #{contentTitle}
</select>
<!-- 获取所有标题 -->
<select id="queryTitles" resultType="java.lang.String">
SELECT content_title
FROM hy_content_info
WHERE deleted = 0
</select>
</mapper>

View File

@@ -386,6 +386,8 @@
hpll.id as partnerLineId,
hpci.qualify_verify_id as qualifyVerifyId,
hpci.intention_contract_no as intentionContractNo,
hpll.workflow_stage as workflowStage,
hpll.line_status as lineStatus,
hpi.pass_time as passTime,
hpi.pass_reason as passReason,
hpi.recorder as recorderId,

View File

@@ -52,8 +52,8 @@
</where>
</select>
<select id="selectByHourDate" resultType="com.cool.store.entity.SyncEcCustomerDO" >
SELECT a.id as id, a.username as customername,a.mobile as customermobile,c.`name` as followname,c.mobile as followmobile FROM hy_partner_user_info a LEFT join hy_partner_line_info b on
a.partner_id=b.partner_id left join enterprise_user c on b.investment_manager=c.user_id
SELECT a.id as id, a.username as customername,a.mobile as customermobile,c.`name` as followname,c.mobile as followmobile ,d.channel_id as channelId FROM hy_partner_user_info a LEFT join hy_partner_line_info b on
a.partner_id=b.partner_id left join enterprise_user c on b.investment_manager=c.user_id LEFT join hy_partner_user_channel d on b.user_channel_id=d.id
WHERE a.create_time BETWEEN #{selectTime} and #{now} or
a.update_time BETWEEN #{selectTime} and #{now} order by a.id Limit #{limit1},#{limit2}
</select>

View File

@@ -0,0 +1,12 @@
package com.cool.store.dto.content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ContentQueryTitlesDto {
@ApiModelProperty("用户输入标题")
private String tittle;
}

View File

@@ -16,4 +16,6 @@ public class SyncEcCustomerDO {
private String followname;
private String followmobile;
private Integer channelId;
}

View File

@@ -54,7 +54,7 @@ public class OpenAreaTreeVO {
public static List<OpenAreaTreeVO> convertTree(List<HyOpenAreaInfoDO> allOpenArea, String keyword, Boolean applyFlag){
long startTime = System.currentTimeMillis();
List<HyOpenAreaInfoDO> firstArea = allOpenArea.stream().filter(o -> Objects.isNull(o.getParentId())).collect(Collectors.toList());
Map<Long, List<HyOpenAreaInfoDO>> openAreaParentMap = allOpenArea.stream().filter(o->Objects.nonNull(o.getParentId())).collect(Collectors.groupingBy(k -> k.getParentId()));
Map<Long, List<HyOpenAreaInfoDO>> openAreaParentMap = allOpenArea.stream().distinct().filter(o->Objects.nonNull(o.getParentId())).collect(Collectors.groupingBy(k -> k.getParentId()));
List<OpenAreaTreeVO> allTree = new ArrayList<>();
for (HyOpenAreaInfoDO openAreaInfo : firstArea) {
OpenAreaTreeVO node = copyProperties(openAreaInfo);
@@ -62,29 +62,33 @@ public class OpenAreaTreeVO {
node.setChildNode(childList);
allTree.add(node);
}
//不需要过滤 直接返回
if(StringUtils.isBlank(keyword) && (Objects.isNull(applyFlag) || !applyFlag)){
return allTree;
}
log.info("1#耗时:{}", System.currentTimeMillis() - startTime);
Map<Long, List<OpenAreaTreeVO>> childMap = allTree.stream().collect(Collectors.toMap(k -> k.getId(), v -> v.getChildNode()));
List<HyOpenAreaInfoDO> filterList = allOpenArea.stream().filter(o -> (StringUtils.isBlank(keyword) || o.getAreaPath().contains(keyword))
&& (Objects.isNull(applyFlag) || AreaStatusEnum.OPEN.getCode().equals(o.getAreaStatus()) || AreaStatusEnum.OPEN.getCode().equals(o.getAreaStatus())))
.collect(Collectors.toList());
Map<Long, HyOpenAreaInfoDO> openAreaMap = allOpenArea.stream().collect(Collectors.toMap(k -> k.getId(), Function.identity()));
List<HyOpenAreaInfoDO> list = new ArrayList<>();
List<HyOpenAreaInfoDO> filterAndParentList = new ArrayList<>();
//向上处理节点
for (HyOpenAreaInfoDO openAreaInfo : filterList) {
list.add(openAreaInfo);
filterAndParentList.add(openAreaInfo);
while (Objects.nonNull(openAreaInfo) && Objects.nonNull(openAreaInfo.getParentId())){
openAreaInfo = openAreaMap.get(openAreaInfo.getParentId());
if(Objects.isNull(openAreaInfo)){
continue;
if(Objects.nonNull(openAreaInfo) && !filterAndParentList.contains(openAreaInfo)){
filterAndParentList.add(openAreaInfo);
}
list.add(openAreaInfo);
}
}
log.info("2#耗时:{}", System.currentTimeMillis() - startTime);
List<OpenAreaTreeVO> resultList = new ArrayList<>();
List<HyOpenAreaInfoDO> filterFirstArea = list.stream().filter(o -> Objects.isNull(o.getParentId())).distinct().collect(Collectors.toList());
Map<Long, List<HyOpenAreaInfoDO>> filterOpenAreaParentMap = list.stream().filter(Objects::nonNull).filter(o->Objects.nonNull(o.getParentId())).collect(Collectors.groupingBy(k -> k.getParentId()));
List<HyOpenAreaInfoDO> filterFirstArea = filterAndParentList.stream().filter(o -> Objects.isNull(o.getParentId())).collect(Collectors.toList());
Map<Long, List<HyOpenAreaInfoDO>> filterOpenAreaParentMap = filterAndParentList.stream().filter(Objects::nonNull).filter(o->Objects.nonNull(o.getParentId())).collect(Collectors.groupingBy(k -> k.getParentId()));
for (HyOpenAreaInfoDO openAreaInfo : filterFirstArea) {
Long id = openAreaInfo.getId();
OpenAreaTreeVO node = copyProperties(openAreaInfo);
List<OpenAreaTreeVO> childList = dealChild(openAreaInfo, filterOpenAreaParentMap);
if(CollectionUtils.isEmpty(childList)){

View File

@@ -25,6 +25,12 @@ public class InterviewVO {
@ApiModelProperty(value = "线索id", required = true)
private Long partnerLineId;
@ApiModelProperty(value = "流程阶段")
private Long workflowStage;
@ApiModelProperty(value = "线索状态")
private Long lineStatus;
@ApiModelProperty("资质审核流程id")
private String qualifyVerifyId;

View File

@@ -76,5 +76,17 @@ public class JobHandler {
}
}
@XxlJob("approvalReminder")
public void approvalReminder(){
try {
log.info("审批即将超时提醒开始");
hyPartnerInterviewPlanService.approvalReminder();
log.info("审批即将超时提醒结束");
XxlJobHelper.handleSuccess();
}catch (Exception e){
log.error("审批即将超时提醒定时任务异常",e);
XxlJobHelper.log("审批即将超时提醒定时任务异常"+e.getMessage());
}
}
}

View File

@@ -4,6 +4,7 @@ import com.cool.store.dto.content.ContentAddDto;
import com.cool.store.dto.content.ContentQueryListDto;
import com.cool.store.dto.content.ContentUpdateDto;
import com.cool.store.entity.HyContentInfoDO;
import com.cool.store.exception.ApiException;
import com.cool.store.vo.HyContentInfoVO;
import java.util.List;
@@ -15,7 +16,7 @@ public interface ContentService {
* @param dto
* @return contentId 新增动态id
*/
String addNews(ContentAddDto dto);
String addNews(ContentAddDto dto) throws ApiException;
/**
* 删除动态
@@ -41,4 +42,9 @@ public interface ContentService {
*/
HyContentInfoDO queryContentInfo(String contentId);
/**
* 标题是否重复
*/
Boolean queryTitles(String title);
}

View File

@@ -62,4 +62,5 @@ public interface HyPartnerInterviewPlanService {
* @return
*/
void updateAbsentInterview() throws ApiException;
void approvalReminder() throws ApiException;
}

View File

@@ -72,14 +72,14 @@ public class CommonServiceImpl implements CommonService {
if(partnerCertificationInfoDO != null){
intentionContractNo = partnerCertificationInfoDO.getIntentionContractNo();
}
return getInterviewTips(partnerLineId, OperateTypeEnum.FINISH_INTERVIEW, "发起加盟商资质审核|"+intentionContractNo);
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 getInterviewTips(partnerLineId, OperateTypeEnum.FINISH_INTERVIEW, "审核通过 | "+intentionContractNo);
}
return null;

View File

@@ -1,13 +1,18 @@
package com.cool.store.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.RedisConstant;
import com.cool.store.dao.ContentDAO;
import com.cool.store.dto.content.ContentAddDto;
import com.cool.store.dto.content.ContentQueryListDto;
import com.cool.store.dto.content.ContentUpdateDto;
import com.cool.store.entity.HyContentInfoDO;
import com.cool.store.enums.ErrorCodeEnum;
import com.cool.store.exception.ApiException;
import com.cool.store.mapper.HyContentInfoMapper;
import com.cool.store.service.ContentService;
import com.cool.store.utils.RedisUtilPool;
import com.cool.store.vo.HyContentInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -23,13 +28,21 @@ public class ContentServiceImpl implements ContentService {
@Autowired
private HyContentInfoMapper contentInfoMapper;
@Autowired
private RedisUtilPool redisUtilPool;
/**
*
* @param dto
* @return contentId 新增动态id
*/
@Override
public String addNews(ContentAddDto dto) {
public String addNews(ContentAddDto dto) throws ApiException {
//增加不允许重复标题的逻辑
Boolean isDuplicated = contentInfoMapper.whetherTitleDuplicated(dto.getContentTitle());
if (isDuplicated) {
throw new ApiException(ErrorCodeEnum.DATA_CONVERT_ERROR);
}
HyContentInfoDO hyContentInfoDO = new HyContentInfoDO();
BeanUtil.copyProperties(dto, hyContentInfoDO);
hyContentInfoDO.setUpdateUserId(dto.getCreateUserId());
@@ -62,7 +75,7 @@ public class ContentServiceImpl implements ContentService {
*/
@Override
public List<HyContentInfoVO> queryContentList(ContentQueryListDto dto) {
return contentInfoMapper.queryContentList(dto);
return contentInfoMapper.queryContentListForB(dto);
}
/**
@@ -75,4 +88,18 @@ public class ContentServiceImpl implements ContentService {
return contentInfoMapper.queryContentInfo(contentId);
}
/**
* 标题是否重复
*/
@Override
public Boolean queryTitles(String title) {
List<String> titles = (List<String>) JSONObject.parseObject(redisUtilPool.getString(RedisConstant.CONTENT_TITLES), List.class);
if (titles != null && titles.size() != 0) {
return titles.contains(title);
}
titles = contentInfoMapper.queryTitles();
redisUtilPool.setString(RedisConstant.CONTENT_TITLES, JSONObject.toJSONString(titles), 60);
return titles.contains(title);
}
}

View File

@@ -167,6 +167,9 @@ public class EcSyncServiceImpl implements EcSyncService {
if (StringUtil.isEmpty(partnerLine.getInvestmentManager())) {
if (StringUtil.isNotEmpty(resultLine.getInvestmentManager())) {
resultLine.setId(partnerLine.getId()).setUpdateTime(new Date());
//沪姨合伙人线索存在黑名单EC该线索分配跟进人同步到沪姨合伙人但线索状态不变还存在黑名单中
resultLine.setLineStatus(partnerLine.getLineStatus().intValue()==LineStatusEnum.BLACKLIST.getCode().intValue()
?LineStatusEnum.BLACKLIST.getCode():resultLine.getLineStatus());
hyPartnerLineInfoDAO.updateByPrimaryKeySelective(resultLine);
}
}else {

View File

@@ -194,8 +194,9 @@ public class FlowServiceImpl implements FlowService {
//更新面试状态
interviewDAO.updateInterviewWorkflowStatus(request.getInterviewPlanId(), WorkflowStatusEnum.INTERVIEW_5);
hyPartnerInterviewDO.setUpdateTime(new Date());
//获取当前操作人
//注意将 hyPartnerInterviewDO 的 status 设置为 null否则又会修改回 4
hyPartnerInterviewDO.setStatus(null);
//获取当前操作人并添加面试总结/记录信息
LoginUserInfo operator = CurrentUserHolder.getUser();
hyPartnerInterviewDO.setRecorder(operator.getUserId());
hyPartnerInterviewDO.setRecordTime(new Date());

View File

@@ -221,6 +221,16 @@ public class HyPartnerInterviewPlanServiceImpl implements HyPartnerInterviewPlan
handleOverTimeInterview(interviewBaseInfoList,"超时未面试");
}
@Override
public void approvalReminder() throws ApiException {
//查询即将超时但未审批的面试
HyPartnerInterviewPlanDO hyPartnerInterviewPlanDO = new HyPartnerInterviewPlanDO();
hyPartnerInterviewPlanDO.setDeleted(Boolean.FALSE);
hyPartnerInterviewPlanDO.setApplicationApproved(0);
// hyPartnerInterviewPlanDO.setStartTime();
List<HyPartnerInterviewPlanDO> hyPartnerInterviewPlanDOS = hyPartnerInterviewPlanMapper.selectBySelective(hyPartnerInterviewPlanDO);
}
/**
* 统一处理面试超时情况,包括超时未预约和超时未面试
* @param interviewBaseInfoList

View File

@@ -587,6 +587,8 @@ public class InterviewServiceImpl implements InterviewService {
//根据加盟商用户ID查询面试官ID
HyPartnerInterviewPlanDO hyPartnerInterviewPlanDO = new HyPartnerInterviewPlanDO();
hyPartnerInterviewPlanDO.setPartnerId(partnerId);
hyPartnerInterviewPlanDO.setPartnerLineId(Long.valueOf(lineId));
hyPartnerInterviewPlanDO.setDeleted(false);
List<HyPartnerInterviewPlanDO> hyPartnerInterviewPlanDOS = hyPartnerInterviewPlanMapper.selectBySelective(hyPartnerInterviewPlanDO);
//如果查询结果为空,则去线索中获取招商经理,面试官只有两个阶段,一个是在第一次申请时不存在面试安排直接取招商经理,第二个时面试信息中可修改面试官信息,这个时候以面试信息中为准
if (CollectionUtils.isEmpty(hyPartnerInterviewPlanDOS)) {

View File

@@ -109,7 +109,7 @@ public class InterviewWorkFlowService extends WorkFlowBaseService {
}
Integer status = interviewInfo.getStatus();
Date now = new Date();
if (status == Integer.parseInt(WorkflowStatusEnum.INTERVIEW_2.getCode()) ||
if (status == Integer.parseInt(WorkflowStatusEnum.INTERVIEW_3.getCode()) ||
(interviewInfo.getRoomStatus()!=null && String.valueOf(RoomStatus.OPEN.getCode()).equals(interviewInfo.getRoomStatus())) ||
(DateUtil.compare(DateUtil.parse(interviewInfo.getStartTime()), now) <= 0
&& DateUtil.compare(DateUtil.parse(interviewInfo.getEndTime()), now) >= 0)) {

View File

@@ -1,10 +1,13 @@
package com.cool.store.controller;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.dto.content.*;
import com.cool.store.entity.HyContentInfoDO;
import com.cool.store.exception.ApiException;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.ContentService;
import com.cool.store.vo.HyContentInfoVO;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
@@ -24,9 +27,15 @@ public class ContentController {
@Autowired
private ContentService contentService;
@PostMapping("/queryTitles")
@ApiOperation("搜索标题是否重复")
public ResponseResult<Boolean> queryTitles(@RequestBody ContentQueryTitlesDto title) {
return ResponseResult.success(contentService.queryTitles(title.getTittle()));
}
@PostMapping("/add")
@ApiOperation("新增动态")
public ResponseResult<String> addContent(@RequestBody ContentAddDto dto) {
public ResponseResult<String> addContent(@RequestBody ContentAddDto dto) throws ApiException {
return ResponseResult.success(contentService.addNews(dto));
}

View File

@@ -81,4 +81,4 @@ hs.sms.accessKeySecret = iVOiK74k7C1wVbuUbipgJbfpAh1Zdb
hs.sms.templateCode = SMS_461530041
ec.baseUrl=http://58.33.58.162:10019
ec.baseUrl=https://oapi-gateway.shpr.top/basic

View File

@@ -74,4 +74,4 @@ xxl.job.executor.logretentiondays = 3
xxl.job.accessToken =
ec.baseUrl=http://58.33.58.162:10019
ec.baseUrl=https://oapi-gateway.shpr.top/basic

View File

@@ -83,4 +83,4 @@ xxl.job.executor.logpath = logs/xxl-job/jobhandler
xxl.job.executor.logretentiondays = 30
xxl.job.accessToken =
ec.baseUrl=http://58.33.58.162:10019
ec.baseUrl=http://127.0.0.1:8017

View File

@@ -53,7 +53,7 @@ public class OpenAreaController {
})
public ResponseResult<List<OpenAreaTreeVO>> getOpenAreaList(@RequestParam(value = "keyword",required = false)String keyword,
@RequestParam(value = "applyFlag",required = false)Boolean applyFlag){
List<OpenAreaTreeVO> openAreaTreeVOS = openAreaService.queryAllOpenAreaByKeyword(keyword,applyFlag,Boolean.FALSE);
List<OpenAreaTreeVO> openAreaTreeVOS = openAreaService.searchOpenArea(keyword,applyFlag,Boolean.FALSE);
return ResponseResult.success(openAreaTreeVOS);
}