From bc414567f1c19c803d561060d5dde0f1ea1e1d04 Mon Sep 17 00:00:00 2001 From: 284718418@qq.com <youlinrc321> Date: Fri, 12 May 2023 16:34:13 +0800 Subject: [PATCH] 客户跟进计划,需添加设置下次跟进时间及跟进内容、跟进方式,以及系统到时自动提醒功能 --- src/main/java/cn/timer/api/bean/crm/CrmClientPlan.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/cn/timer/api/config/enums/PinType.java | 1 + src/main/java/cn/timer/api/controller/crm/CrmController.java | 52 +++++++++++++++++++++++++++++++++++++++++++++------- src/main/java/cn/timer/api/controller/crm/task/CrmClientPlanTask.java | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/cn/timer/api/dao/crm/CrmClientPlanMapper.java | 17 +++++++++++++++++ src/main/java/cn/timer/api/utils/aliyun/AliyunSMS.java | 42 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 260 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/timer/api/bean/crm/CrmClientPlan.java create mode 100644 src/main/java/cn/timer/api/controller/crm/task/CrmClientPlanTask.java create mode 100644 src/main/java/cn/timer/api/dao/crm/CrmClientPlanMapper.java diff --git a/src/main/java/cn/timer/api/bean/crm/CrmClientPlan.java b/src/main/java/cn/timer/api/bean/crm/CrmClientPlan.java new file mode 100644 index 0000000..d2129de --- /dev/null +++ b/src/main/java/cn/timer/api/bean/crm/CrmClientPlan.java @@ -0,0 +1,94 @@ +/** +* Title: CrmClientFollow.java +* Description: +* @author dsc +* @date 2020年6月8日 +* @version 1.0 +*/ +package cn.timer.api.bean.crm; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +/** + * Title: CrmClientPlan.java + * + * @Description: + * @author wuqingjun + * @date 2023年5月12日 + * @version 1.0 + */ + +@Entity +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "crm_client_plan") +@ApiModel("客户管理-跟进计划") +public class CrmClientPlan extends Model<CrmClientPlan> { + + private static final long serialVersionUID = -7362549097557018583L; + + @Id + @GeneratedValue + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "编号") + private Integer id; + + @ApiModelProperty(value = "客户数据id") + private Integer cid; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "备注") + private String remake; + + @ApiModelProperty(value = "创建人") + private Integer createUser; + + @ApiModelProperty(value = "创建人姓名") + private String createUserName; + + @ApiModelProperty(value = "创建人手机号码") + private String createUserPhone; + + @ApiModelProperty(value = "企业id") + private Integer orgCode; + + @ApiModelProperty(value = "执行时间") + private Date executeTime; + + @ApiModelProperty(value = "状态:0.未提醒 1.已提醒") + private Integer status; + + @ApiModelProperty(value = "是否短信提醒:0否,1是") + private Integer ifWarnSms; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "提醒时间") + private Date warnTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + +} diff --git a/src/main/java/cn/timer/api/config/enums/PinType.java b/src/main/java/cn/timer/api/config/enums/PinType.java index 542b591..b4b3cc6 100644 --- a/src/main/java/cn/timer/api/config/enums/PinType.java +++ b/src/main/java/cn/timer/api/config/enums/PinType.java @@ -20,6 +20,7 @@ public enum PinType { CHANGE_INFORMATION("SMS_178485359", "信息变更"), // REMIND("SMS_180347486", "短信提醒"); + CRM_CLIENT_PLAN("SMS_460755268", "客户跟进计划提醒"), REMIND("SMS_193517459", "短信提醒"); diff --git a/src/main/java/cn/timer/api/controller/crm/CrmController.java b/src/main/java/cn/timer/api/controller/crm/CrmController.java index 1c7ee72..9ad6bef 100644 --- a/src/main/java/cn/timer/api/controller/crm/CrmController.java +++ b/src/main/java/cn/timer/api/controller/crm/CrmController.java @@ -10,6 +10,7 @@ import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; +import cn.timer.api.bean.crm.*; import cn.timer.api.controller.zpgl.sevice.ZpglService; import cn.timer.api.dto.crm.CrmCartogramCountExportDto; import cn.timer.api.dto.insure.PolicyDto; @@ -44,13 +45,6 @@ import cn.timer.api.bean.clazz.ClientSourceClass; import cn.timer.api.bean.clazz.ClientTypeClass; import cn.timer.api.bean.clazz.IndustryClass; import cn.timer.api.bean.clazz.SysRegion; -import cn.timer.api.bean.crm.CrmBusinessGroup; -import cn.timer.api.bean.crm.CrmBusinessGroupMember; -import cn.timer.api.bean.crm.CrmClientAssociate; -import cn.timer.api.bean.crm.CrmClientContacts; -import cn.timer.api.bean.crm.CrmClientData; -import cn.timer.api.bean.crm.CrmClientFollow; -import cn.timer.api.bean.crm.CrmSeaRule; import cn.timer.api.bean.qyzx.QyzxEmpEntAsso; import cn.timer.api.bean.yggl.YgglMainEmp; import cn.timer.api.config.annotation.CurrentUser; @@ -956,6 +950,8 @@ public class CrmController { return ResultUtil.error("请确认该客户数据是否存在"); if (oldData.getClientStatus() == 5) return ResultUtil.error("请解封后继续编辑操作"); + if (org.springframework.util.StringUtils.isEmpty(crmClientFollow.getContent())) + return ResultUtil.error("请填写跟进内容!"); Integer orgCode = getOrgCode(userBean); Integer empNum = getEmpNum(userBean); @@ -1701,6 +1697,48 @@ public class CrmController { return ResultUtil.data(userList,"成功"); } + @PostMapping("addClientPlan") + @Transactional + @ApiOperation(value = "新增客户跟进计划", httpMethod = "POST", notes = "接口发布说明") + public Result<Void> addClientPlan(@CurrentUser UserBean userBean, @RequestBody CrmClientPlan crmClientPlan) { + + Integer cid = crmClientPlan.getCid(); + if (cid == null){ + return ResultUtil.error("请传入id再试"); + } + CrmClientData oldData = CrmClientData.builder().id(cid).build().selectById(); + if (oldData == null){ + return ResultUtil.error("请确认该客户数据是否存在"); + } + if (oldData.getClientStatus() == 5){ + return ResultUtil.error("请解封后继续编辑操作"); + } + if (org.springframework.util.StringUtils.isEmpty(crmClientPlan.getContent())){ + return ResultUtil.error("请填写内容!"); + } + + Integer orgCode = getOrgCode(userBean); + Integer empNum = getEmpNum(userBean); + + + crmClientPlan.setOrgCode(orgCode); + crmClientPlan.setCreateUser(empNum); + crmClientPlan.setCreateUserName(getEmpName(orgCode, empNum)); + crmClientPlan.setCreateUserPhone(userBean.getQyzxEmpLogin().getPhone()); + + if (crmClientPlan.insert()){ + return ResultUtil.success("新增成功"); + } + return ResultUtil.error("新增失败"); + } + @GetMapping("getCilentPlan") + @ApiOperation(value = "获取客户跟进计划", httpMethod = "GET", notes = "接口发布说明") + public Result<List<CrmClientPlan>> getCilentPlan(@CurrentUser UserBean userBean, @RequestParam Integer cid) { + Integer orgCode = getOrgCode(userBean); + return ResultUtil.data(CrmClientPlan.builder().build().selectList(new QueryWrapper<CrmClientPlan>().lambda() + .eq(CrmClientPlan::getOrgCode, orgCode).eq(CrmClientPlan::getCid, cid).orderByDesc(CrmClientPlan::getId)), "获取成功"); + } + private ExcelReader getReaderByUrl(String url) { InputStream is = null; try { diff --git a/src/main/java/cn/timer/api/controller/crm/task/CrmClientPlanTask.java b/src/main/java/cn/timer/api/controller/crm/task/CrmClientPlanTask.java new file mode 100644 index 0000000..57c68e0 --- /dev/null +++ b/src/main/java/cn/timer/api/controller/crm/task/CrmClientPlanTask.java @@ -0,0 +1,61 @@ +package cn.timer.api.controller.crm.task; + +import cn.hutool.core.date.DateUtil; +import cn.timer.api.bean.crm.CrmClientPlan; +import cn.timer.api.bean.insure.InsureLog; +import cn.timer.api.bean.insure.InsurePolicy; +import cn.timer.api.bean.insure.InsureUser; +import cn.timer.api.config.exception.CustomException; +import cn.timer.api.dao.insure.InsureUserMapper; +import cn.timer.api.dao.yggl.YgglMainEmpMapper; +import cn.timer.api.utils.aliyun.AliyunSMS; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.List; + +/** + * @Description TODO + * @Author wuqingjun + * @Date 2023/5/12 + */ +@Configuration //1.主要用于标记配置类,兼备Component的效果。 +@EnableScheduling // 2.开启定时任务 +@Slf4j +public class CrmClientPlanTask { + + @Autowired + private AliyunSMS aliyunSMS; + + @Scheduled(cron = "0 0/30 * * * ? ") + @Transactional(rollbackFor = Exception.class) + public void updateInsureStatusTask(){ + try { + Date now = DateUtil.date(); + List<CrmClientPlan> crmClientPlanList = CrmClientPlan.builder().build().selectList(new QueryWrapper<CrmClientPlan>().lambda().eq(CrmClientPlan::getIfWarnSms,1).eq(CrmClientPlan::getStatus,0).lt(CrmClientPlan::getWarnTime,now)); + if (!CollectionUtils.isEmpty(crmClientPlanList)) { + for (CrmClientPlan plan:crmClientPlanList) { + String result = aliyunSMS.sendCrmClientPlanSms(plan.getCreateUserName(),plan.getCreateUserPhone()); + if(!StringUtils.isEmpty(result)){ + CrmClientPlan p = new CrmClientPlan(); + p.setId(plan.getId()); + p.setStatus(1); + p.updateById(); + log.info("客户跟进计划定时任务执行-{}-{}",plan.getCreateUserName(),plan.getCreateUserPhone()); + } + } + } + }catch (Exception e){ + e.printStackTrace(); + throw new CustomException("客户跟进计划定时任务异常"); + } + } +} diff --git a/src/main/java/cn/timer/api/dao/crm/CrmClientPlanMapper.java b/src/main/java/cn/timer/api/dao/crm/CrmClientPlanMapper.java new file mode 100644 index 0000000..63a062f --- /dev/null +++ b/src/main/java/cn/timer/api/dao/crm/CrmClientPlanMapper.java @@ -0,0 +1,17 @@ + +package cn.timer.api.dao.crm; + +import cn.timer.api.bean.crm.CrmClientPlan; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Title: CrmClientPlanMapper.java + * + * @Description: + * @author wuqingjun + * @date 2023年5月12日 + * @version 1.0 + */ +public interface CrmClientPlanMapper extends BaseMapper<CrmClientPlan> { + +} diff --git a/src/main/java/cn/timer/api/utils/aliyun/AliyunSMS.java b/src/main/java/cn/timer/api/utils/aliyun/AliyunSMS.java index 6614d0d..a47ad29 100644 --- a/src/main/java/cn/timer/api/utils/aliyun/AliyunSMS.java +++ b/src/main/java/cn/timer/api/utils/aliyun/AliyunSMS.java @@ -295,6 +295,48 @@ public class AliyunSMS { return "发送失败"; } + + /** + * 客户跟进计划提醒 + * + * @param name 用户名字 + * @return + */ + @SuppressWarnings("deprecation") + public String sendCrmClientPlanSms(String name, String phone) { + DefaultProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESSKEY_ID, SECRET); + IAcsClient client = new DefaultAcsClient(profile); + + CommonRequest request = new CommonRequest(); + request.setMethod(MethodType.POST); + request.setDomain(DOMAIN); + request.setVersion(VERSION); + request.setAction(ACTION_SEND); + request.putQueryParameter("RegionId", REGION_ID); + request.putQueryParameter("PhoneNumbers", phone); + request.putQueryParameter("SignName", PROJECT_NAME); + request.putQueryParameter(CODE_NAME, PinType.CRM_CLIENT_PLAN.getCode()); + request.putQueryParameter(TEMPLATE_PARAM, + "{\"name\":\"" + name + "\"}"); + + String a = null; + try { + CommonResponse response = client.getCommonResponse(request); + + a = response.getData(); + + } catch (ServerException e) { + e.printStackTrace(); + } catch (ClientException e) { + e.printStackTrace(); + } + + if (a != null && a.contains("OK")) { + return a; + } + return "发送失败"; + } + @Value("${config-8timer.environmental-science}") public String environmental_science; -- libgit2 0.26.0