| @@ -95,7 +95,7 @@ public class InvestCustomerController extends InvestBaseController{ | |||||
| @ApiOperation("导出客户信息模板") | @ApiOperation("导出客户信息模板") | ||||
| @GetMapping("/exportCustomerTemplate") | @GetMapping("/exportCustomerTemplate") | ||||
| @SystemControllerLog(description = "招商管理-导出客户信息模板") | |||||
| @SystemControllerLog(description = "导出客户信息模板") | |||||
| public void exportCustomerTemplate(HttpServletResponse response) { | public void exportCustomerTemplate(HttpServletResponse response) { | ||||
| exportData(null, response, (p, u) -> investBizService.exportCustomerTemplate(u)); | exportData(null, response, (p, u) -> investBizService.exportCustomerTemplate(u)); | ||||
| } | } | ||||
| @@ -107,4 +107,10 @@ public class InvestCustomerController extends InvestBaseController{ | |||||
| return importData(file, p -> investBizService.importCustomer(p)); | return importData(file, p -> investBizService.importCustomer(p)); | ||||
| } | } | ||||
| @GetMapping("/queryTemplateCount") | |||||
| @SystemControllerLog(description = "查询导入数据") | |||||
| public InvestResultData queryTemplateCount() { | |||||
| return execute(null, p -> investBizService.queryCustomerImportCount()); | |||||
| } | |||||
| } | } | ||||
| @@ -56,6 +56,9 @@ CREATE TABLE `invest_remind` ( | |||||
| `minute` BIGINT(6) NOT NULL COMMENT '提醒时间', | `minute` BIGINT(6) NOT NULL COMMENT '提醒时间', | ||||
| `begin_date` DATETIME NOT NULL COMMENT '开始时间', | `begin_date` DATETIME NOT NULL COMMENT '开始时间', | ||||
| `end_date` DATETIME NOT NULL COMMENT '结束时间', | `end_date` DATETIME NOT NULL COMMENT '结束时间', | ||||
| `customer_id` BIGINT(20) NOT NULL DEFAULT '0' COMMENT '客户ID', | |||||
| `negotiation_type` TINYINT(6) NOT NULL DEFAULT '0' COMMENT '拜访方式:0-拜访;1-来访;2-电话;3-短信、微信或其它', | |||||
| `status` TINYINT(6) NOT NULL DEFAULT '0' COMMENT '是否提醒:0-未提醒;1-已提醒', | |||||
| `create_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | `create_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||||
| `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | ||||
| PRIMARY KEY (`id`), | PRIMARY KEY (`id`), | ||||
| @@ -3,9 +3,15 @@ package com.iformall.schedule; | |||||
| import com.alibaba.fastjson.JSONArray; | import com.alibaba.fastjson.JSONArray; | ||||
| import com.google.common.collect.ImmutableListMultimap; | import com.google.common.collect.ImmutableListMultimap; | ||||
| import com.google.common.collect.Multimaps; | import com.google.common.collect.Multimaps; | ||||
| import com.iformall.domain.po.MallUserInfo; | |||||
| import com.iformall.domain.po.WxMall; | |||||
| import com.iformall.domain.po.invest.*; | import com.iformall.domain.po.invest.*; | ||||
| import com.iformall.domain.po.msg.WxMsgRecord; | |||||
| import com.iformall.domain.vo.invest.InvestCustomerVo; | import com.iformall.domain.vo.invest.InvestCustomerVo; | ||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.mapper.WxMallMapper; | |||||
| import com.iformall.mq.MqBaseProducer; | |||||
| import com.iformall.service.MallUserInfoService; | |||||
| import com.iformall.service.invest.*; | import com.iformall.service.invest.*; | ||||
| import com.iformall.utils.DateUtils; | import com.iformall.utils.DateUtils; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| @@ -16,6 +22,7 @@ import org.springframework.core.env.Environment; | |||||
| import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
| import javax.annotation.Resource; | |||||
| import java.util.*; | import java.util.*; | ||||
| @@ -36,22 +43,85 @@ public class InvestSchedule { | |||||
| InvestCustomerService customerService; | InvestCustomerService customerService; | ||||
| @Autowired | @Autowired | ||||
| InvestFollowRecordService followRecordService; | InvestFollowRecordService followRecordService; | ||||
| @Autowired | |||||
| InvestRemindService remindService; | |||||
| @Resource | |||||
| WxMallMapper mallMapper; | |||||
| @Autowired | |||||
| MallUserInfoService userInfoService; | |||||
| @Autowired | |||||
| private MqBaseProducer mqBaseProducer; | |||||
| @Autowired | @Autowired | ||||
| Environment environment; | Environment environment; | ||||
| private static final String PREFIX = "招商定时任务"; | |||||
| private static final String TAG_MESSAGE = "招商定时任务-消息"; | |||||
| private static final String TAG_REMIND = "招商定时任务-提醒"; | |||||
| //@Scheduled(cron = "0 0 14 * * ?") // 每天下午两点执行定时任务 | //@Scheduled(cron = "0 0 14 * * ?") // 每天下午两点执行定时任务 | ||||
| @Scheduled(cron = "0 */30 * * * *?") // 测试,每5分钟执行 | |||||
| @Scheduled(cron = "0 */30 * * * *?") // 测试,每30分钟执行 | |||||
| public void messageSchedule() { | public void messageSchedule() { | ||||
| log.info("{}: 开始", PREFIX); | |||||
| log.info("{}: 开始", TAG_MESSAGE); | |||||
| //一个月内未完成提醒 | //一个月内未完成提醒 | ||||
| taskMonthMessage(); | taskMonthMessage(); | ||||
| //一周内未跟踪提醒 | //一周内未跟踪提醒 | ||||
| demandWeekMessage(); | demandWeekMessage(); | ||||
| log.info("{}: 结束", PREFIX); | |||||
| log.info("{}: 结束", TAG_MESSAGE); | |||||
| } | |||||
| @Scheduled(cron = "0 */5 * * * *?") | |||||
| public void remindSchedule() { | |||||
| log.info("{}: 开始", TAG_REMIND); | |||||
| // 提醒新 | |||||
| List<InvestRemindEntity> reminds = remindService.findUnRemindList(); | |||||
| log.info("{}:提醒数 :{}", TAG_REMIND, reminds.size()); | |||||
| if (CollectionUtils.isEmpty(reminds)) { | |||||
| return; | |||||
| } | |||||
| // mall 信息 | |||||
| List<WxMall> mallList = mallMapper.findList(new WxMall()); | |||||
| if (mallList.size() == 0) { | |||||
| log.info("{}: No Mall info found", TAG_REMIND); | |||||
| return; | |||||
| } | |||||
| Map<String, WxMall> mallMap = InvestHelper.getMap(mallList, WxMall::getTenantId); | |||||
| // 用户信息 | |||||
| List<MallUserInfo> userList = userInfoService.findList(new MallUserInfo()); | |||||
| if (userList.size() == 0) { | |||||
| log.info("{}: No user info found", TAG_REMIND); | |||||
| return; | |||||
| } | |||||
| Map<Long, MallUserInfo> userMap = InvestHelper.getMap(userList, MallUserInfo::getId); | |||||
| Collection<InvestCustomerEntity> customs = customerService.listByIds(InvestHelper.getIds(reminds, InvestRemindEntity::getCustomerId)); | |||||
| Map<Long, InvestCustomerEntity> customerMap = InvestHelper.getMap(customs, InvestCustomerEntity::getId); | |||||
| Calendar now = Calendar.getInstance(); | |||||
| for (InvestRemindEntity remind : reminds) { | |||||
| if (Objects.equals(remind.getMinute(), 0L)) { | |||||
| log.warn("{}:remindID:{} 不提醒, 跳过", TAG_REMIND, remind.getId()); | |||||
| continue; | |||||
| } | |||||
| Calendar begin = Calendar.getInstance(); | |||||
| begin.setTime(remind.getBeginDate()); | |||||
| if (getRemindMinute(now, begin) > remind.getMinute()) { | |||||
| boolean sended = sendSMS(userMap.get(remind.getOwner()), mallMap.get(remind.getTenantId()), remind, customerMap.get(remind.getCustomerId())); | |||||
| if (sended) { | |||||
| remind.setStatus(EnumInvestRemindStatus.REMINDED); | |||||
| remindService.updateById(remind); | |||||
| } | |||||
| } | |||||
| } | |||||
| log.info("{}: 结束", TAG_REMIND); | |||||
| } | |||||
| private long getRemindMinute(Calendar c1, Calendar c2) { | |||||
| long beginTime = c1.getTime().getTime(); | |||||
| long endTime = c2.getTime().getTime(); | |||||
| return (endTime - beginTime) / (1000 * 60); | |||||
| } | } | ||||
| private void taskMonthMessage() { | private void taskMonthMessage() { | ||||
| @@ -69,14 +139,14 @@ public class InvestSchedule { | |||||
| } | } | ||||
| //查询满足条件 | //查询满足条件 | ||||
| List<InvestTaskEntity> tasks = taskService.listByStatusAndTime(Arrays.asList(EnumTaskStatus.INTENTION, EnumTaskStatus.NEGOTIATING), start.getTime(), end.getTime()); | List<InvestTaskEntity> tasks = taskService.listByStatusAndTime(Arrays.asList(EnumTaskStatus.INTENTION, EnumTaskStatus.NEGOTIATING), start.getTime(), end.getTime()); | ||||
| log.info("{}:{} - {} 的任务数 :{}", PREFIX, start, end, tasks.size()); | |||||
| log.info("{}:{} - {} 的任务数 :{}", TAG_MESSAGE, start, end, tasks.size()); | |||||
| if (tasks.isEmpty()) { | if (tasks.isEmpty()) { | ||||
| return; | return; | ||||
| } | } | ||||
| for (InvestTaskEntity task : tasks) { | for (InvestTaskEntity task : tasks) { | ||||
| String owner = task.getOwner(); | String owner = task.getOwner(); | ||||
| if (StringUtils.isEmpty(owner)) { | if (StringUtils.isEmpty(owner)) { | ||||
| log.warn("{}:taskID:{} owner不存在:{}, 跳过", PREFIX, task.getId(), task.getOwner()); | |||||
| log.warn("{}:taskID:{} owner不存在:{}, 跳过", TAG_MESSAGE, task.getId(), task.getOwner()); | |||||
| continue; | continue; | ||||
| } | } | ||||
| List<Long> ownerArray = JSONArray.parseArray(owner, Long.class); | List<Long> ownerArray = JSONArray.parseArray(owner, Long.class); | ||||
| @@ -85,7 +155,7 @@ public class InvestSchedule { | |||||
| if (CollectionUtils.isNotEmpty(messageList)) { | if (CollectionUtils.isNotEmpty(messageList)) { | ||||
| for (InvestMessageEntity messageEntity : messageList) { | for (InvestMessageEntity messageEntity : messageList) { | ||||
| if (messageEntity.getTid().equals(task.getId())) { | if (messageEntity.getTid().equals(task.getId())) { | ||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", PREFIX, task.getId(), messageEntity.getId()); | |||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", TAG_MESSAGE, task.getId(), messageEntity.getId()); | |||||
| continue; | continue; | ||||
| } | } | ||||
| addTaskMessage(task, ownerArray); | addTaskMessage(task, ownerArray); | ||||
| @@ -100,7 +170,7 @@ public class InvestSchedule { | |||||
| private void addTaskMessage(InvestTaskEntity task, List<Long> ownerArray) { | private void addTaskMessage(InvestTaskEntity task, List<Long> ownerArray) { | ||||
| String message = String.format(EnumInvestMessageType.TASK_REMIND.getInfo(), task.getId(), DateUtils.format(task.getLastTime())); | String message = String.format(EnumInvestMessageType.TASK_REMIND.getInfo(), task.getId(), DateUtils.format(task.getLastTime())); | ||||
| messageService.saveBatchMessage(ownerArray, message, EnumInvestMessageTag.TASK_MONTH, EnumFollowType.TASK, task.getId(),task.getTenantId()); | messageService.saveBatchMessage(ownerArray, message, EnumInvestMessageTag.TASK_MONTH, EnumFollowType.TASK, task.getId(),task.getTenantId()); | ||||
| log.info("{}:taskID:{} 为用户{}创建消息提醒", PREFIX, task.getId(), task.getOwner()); | |||||
| log.info("{}:taskID:{} 为用户{}创建消息提醒", TAG_MESSAGE, task.getId(), task.getOwner()); | |||||
| } | } | ||||
| private void demandWeekMessage() { | private void demandWeekMessage() { | ||||
| @@ -111,9 +181,9 @@ public class InvestSchedule { | |||||
| //初始化时间条件 | //初始化时间条件 | ||||
| Calendar start = Calendar.getInstance(); | Calendar start = Calendar.getInstance(); | ||||
| if (environment.acceptsProfiles(ENV_STR)) { | if (environment.acceptsProfiles(ENV_STR)) { | ||||
| start.add(Calendar.DAY_OF_YEAR, 1); //测试 | |||||
| start.add(Calendar.DAY_OF_YEAR, -1); //测试 | |||||
| } else { | } else { | ||||
| start.add(Calendar.DAY_OF_YEAR, 7); | |||||
| start.add(Calendar.DAY_OF_YEAR, -7); | |||||
| } | } | ||||
| //查询跟踪列表 | //查询跟踪列表 | ||||
| @@ -122,14 +192,12 @@ public class InvestSchedule { | |||||
| List<InvestCustomerVo> demands = customerService.listByIds(InvestHelper.getIds(follows, InvestFollowRecordEntity::getFollowId), | List<InvestCustomerVo> demands = customerService.listByIds(InvestHelper.getIds(follows, InvestFollowRecordEntity::getFollowId), | ||||
| Arrays.asList(EnumCustomerType.INTENTIONAL, EnumCustomerType.POTENTIAL)); | Arrays.asList(EnumCustomerType.INTENTIONAL, EnumCustomerType.POTENTIAL)); | ||||
| /** | |||||
| * 已经已经提醒过的用户 | |||||
| */ | |||||
| // 已经提醒过的用户 | |||||
| List<String> userDemandFlag = new ArrayList<>(); | List<String> userDemandFlag = new ArrayList<>(); | ||||
| for (InvestCustomerVo customerVo : demands) { | for (InvestCustomerVo customerVo : demands) { | ||||
| Long owner = customerVo.getDemandOwner(); | Long owner = customerVo.getDemandOwner(); | ||||
| if (Objects.isNull(owner)) { | if (Objects.isNull(owner)) { | ||||
| log.warn("{}:customerID:{} owner不存在:{}, 跳过", PREFIX, customerVo.getId(), customerVo.getDemandOwner()); | |||||
| log.warn("{}:customerID:{} owner不存在:{}, 跳过", TAG_MESSAGE, customerVo.getId(), customerVo.getDemandOwner()); | |||||
| continue; | continue; | ||||
| } | } | ||||
| List<InvestMessageEntity> messageList = demandMessageUserIdMap.get(owner); | List<InvestMessageEntity> messageList = demandMessageUserIdMap.get(owner); | ||||
| @@ -138,13 +206,13 @@ public class InvestSchedule { | |||||
| } | } | ||||
| for (InvestMessageEntity messageEntity : messageList) { | for (InvestMessageEntity messageEntity : messageList) { | ||||
| if (messageEntity.getTid().equals(messageEntity.getId())) { | if (messageEntity.getTid().equals(messageEntity.getId())) { | ||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", PREFIX, customerVo.getId(), messageEntity.getId()); | |||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", TAG_MESSAGE, customerVo.getId(), messageEntity.getId()); | |||||
| continue; | continue; | ||||
| } | } | ||||
| String userDemandFlagItem = StringUtils.join(messageEntity.getOwner(), messageEntity.getId()); | String userDemandFlagItem = StringUtils.join(messageEntity.getOwner(), messageEntity.getId()); | ||||
| //已经提醒过的用户不在提醒 | //已经提醒过的用户不在提醒 | ||||
| if (userDemandFlag.contains(userDemandFlagItem)) { | if (userDemandFlag.contains(userDemandFlagItem)) { | ||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", PREFIX, customerVo.getId(), userDemandFlagItem); | |||||
| log.info("{}:taskID:{} 提醒已存在:{}, 跳过", TAG_MESSAGE, customerVo.getId(), userDemandFlagItem); | |||||
| continue; | continue; | ||||
| } | } | ||||
| addCustomerMessage(customerVo, owner); | addCustomerMessage(customerVo, owner); | ||||
| @@ -155,7 +223,42 @@ public class InvestSchedule { | |||||
| private void addCustomerMessage(InvestCustomerVo customerVo, Long owner) { | private void addCustomerMessage(InvestCustomerVo customerVo, Long owner) { | ||||
| String message = String.format(EnumInvestMessageType.COSTOMER_REMIND.getInfo(), customerVo.getId()); | String message = String.format(EnumInvestMessageType.COSTOMER_REMIND.getInfo(), customerVo.getId()); | ||||
| messageService.saveBatchMessage(Arrays.asList(owner), message, EnumInvestMessageTag.CUSTOMER_WEEK, EnumFollowType.DEMAND, customerVo.getId(),customerVo.getTenantId()); | |||||
| log.info("{}:customerID:{} 为用户{}创建消息提醒", PREFIX, customerVo.getId(), customerVo.getDemandOwner()); | |||||
| messageService.saveBatchMessage(Collections.singletonList(owner), message, EnumInvestMessageTag.CUSTOMER_WEEK, EnumFollowType.DEMAND, customerVo.getId(), customerVo.getTenantId()); | |||||
| log.info("{}:customerID:{} 为用户{}创建消息提醒", TAG_MESSAGE, customerVo.getId(), customerVo.getDemandOwner()); | |||||
| } | |||||
| private boolean sendSMS(MallUserInfo userInfo, WxMall mall, InvestRemindEntity remind, InvestCustomerEntity customer) { | |||||
| if (Objects.isNull(userInfo) || Objects.isNull(mall) || Objects.isNull(customer)) { | |||||
| log.warn("{}: 参数为空 : userInfo: {}, mall: {} ,customer:{}", TAG_REMIND, userInfo, mall, customer); | |||||
| return false; | |||||
| } | |||||
| WxMsgRecord wxMsgRecord = new WxMsgRecord(); | |||||
| wxMsgRecord.setMsgType(EnumMsgRecordType.SMS.getCode()); | |||||
| wxMsgRecord.setReceiver(userInfo.getPhone()); | |||||
| wxMsgRecord.setTenantId(mall.getTenantId()); | |||||
| Map<String, String> dynamicContentMap = new HashMap<>(); | |||||
| wxMsgRecord.setModelType(EnumMsgModel.INVEST_REMIND.getCode()); | |||||
| dynamicContentMap.put("mallName", mall.getName()); | |||||
| dynamicContentMap.put("beginDate", DateUtils.formatDateTime(remind.getBeginDate())); | |||||
| dynamicContentMap.put("negotiationType", convet(remind.getNegotiationType())); | |||||
| dynamicContentMap.put("customerName", customer.getName()); | |||||
| wxMsgRecord.setDynamicContentMap(dynamicContentMap); | |||||
| mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); | |||||
| return true; | |||||
| } | |||||
| private String convet(EnumNegotiationType type) { | |||||
| String message = ""; | |||||
| if (Objects.equals(type, EnumNegotiationType.TO_VISIT)) { | |||||
| message = "预约拜访"; | |||||
| } else if (Objects.equals(type, EnumNegotiationType.COME_VISIT)) { | |||||
| message = "需接待来访"; | |||||
| } else if (Objects.equals(type, EnumNegotiationType.TELEPHONE)) { | |||||
| message = "需电话联系"; | |||||
| } else if (Objects.equals(type, EnumNegotiationType.MESSAGE)) { | |||||
| message = "需短信、微信或其他方式联系"; | |||||
| } | |||||
| return message; | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,8 +1,6 @@ | |||||
| package com.iformall.domain.po.invest; | package com.iformall.domain.po.invest; | ||||
| import cn.afterturn.easypoi.excel.annotation.Excel; | import cn.afterturn.easypoi.excel.annotation.Excel; | ||||
| import com.baomidou.mybatisplus.annotation.FieldStrategy; | |||||
| import com.baomidou.mybatisplus.annotation.TableField; | |||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||
| @@ -11,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; | |||||
| import com.iformall.common.LogColumn; | import com.iformall.common.LogColumn; | ||||
| import com.iformall.enums.EnumCustomerRatingType; | import com.iformall.enums.EnumCustomerRatingType; | ||||
| import com.iformall.enums.EnumCustomerType; | import com.iformall.enums.EnumCustomerType; | ||||
| import com.iformall.enums.EnumInvestChannel; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||
| @@ -1,10 +1,13 @@ | |||||
| package com.iformall.domain.po.invest; | package com.iformall.domain.po.invest; | ||||
| import com.baomidou.mybatisplus.annotation.TableField; | |||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import com.fasterxml.jackson.annotation.JsonFormat; | |||||
| import com.fasterxml.jackson.annotation.JsonIgnore; | |||||
| import com.iformall.enums.EnumInvestRemindStatus; | |||||
| import com.iformall.enums.EnumNegotiationType; | |||||
| import lombok.Data; | import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||
| @@ -57,4 +60,21 @@ public class InvestRemindEntity extends InvestBaseEntity { | |||||
| */ | */ | ||||
| @io.swagger.annotations.ApiModelProperty(value = "结束时间", name = "endDate" ,example = "2018-10-01") | @io.swagger.annotations.ApiModelProperty(value = "结束时间", name = "endDate" ,example = "2018-10-01") | ||||
| private Date endDate; | private Date endDate; | ||||
| /** | |||||
| * 是否提醒:0-未提醒;1-已提醒 | |||||
| */ | |||||
| //@io.swagger.annotations.ApiModelProperty(value = "结束时间", name = "status") | |||||
| @JsonIgnore | |||||
| @TableField(value = "`status`") | |||||
| private EnumInvestRemindStatus status; | |||||
| /** | |||||
| * 提醒用户InvestRemindEntity | |||||
| */ | |||||
| @io.swagger.annotations.ApiModelProperty(value = "customerId", name = "customerId") | |||||
| private Long customerId; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "拜访方式:0-拜访;1-来访;2-电话;3-短信、微信或其它", name = "negotiationType") | |||||
| private EnumNegotiationType negotiationType; | |||||
| } | } | ||||
| @@ -9,10 +9,10 @@ import lombok.EqualsAndHashCode; | |||||
| public class InvestDemandQuery extends InvestPageQuery { | public class InvestDemandQuery extends InvestPageQuery { | ||||
| /** | /** | ||||
| * 客户编号 | |||||
| * 客户手机号 | |||||
| */ | */ | ||||
| @io.swagger.annotations.ApiModelProperty(value = "客户编号", name = "customerNo") | |||||
| private String customerNo; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "客户手机号", name = "phone") | |||||
| private String phone; | |||||
| /** | /** | ||||
| * 客户分类:0-潜在客户;1-意向客户;2-合作客户;3-谈判失败 | * 客户分类:0-潜在客户;1-意向客户;2-合作客户;3-谈判失败 | ||||
| @@ -15,18 +15,10 @@ public class InvestRemindVo extends InvestRemindEntity { | |||||
| @io.swagger.annotations.ApiModelProperty(value = "ownerInfo", name = "ownerInfo") | @io.swagger.annotations.ApiModelProperty(value = "ownerInfo", name = "ownerInfo") | ||||
| private MallUserInfo ownerInfo; | private MallUserInfo ownerInfo; | ||||
| /** | |||||
| * 提醒用户InvestRemindEntity | |||||
| */ | |||||
| @io.swagger.annotations.ApiModelProperty(value = "customerId", name = "customerId") | |||||
| private Long customerId; | |||||
| @io.swagger.annotations.ApiModelProperty(value = "customer", name = "customer") | @io.swagger.annotations.ApiModelProperty(value = "customer", name = "customer") | ||||
| private InvestCustomerEntity customer; | private InvestCustomerEntity customer; | ||||
| @io.swagger.annotations.ApiModelProperty(value = "brand", name = "brand") | @io.swagger.annotations.ApiModelProperty(value = "brand", name = "brand") | ||||
| private WxBrand brand; | private WxBrand brand; | ||||
| @io.swagger.annotations.ApiModelProperty(value = "拜访方式:0-拜访;1-来访;2-电话;3-短信、微信或其它", name = "negotiationType") | |||||
| private EnumNegotiationType negotiationType; | |||||
| } | } | ||||
| @@ -0,0 +1,40 @@ | |||||
| package com.iformall.enums; | |||||
| import com.baomidou.mybatisplus.annotation.EnumValue; | |||||
| import com.fasterxml.jackson.annotation.JsonValue; | |||||
| /** | |||||
| * 是否提醒:0-未提醒;1-已提醒 | |||||
| */ | |||||
| public enum EnumInvestRemindStatus { | |||||
| UN_REMINDED(0, "未提醒"), | |||||
| REMINDED(1, "已提醒"), | |||||
| ; | |||||
| public static EnumInvestRemindStatus getEnum(Integer code) { | |||||
| for (EnumInvestRemindStatus value : values()) { | |||||
| if (value.getCode().equals(code)) { | |||||
| return value; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| @EnumValue | |||||
| private final Integer code; | |||||
| private final String info; | |||||
| EnumInvestRemindStatus(Integer code, String info) { | |||||
| this.code = code; | |||||
| this.info = info; | |||||
| } | |||||
| @JsonValue | |||||
| public Integer getCode() { | |||||
| return code; | |||||
| } | |||||
| public String getInfo() { | |||||
| return info; | |||||
| } | |||||
| } | |||||
| @@ -36,6 +36,8 @@ public enum EnumMsgModel { | |||||
| COUPON_BIRTHDAY_OPENED_NO(29, "会员生日券倍率未开启"), | COUPON_BIRTHDAY_OPENED_NO(29, "会员生日券倍率未开启"), | ||||
| COUPON_CARD_SEND(30, "系统发卡"), | COUPON_CARD_SEND(30, "系统发卡"), | ||||
| INVEST_REMIND(31, "招商预约提醒"), | |||||
| ; | ; | ||||
| public static EnumMsgModel getEnum(Integer code) { | public static EnumMsgModel getEnum(Integer code) { | ||||
| @@ -22,6 +22,10 @@ public enum EnumMsgModelReplace { | |||||
| R14("{page}", "【管理端】"), | R14("{page}", "【管理端】"), | ||||
| R15("{bustype}", "【任务类型】"), | R15("{bustype}", "【任务类型】"), | ||||
| R16("{contract}", "【合同编号】"), | R16("{contract}", "【合同编号】"), | ||||
| R17("{mallName}", "【商户名称】"), | |||||
| R18("{beginDate}", "【开始时间】"), | |||||
| R19("{negotiationType}", "【洽谈方式】"), | |||||
| R20("{customerName}", "【客户负责人】"), | |||||
| ; | ; | ||||
| public static EnumMsgModelReplace getEnum(Integer code) { | public static EnumMsgModelReplace getEnum(Integer code) { | ||||
| @@ -22,8 +22,8 @@ public enum EnumNegotiationType { | |||||
| return null; | return null; | ||||
| } | } | ||||
| private final Integer code; | |||||
| @EnumValue | @EnumValue | ||||
| private final Integer code; | |||||
| private final String info; | private final String info; | ||||
| EnumNegotiationType(Integer code, String info) { | EnumNegotiationType(Integer code, String info) { | ||||
| @@ -1292,15 +1292,15 @@ public class WxBillAllServiceImpl implements WxBillAllService { | |||||
| JSONArray priceDetals = new JSONArray(); | JSONArray priceDetals = new JSONArray(); | ||||
| JSONObject priceDetal = new JSONObject(); | JSONObject priceDetal = new JSONObject(); | ||||
| priceDetal.put("key", "price"); | priceDetal.put("key", "price"); | ||||
| priceDetal.put("value", 0); | |||||
| priceDetal.put("value", 1); | |||||
| priceDetals.add(priceDetal); | priceDetals.add(priceDetal); | ||||
| priceDetal = new JSONObject(); | priceDetal = new JSONObject(); | ||||
| priceDetal.put("key", "way"); | priceDetal.put("key", "way"); | ||||
| priceDetal.put("value", 0); | |||||
| priceDetal.put("value", 1); | |||||
| priceDetals.add(priceDetal); | priceDetals.add(priceDetal); | ||||
| priceDetal = new JSONObject(); | priceDetal = new JSONObject(); | ||||
| priceDetal.put("key", "unit"); | priceDetal.put("key", "unit"); | ||||
| priceDetal.put("value", 0); | |||||
| priceDetal.put("value", 1); | |||||
| priceDetals.add(priceDetal); | priceDetals.add(priceDetal); | ||||
| daily.setPriceDetail(JSONArray.toJSONString(priceDetals)); | daily.setPriceDetail(JSONArray.toJSONString(priceDetals)); | ||||
| wxBillDailyMapper.insert(daily); | wxBillDailyMapper.insert(daily); | ||||
| @@ -23,6 +23,8 @@ public interface InvestBizService { | |||||
| void importCustomer(@RequestParam("file") MultipartFile mFile); | void importCustomer(@RequestParam("file") MultipartFile mFile); | ||||
| Map queryCustomerImportCount() ; | |||||
| List<InvestDemandVo> queryCustomer(); | List<InvestDemandVo> queryCustomer(); | ||||
| InvestPageResult<InvestTaskVo> queryPageTask(InvestTaskQuery params); | InvestPageResult<InvestTaskVo> queryPageTask(InvestTaskQuery params); | ||||
| @@ -61,4 +63,6 @@ public interface InvestBizService { | |||||
| InvestFollowRecordVo findFollowRecordById(Long id) ; | InvestFollowRecordVo findFollowRecordById(Long id) ; | ||||
| Map<String, Object> statistics(); | |||||
| } | } | ||||
| @@ -2,8 +2,8 @@ package com.iformall.service.invest; | |||||
| import com.baomidou.mybatisplus.extension.service.IService; | import com.baomidou.mybatisplus.extension.service.IService; | ||||
| import com.iformall.domain.po.invest.InvestRemindEntity; | import com.iformall.domain.po.invest.InvestRemindEntity; | ||||
| import com.iformall.domain.vo.invest.InvestPageQuery; | |||||
| import com.iformall.domain.vo.invest.InvestPageResult; | |||||
| import java.util.List; | |||||
| /** | /** | ||||
| * 招商提醒 | * 招商提醒 | ||||
| @@ -17,5 +17,7 @@ public interface InvestRemindService extends IService<InvestRemindEntity>,Invest | |||||
| //InvestPageResult<InvestRemindEntity> queryPage(InvestPageQuery<InvestRemindEntity> params); | //InvestPageResult<InvestRemindEntity> queryPage(InvestPageQuery<InvestRemindEntity> params); | ||||
| boolean removeAll() ; | boolean removeAll() ; | ||||
| List<InvestRemindEntity> findUnRemindList(); | |||||
| } | } | ||||
| @@ -38,7 +38,6 @@ import org.springframework.web.multipart.MultipartFile; | |||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
| import java.io.*; | import java.io.*; | ||||
| import java.time.temporal.TemporalAmount; | |||||
| import java.util.*; | import java.util.*; | ||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
| import java.util.function.Function; | import java.util.function.Function; | ||||
| @@ -90,7 +89,7 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| } | } | ||||
| List<InvestDemandEntity> demandList = demandService.list(new LambdaQueryWrapper<>(demandParams)); | List<InvestDemandEntity> demandList = demandService.list(new LambdaQueryWrapper<>(demandParams)); | ||||
| LambdaQueryWrapper<InvestCustomerEntity> queryWrapperCustomer = new LambdaQueryWrapper<>(customerParams); | LambdaQueryWrapper<InvestCustomerEntity> queryWrapperCustomer = new LambdaQueryWrapper<>(customerParams); | ||||
| queryWrapperCustomer.like(StringUtils.isNotBlank(params.getCustomerNo()), InvestCustomerEntity::getCustomerNo, params.getCustomerNo()); | |||||
| queryWrapperCustomer.like(StringUtils.isNotBlank(params.getPhone()), InvestCustomerEntity::getPhone, params.getPhone()); | |||||
| if (Objects.isNull(InvestUserContext.getDataUser())) { | if (Objects.isNull(InvestUserContext.getDataUser())) { | ||||
| if (CollectionUtils.isEmpty(demandList) && Objects.nonNull(params.getDemandOwner())) { | if (CollectionUtils.isEmpty(demandList) && Objects.nonNull(params.getDemandOwner())) { | ||||
| @@ -227,10 +226,44 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| } | } | ||||
| } | } | ||||
| doImport(lFile, tenantId, importKey); | |||||
| doImport(lFile, importKey); | |||||
| } | } | ||||
| private void doImport(File file, String tenantId, String importKey) { | |||||
| @Override | |||||
| public Map queryCustomerImportCount() { | |||||
| String importKey = Constant.importInvestCustomerPrev + InvestUserContext.getUserId(); | |||||
| Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(importKey); | |||||
| log.info(JSONArray.toJSONString(entries) + ">>>>>>>>>>>>>>>>>>>>>1"); | |||||
| if (entries.size() < 4) { | |||||
| entries.clear(); | |||||
| return entries; | |||||
| } | |||||
| String allCount = entries.get("allCount").toString(); | |||||
| String allSuccessCount = entries.get("allSuccessCount").toString(); | |||||
| String processCount = entries.get("processCount").toString(); | |||||
| String failCount = entries.get("failCount").toString(); | |||||
| if (StringUtils.isNotBlank(failCount) && allCount.equals(failCount)) {//stringRedisTemplate.expire(userId,1,TimeUnit.SECONDS); | |||||
| log.info(JSONArray.toJSONString(entries) + ">>>>>>>>>>>>>>>>>>>>>2"); | |||||
| //完全失败 | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "allCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "allSuccessCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "processCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "failCount"); | |||||
| throw new MallinkException(ErrorCode.MEM_IMPORT_ERR); | |||||
| } | |||||
| //导入完成 | |||||
| if (StringUtils.isNotBlank(allSuccessCount) && allSuccessCount.equals(processCount)) { | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "allCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "allSuccessCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "processCount"); | |||||
| stringRedisTemplate.opsForHash().delete(importKey, "failCount"); | |||||
| return entries; | |||||
| } | |||||
| return entries; | |||||
| } | |||||
| private void doImport(File file, String importKey) { | |||||
| ImportParams params = new ImportParams(); | ImportParams params = new ImportParams(); | ||||
| // 需要验证 | // 需要验证 | ||||
| params.setImportFields(new String[]{"品牌*", "品牌负责人*", "负责人电话*", "经营业态*", "意向铺位*", "意向租凭面积", "预计开业时间"}); | params.setImportFields(new String[]{"品牌*", "品牌负责人*", "负责人电话*", "经营业态*", "意向铺位*", "意向租凭面积", "预计开业时间"}); | ||||
| @@ -335,7 +368,7 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| log.error("经营业态为空", customer.toString()); | log.error("经营业态为空", customer.toString()); | ||||
| return; | return; | ||||
| } | } | ||||
| InvestDemandDto toImportCustomer = convetCustomer(customer, brandMap, businesseMap, shopMap, customerMap.get(customer.getPhone()), demandMap); | |||||
| InvestDemandDto toImportCustomer = convetCustomer(importKey, customer, brandMap, businesseMap, shopMap, customerMap.get(customer.getPhone()), demandMap); | |||||
| if (toImportCustomer == null) { | if (toImportCustomer == null) { | ||||
| stringRedisTemplate.opsForHash().increment(importKey, "processCount", 1); | stringRedisTemplate.opsForHash().increment(importKey, "processCount", 1); | ||||
| log.error("customerBase null"); | log.error("customerBase null"); | ||||
| @@ -347,13 +380,14 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| toImportCustomer.getCustomer().setId(customerMap.get(customer.getPhone()).getId()); | toImportCustomer.getCustomer().setId(customerMap.get(customer.getPhone()).getId()); | ||||
| updateCustomerAndDemand(toImportCustomer); | updateCustomerAndDemand(toImportCustomer); | ||||
| } | } | ||||
| //记数 | |||||
| stringRedisTemplate.opsForHash().increment(importKey,"processCount",1); | |||||
| stringRedisTemplate.expire(importKey,10, TimeUnit.SECONDS); | |||||
| }); | }); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| setRedisValue(importKey, "1", "0", "0", "1", true); | setRedisValue(importKey, "1", "0", "0", "1", true); | ||||
| log.error("导入模板失败", e); | log.error("导入模板失败", e); | ||||
| throw new MallinkException(ErrorCode.MEM_IMPORT_ERR.getCode(), "导入模板失败"); | throw new MallinkException(ErrorCode.MEM_IMPORT_ERR.getCode(), "导入模板失败"); | ||||
| } finally { | |||||
| stringRedisTemplate.expire(importKey, 3, TimeUnit.SECONDS); | |||||
| } | } | ||||
| } | } | ||||
| @@ -367,7 +401,7 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| return getMap(brands, WxBrand::getName); | return getMap(brands, WxBrand::getName); | ||||
| } | } | ||||
| private InvestDemandDto convetCustomer(InvestCustomerVo importCustomerVo, Map<String, WxBrand> brandMap, Map<String, WxBusiness> businesseMap, Map<String, WxShop> shopMap, InvestCustomerEntity dbCustomer, Map<Long, InvestDemandEntity> demandMap) { | |||||
| private InvestDemandDto convetCustomer(String importKey, InvestCustomerVo importCustomerVo, Map<String, WxBrand> brandMap, Map<String, WxBusiness> businesseMap, Map<String, WxShop> shopMap, InvestCustomerEntity dbCustomer, Map<Long, InvestDemandEntity> demandMap) { | |||||
| InvestCustomerEntity customerEntity = null; | InvestCustomerEntity customerEntity = null; | ||||
| InvestDemandEntity demandEntity = null; | InvestDemandEntity demandEntity = null; | ||||
| if (Objects.isNull(dbCustomer)) { | if (Objects.isNull(dbCustomer)) { | ||||
| @@ -380,16 +414,19 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| demandEntity = new InvestDemandEntity(); | demandEntity = new InvestDemandEntity(); | ||||
| } | } | ||||
| if (Objects.isNull(brandMap.get(importCustomerVo.getBrandName()))) { | if (Objects.isNull(brandMap.get(importCustomerVo.getBrandName()))) { | ||||
| log.warn("品牌:{} 不存在", importCustomerVo.getBrandName()); | |||||
| return null; | return null; | ||||
| } | } | ||||
| customerEntity.setBrandId(brandMap.get(importCustomerVo.getBrandName()).getId()); | customerEntity.setBrandId(brandMap.get(importCustomerVo.getBrandName()).getId()); | ||||
| if (Objects.isNull(businesseMap.get(importCustomerVo.getBusiness()))) { | if (Objects.isNull(businesseMap.get(importCustomerVo.getBusiness()))) { | ||||
| log.warn("业态:{} 不存在", importCustomerVo.getBusiness()); | |||||
| return null; | return null; | ||||
| } | } | ||||
| customerEntity.setBusinessId(businesseMap.get(importCustomerVo.getBusiness()).getId()); | customerEntity.setBusinessId(businesseMap.get(importCustomerVo.getBusiness()).getId()); | ||||
| if (Objects.isNull(shopMap.get(importCustomerVo.getShopNumber()))) { | if (Objects.isNull(shopMap.get(importCustomerVo.getShopNumber()))) { | ||||
| log.warn("意向铺位:{} 不存在", importCustomerVo.getShopNumber()); | |||||
| return null; | return null; | ||||
| } | } | ||||
| customerEntity.setName(importCustomerVo.getName()); | customerEntity.setName(importCustomerVo.getName()); | ||||
| @@ -620,7 +657,7 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| LambdaQueryWrapper<InvestRemindEntity> queryWrapper = new LambdaQueryWrapper<>(); | LambdaQueryWrapper<InvestRemindEntity> queryWrapper = new LambdaQueryWrapper<>(); | ||||
| queryWrapper.eq(InvestRemindEntity::getTenantId,InvestUserContext.getUser().getTenantId()); | queryWrapper.eq(InvestRemindEntity::getTenantId,InvestUserContext.getUser().getTenantId()); | ||||
| queryWrapper.apply(Objects.nonNull(params.getRemindDate()), | queryWrapper.apply(Objects.nonNull(params.getRemindDate()), | ||||
| "date_format(begin_date,'%Y-%m-%d') >= {0} AND date_format(end_date,'%Y-%m-%d') <= {1}" | |||||
| "date_format(begin_date,'%Y-%m-%d') >= {0} AND date_format(end_date,'%Y-%m-%d') < {1}" | |||||
| , getDayStart(params.getRemindDate()) | , getDayStart(params.getRemindDate()) | ||||
| , getDayEnd(params.getRemindDate())); | , getDayEnd(params.getRemindDate())); | ||||
| queryWrapper.orderByDesc(InvestRemindEntity::getCreateDate); | queryWrapper.orderByDesc(InvestRemindEntity::getCreateDate); | ||||
| @@ -888,6 +925,10 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| List<WxBusiness> businesses = businessService.listAsPage(null, 1, Integer.MAX_VALUE).getList(); | List<WxBusiness> businesses = businessService.listAsPage(null, 1, Integer.MAX_VALUE).getList(); | ||||
| Map<Integer, WxBusiness> businesseMap = getMap(businesses, WxBusiness::getId); | Map<Integer, WxBusiness> businesseMap = getMap(businesses, WxBusiness::getId); | ||||
| //业态信息 | |||||
| List<WxShop> shopList = shopService.listAsPage(null, 1, Integer.MAX_VALUE).getList(); | |||||
| Map<Long, WxShop> shopMap = getMap(shopList, WxShop::getId); | |||||
| List<InvestOperateRecordVo> resultList = new ArrayList<>(); | List<InvestOperateRecordVo> resultList = new ArrayList<>(); | ||||
| for (InvestOperateRecordEntity recordEntity : recordList) { | for (InvestOperateRecordEntity recordEntity : recordList) { | ||||
| InvestOperateRecordVo itemVo = new InvestOperateRecordVo(); | InvestOperateRecordVo itemVo = new InvestOperateRecordVo(); | ||||
| @@ -926,6 +967,15 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| if (Objects.nonNull(userAfter)) { | if (Objects.nonNull(userAfter)) { | ||||
| tableTriple.setAfter(userAfter.getName()); | tableTriple.setAfter(userAfter.getName()); | ||||
| } | } | ||||
| } else if (Objects.equals(column, "targetId")) { | |||||
| WxShop shopBefore = shopMap.get(tableTriple.getBefore()); | |||||
| WxShop shopAfter = shopMap.get(tableTriple.getAfter()); | |||||
| if (Objects.nonNull(shopBefore)) { | |||||
| tableTriple.setBefore(shopBefore.getShopNumber()); | |||||
| } | |||||
| if (Objects.nonNull(shopAfter)) { | |||||
| tableTriple.setAfter(shopAfter.getShopNumber()); | |||||
| } | |||||
| } | } | ||||
| return tableTriple; | return tableTriple; | ||||
| })); | })); | ||||
| @@ -962,19 +1012,52 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| return buildFollowRecordItem(usersMap, followRecordEntity, customerEntity, brand); | return buildFollowRecordItem(usersMap, followRecordEntity, customerEntity, brand); | ||||
| } | } | ||||
| @Override | |||||
| public Map<String, Object> statistics() { | |||||
| Map<String, Object> result = new HashMap<>(); | |||||
| if (Objects.isNull(InvestUserContext.getDataUser())) { | |||||
| result.put("taskTotal", taskService.count(new LambdaQueryWrapper<InvestTaskEntity>() | |||||
| .ge(InvestTaskEntity::getStatus, EnumTaskStatus.CREATED) | |||||
| .eq(InvestTaskEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| result.put("customerTotal", customerService.count(new LambdaQueryWrapper<InvestCustomerEntity>() | |||||
| .ge(InvestCustomerEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| result.put("taskToday", customerService.count(new LambdaQueryWrapper<InvestCustomerEntity>() | |||||
| .apply("date_format(create_date,'%Y-%m-%d') = {0}", DateUtils.format(new Date())) | |||||
| .eq(InvestCustomerEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| result.put("customerImport", customerService.count(new LambdaQueryWrapper<InvestCustomerEntity>() | |||||
| .eq(InvestCustomerEntity::getType, EnumCustomerType.INTENTIONAL) | |||||
| .eq(InvestCustomerEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| result.put("remindCount", remindService.count(new LambdaQueryWrapper<InvestRemindEntity>() | |||||
| .ge(InvestRemindEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| result.put("taskCreate", taskService.count(new LambdaQueryWrapper<InvestTaskEntity>() | |||||
| .eq(InvestTaskEntity::getStatus, EnumTaskStatus.CREATED) | |||||
| .eq(InvestTaskEntity::getTenantId, InvestUserContext.getUser().getTenantId()))); | |||||
| //result.put("customerCreate", customerService.count(new LambdaQueryWrapper<InvestCustomerEntity>() | |||||
| // .eq(InvestCustomerEntity::getStatus, EnumTaskStatus.CREATED))); | |||||
| } else { | |||||
| result.put("taskTotal", taskService.count(new LambdaQueryWrapper<InvestTaskEntity>() | |||||
| .ge(InvestTaskEntity::getStatus, EnumTaskStatus.CREATED) | |||||
| .apply("`owner` REGEXP {0}", InvestUserContext.getUserId()))); | |||||
| result.put("customerTotal", demandService.count(new LambdaQueryWrapper<InvestDemandEntity>() | |||||
| .ge(InvestDemandEntity::getOwner, InvestUserContext.getUser().getTenantId()))); | |||||
| } | |||||
| return result; | |||||
| } | |||||
| private void syncTargetStatus(InvestTaskEntity investTaskEntity) { | private void syncTargetStatus(InvestTaskEntity investTaskEntity) { | ||||
| //if (!Objects.equals(investTaskEntity.getTargetType(), EnumInvestType.RENT)) { | //if (!Objects.equals(investTaskEntity.getTargetType(), EnumInvestType.RENT)) { | ||||
| // return; | // return; | ||||
| //} | //} | ||||
| if (StringUtils.isNotBlank(investTaskEntity.getOwner())) { | |||||
| investTaskEntity.setStatus(EnumTaskStatus.NEGOTIATING); | |||||
| if (StringUtils.isBlank(investTaskEntity.getOwner())) { | |||||
| investTaskEntity.setStatus(EnumTaskStatus.CREATED); | |||||
| } else { | } else { | ||||
| WxShop shop = shopService.getById(investTaskEntity.getTargetId()); | WxShop shop = shopService.getById(investTaskEntity.getTargetId()); | ||||
| Map<Long, WxRentContract> shopContractMap = getWxRentContractMap(shop); | Map<Long, WxRentContract> shopContractMap = getWxRentContractMap(shop); | ||||
| WxRentContract contract = shopContractMap.get(shop.getId()); | WxRentContract contract = shopContractMap.get(shop.getId()); | ||||
| if (Objects.nonNull(contract)) { | if (Objects.nonNull(contract)) { | ||||
| InvestHelper.addContractId(investTaskEntity.getContent(), contract.getId(), null); | InvestHelper.addContractId(investTaskEntity.getContent(), contract.getId(), null); | ||||
| investTaskEntity.setStatus(EnumTaskStatus.FINISH); | |||||
| } else { | } else { | ||||
| WxRentContract contractQuery = new WxRentContract(); | WxRentContract contractQuery = new WxRentContract(); | ||||
| contractQuery.setTenantId(InvestUserContext.getUser().getTenantId()); | contractQuery.setTenantId(InvestUserContext.getUser().getTenantId()); | ||||
| @@ -984,6 +1067,8 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| int count = rentContractService.selectContractCountByShopId(contractQuery); | int count = rentContractService.selectContractCountByShopId(contractQuery); | ||||
| if (count > 0) { | if (count > 0) { | ||||
| investTaskEntity.setStatus(EnumTaskStatus.INTENTION); | investTaskEntity.setStatus(EnumTaskStatus.INTENTION); | ||||
| } else { | |||||
| investTaskEntity.setStatus(EnumTaskStatus.NEGOTIATING); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1115,10 +1200,14 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| Map<Integer, WxBusiness> bussinessMap = getMap(businessService.getByIds(getIds(customers, InvestCustomerEntity::getBusinessId)), WxBusiness::getId); | Map<Integer, WxBusiness> bussinessMap = getMap(businessService.getByIds(getIds(customers, InvestCustomerEntity::getBusinessId)), WxBusiness::getId); | ||||
| List<InvestCustomerVo> resultList = new ArrayList<>(); | List<InvestCustomerVo> resultList = new ArrayList<>(); | ||||
| for (InvestCustomerEntity costomerItem : customers) { | for (InvestCustomerEntity costomerItem : customers) { | ||||
| Optional<InvestDemandEntity> demandItem = Optional.ofNullable(demindsMap.get(costomerItem.getId())); | |||||
| WxShop shop = shopsMap.get(demandItem.orElse(null)); | |||||
| WxBrand brand = brandMap.get(costomerItem.getBrandId()); | |||||
| resultList.add(buildCustomerItem(demandItem.orElse(null), costomerItem, brand, shop, bussinessMap.get(costomerItem.getBusinessId()))); | |||||
| InvestDemandEntity demandItem = demindsMap.get(costomerItem.getId()); | |||||
| WxShop shop = null; | |||||
| WxBrand brand = null ; | |||||
| if (Objects.nonNull(demandItem)) { | |||||
| shop = shopsMap.get(demandItem.getTargetId()); | |||||
| brand = brandMap.get(costomerItem.getBrandId()); | |||||
| } | |||||
| resultList.add(buildCustomerItem(demandItem, costomerItem, brand, shop, bussinessMap.get(costomerItem.getBusinessId()))); | |||||
| } | } | ||||
| return resultList; | return resultList; | ||||
| } | } | ||||
| @@ -1137,10 +1226,14 @@ public class InvestBizServiceImpl implements InvestBizService { | |||||
| List<InvestDemandVo> resultList = new ArrayList<>(); | List<InvestDemandVo> resultList = new ArrayList<>(); | ||||
| for (InvestCustomerEntity costomerItem : customers) { | for (InvestCustomerEntity costomerItem : customers) { | ||||
| Optional<InvestDemandEntity> demandItem = Optional.ofNullable(demindsMap.get(costomerItem.getId())); | |||||
| WxShop shop = shopsMap.get(demandItem.orElse(null)); | |||||
| WxBrand brand = brandMap.get(costomerItem.getBrandId()); | |||||
| resultList.add(buildDemindItem(demandItem.orElse(null), costomerItem, brand, shop, usersMap)); | |||||
| InvestDemandEntity demandItem = demindsMap.get(costomerItem.getId()); | |||||
| WxShop shop = null; | |||||
| WxBrand brand = null ; | |||||
| if (Objects.nonNull(demandItem)) { | |||||
| shop = shopsMap.get(demandItem.getTargetId()); | |||||
| brand = brandMap.get(costomerItem.getBrandId()); | |||||
| } | |||||
| resultList.add(buildDemindItem(demandItem, costomerItem, brand, shop, usersMap)); | |||||
| } | } | ||||
| return resultList; | return resultList; | ||||
| } | } | ||||
| @@ -44,6 +44,7 @@ public class InvestCustomerServiceImpl extends InvestBaseServiceImpl<InvestCusto | |||||
| @TableLog | @TableLog | ||||
| @Override | @Override | ||||
| public boolean updateById(InvestCustomerEntity entity) { | public boolean updateById(InvestCustomerEntity entity) { | ||||
| return super.updateByIdAction(entity, this::checkBeforeSaveOrUpdate); | return super.updateByIdAction(entity, this::checkBeforeSaveOrUpdate); | ||||
| } | } | ||||
| @@ -44,13 +44,14 @@ public class InvestDemandServiceImpl extends InvestBaseServiceImpl<InvestDemandM | |||||
| private void checkBeforeSaveOrUpdate(InvestDemandEntity entity) { | private void checkBeforeSaveOrUpdate(InvestDemandEntity entity) { | ||||
| checkCustomerExit(customerService, entity.getCustomerId()); | checkCustomerExit(customerService, entity.getCustomerId()); | ||||
| checkUserExit(userInfoService, entity.getOwner()); | |||||
| checkShop(shopService, entity); | checkShop(shopService, entity); | ||||
| if(Objects.nonNull(entity.getIntent())) { | |||||
| if (Objects.nonNull(entity.getIntent())) { | |||||
| entity.setIntent(stringToJson(entity.getIntent())); | entity.setIntent(stringToJson(entity.getIntent())); | ||||
| } | } | ||||
| if(Objects.isNull(entity.getOwner())) { | |||||
| if (Objects.isNull(entity.getOwner()) || Objects.equals(entity.getOwner(), 0L)) { | |||||
| entity.setOwner(0L); | entity.setOwner(0L); | ||||
| } else { | |||||
| checkUserExit(userInfoService, entity.getOwner()); | |||||
| } | } | ||||
| } | } | ||||
| @@ -41,7 +41,7 @@ public class InvestFollowRecordServiceImpl extends InvestBaseServiceImpl<InvestF | |||||
| public List<InvestFollowRecordEntity> listByTime(EnumFollowType followType, Date start) { | public List<InvestFollowRecordEntity> listByTime(EnumFollowType followType, Date start) { | ||||
| LambdaUpdateWrapper<InvestFollowRecordEntity> query = new LambdaUpdateWrapper<>() ; | LambdaUpdateWrapper<InvestFollowRecordEntity> query = new LambdaUpdateWrapper<>() ; | ||||
| query.eq(InvestFollowRecordEntity::getType,followType) ; | query.eq(InvestFollowRecordEntity::getType,followType) ; | ||||
| query.ge(InvestFollowRecordEntity::getCreateDate, start); | |||||
| query.le(InvestFollowRecordEntity::getCreateDate, start); | |||||
| return list(query); | return list(query); | ||||
| } | } | ||||
| @@ -66,7 +66,7 @@ public class InvestMessageServiceImpl extends InvestBaseServiceImpl<InvestMessag | |||||
| public List<InvestMessageEntity> listByTypeAndTag(EnumFollowType type, EnumInvestMessageTag tag) { | public List<InvestMessageEntity> listByTypeAndTag(EnumFollowType type, EnumInvestMessageTag tag) { | ||||
| LambdaQueryWrapper<InvestMessageEntity> messageQueryWrapper = new LambdaQueryWrapper<>(); | LambdaQueryWrapper<InvestMessageEntity> messageQueryWrapper = new LambdaQueryWrapper<>(); | ||||
| messageQueryWrapper.eq(InvestMessageEntity::getType, type); | messageQueryWrapper.eq(InvestMessageEntity::getType, type); | ||||
| messageQueryWrapper.ge(InvestMessageEntity::getTag, tag); | |||||
| messageQueryWrapper.eq(InvestMessageEntity::getTag, tag); | |||||
| return list(messageQueryWrapper); | return list(messageQueryWrapper); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,13 +1,21 @@ | |||||
| package com.iformall.service.invest.impl; | package com.iformall.service.invest.impl; | ||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.baomidou.mybatisplus.core.conditions.Wrapper; | import com.baomidou.mybatisplus.core.conditions.Wrapper; | ||||
| import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||||
| import com.iformall.domain.po.invest.InvestRemindEntity; | import com.iformall.domain.po.invest.InvestRemindEntity; | ||||
| import com.iformall.domain.vo.invest.InvestUserContext; | import com.iformall.domain.vo.invest.InvestUserContext; | ||||
| import com.iformall.enums.EnumInvestRemindStatus; | |||||
| import com.iformall.enums.EnumNegotiationType; | |||||
| import com.iformall.mapper.InvestRemindMapper; | import com.iformall.mapper.InvestRemindMapper; | ||||
| import com.iformall.service.invest.InvestRemindService; | import com.iformall.service.invest.InvestRemindService; | ||||
| import com.iformall.utils.DateUtils; | |||||
| import org.apache.commons.collections.MapUtils; | |||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.Objects; | import java.util.Objects; | ||||
| @@ -42,10 +50,25 @@ public class InvestRemindServiceImpl extends InvestBaseServiceImpl<InvestRemindM | |||||
| return super.remove(wrapper); | return super.remove(wrapper); | ||||
| } | } | ||||
| @Override | |||||
| public List<InvestRemindEntity> findUnRemindList() { | |||||
| LambdaUpdateWrapper<InvestRemindEntity> wrapper = new LambdaUpdateWrapper<>(); | |||||
| wrapper.eq(InvestRemindEntity::getStatus, EnumInvestRemindStatus.UN_REMINDED); | |||||
| wrapper.gt(InvestRemindEntity::getBeginDate, DateUtils.formatDateTime(new Date())); | |||||
| return this.list(wrapper); | |||||
| } | |||||
| private void checkBeforeSaveOrUpdate(InvestRemindEntity input) { | private void checkBeforeSaveOrUpdate(InvestRemindEntity input) { | ||||
| input.setOwner(InvestUserContext.getUserId()); | input.setOwner(InvestUserContext.getUserId()); | ||||
| if (Objects.nonNull(input.getContent())) { | if (Objects.nonNull(input.getContent())) { | ||||
| input.setContent(stringToJson(input.getContent())); | input.setContent(stringToJson(input.getContent())); | ||||
| } | } | ||||
| Map contentMap = JSON.parseObject(input.getContent(), Map.class); | |||||
| if (MapUtils.isNotEmpty(contentMap)) { | |||||
| Object customerId = contentMap.get(InvestRemindEntity.KEY_CUSTOMER); | |||||
| input.setCustomerId(Objects.isNull(customerId) ? null : Long.parseLong((String) customerId)); | |||||
| Object negotiationType = contentMap.get(InvestRemindEntity.KEY_NEGOTIATIONTYPE); | |||||
| input.setNegotiationType(EnumNegotiationType.getEnum(Integer.valueOf((String) negotiationType))); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -20,10 +20,9 @@ | |||||
| </resultMap> | </resultMap> | ||||
| <select id="listByIds" resultType="com.iformall.domain.vo.invest.InvestCustomerVo"> | <select id="listByIds" resultType="com.iformall.domain.vo.invest.InvestCustomerVo"> | ||||
| select c.*,d.`id` as demandId,d.`owner` as demandOwner | |||||
| from `invest_follow_record` f | |||||
| LEFT JOIN `invest_demand` d ON d.id = f.`follow_id` | |||||
| LEFT JOIN invest_customer c ON d.`customer_id` = c.id | |||||
| SELECT c.*,d.`id` AS demandId,d.`owner` AS demandOwner FROM `invest_follow_record` f | |||||
| INNER JOIN `invest_customer` c ON c.id=f.`follow_id` | |||||
| INNER JOIN `invest_demand` d ON d.`customer_id`=c.id | |||||
| where 1=1 | where 1=1 | ||||
| <if test=" null != type and type.size()>0"> | <if test=" null != type and type.size()>0"> | ||||
| AND c.type in | AND c.type in | ||||
| @@ -32,7 +31,7 @@ | |||||
| </foreach> | </foreach> | ||||
| </if> | </if> | ||||
| <if test=" null != ids and ids.size()>0"> | <if test=" null != ids and ids.size()>0"> | ||||
| AND d.id in | |||||
| AND c.id in | |||||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | ||||
| #{idItem} | #{idItem} | ||||
| </foreach> | </foreach> | ||||
| @@ -10,6 +10,9 @@ | |||||
| <result property="owner" column="owner"/> | <result property="owner" column="owner"/> | ||||
| <result property="content" column="content"/> | <result property="content" column="content"/> | ||||
| <result property="minute" column="minute"/> | <result property="minute" column="minute"/> | ||||
| <result property="status" column="status"/> | |||||
| <result property="customerId" column="customer_id"/> | |||||
| <result property="negotiationType" column="negotiation_type"/> | |||||
| <result property="beginDate" column="begin_date"/> | <result property="beginDate" column="begin_date"/> | ||||
| <result property="endDate" column="end_date"/> | <result property="endDate" column="end_date"/> | ||||
| <result property="createDate" column="create_date"/> | <result property="createDate" column="create_date"/> | ||||
| @@ -835,7 +835,7 @@ | |||||
| left join wx_merchant mm on mm.id = ms.merchant_id | left join wx_merchant mm on mm.id = ms.merchant_id | ||||
| left join wx_card_spend cs on cs.order_id = ms.order_id | left join wx_card_spend cs on cs.order_id = ms.order_id | ||||
| left join wx_c_user cu on cu.id = cs.owner_id | left join wx_c_user cu on cu.id = cs.owner_id | ||||
| where ms.order_type in(3,0) and ms.status = 0 | |||||
| where ms.status = 0 | |||||
| union all | union all | ||||
| select receive_pay money,merchant_id id from wx_bill_rent_deposit where status = 3 | select receive_pay money,merchant_id id from wx_bill_rent_deposit where status = 3 | ||||
| union all | union all | ||||
| @@ -111,6 +111,27 @@ public class DataInitController extends BaseController { | |||||
| return new ResultData(); | return new ResultData(); | ||||
| } | } | ||||
| /** | |||||
| * 核销积分数据修复 | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| @GetMapping("/addInvestMsgModel") | |||||
| public ResultData addInvestMsgModel() { | |||||
| try { | |||||
| MallUserInfo userInfo = getUser(); | |||||
| if(userInfo.isFmSuperAdmin()) { | |||||
| addInvestRemind(); | |||||
| return new ResultData(); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| log.error("DataInitController::fixCredit error ", e); | |||||
| return new ResultData(ErrorCode.MSG_METHOD_REQUEST_ERROR, e.getMessage()); | |||||
| } | |||||
| return new ResultData(); | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
| public void doFixVerifyCredit() { | public void doFixVerifyCredit() { | ||||
| // 1 获取券码 | // 1 获取券码 | ||||
| @@ -180,6 +201,15 @@ public class DataInitController extends BaseController { | |||||
| addBirthDayMsgModelToMall(EnumMsgModel.COUPON_BIRTHDAY_OPENED_NO, idWorker, "亲到的{userName},在您的生日到来之际,我们精心的为您准备了一份生日礼物,赶快打开{mallName}微信小程序领取您的专属生日礼物吧!"); | addBirthDayMsgModelToMall(EnumMsgModel.COUPON_BIRTHDAY_OPENED_NO, idWorker, "亲到的{userName},在您的生日到来之际,我们精心的为您准备了一份生日礼物,赶快打开{mallName}微信小程序领取您的专属生日礼物吧!"); | ||||
| } | } | ||||
| /** | |||||
| * 增加招商语音提醒短信模板 | |||||
| */ | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public void addInvestRemind() { | |||||
| IdWorker idWorker = IdWorker.get(); | |||||
| addBirthDayMsgModelToMall(EnumMsgModel.INVEST_REMIND, idWorker, "{mallName}您于{beginDate}{negotiationType}{customerName},请知悉!"); | |||||
| } | |||||
| private void addBirthDayMsgModelToMall(EnumMsgModel type, IdWorker idWorker, String content) { | private void addBirthDayMsgModelToMall(EnumMsgModel type, IdWorker idWorker, String content) { | ||||
| //查找已经添加过的接口列表 | //查找已经添加过的接口列表 | ||||
| WxMsgValidationcodeModel query = new WxMsgValidationcodeModel(); | WxMsgValidationcodeModel query = new WxMsgValidationcodeModel(); | ||||