Kaynağa Gözat

客户等级模块开发 长时间未跟进客户自动转公海功能开发

yzc 1 yıl önce
ebeveyn
işleme
26558af400

+ 3 - 3
code/src/test/java/CustomerDataSource.java

@@ -4,9 +4,9 @@ public class CustomerDataSource {
 
     public static void main(String[] args) {
         GeneratorApplication.builder()
-                .url("jdbc:mysql://36.134.91.96:17330/bytesailing_customer?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
-                .username("fjhx2012mysql")
-                .password("3PN-Mzn#vnP&q6d")
+                .url(DataSourceInfo.URL)
+                .username(DataSourceInfo.USER_NAME)
+                .password(DataSourceInfo.PASSWORD)
                 .port(9989)
                 .module("hx-customer")
                 .parent("com.fjhx.customer")

+ 7 - 1
hx-common/src/main/java/com/fjhx/common/enums/PushBusinessTypeEnum.java

@@ -51,7 +51,13 @@ public enum PushBusinessTypeEnum {
      */
     CONTRACT_PRODUCTION_TAG_UPDATE(9),
     NEW_PRODUCTION_ORDER(10),
-    PRODUCTION_ORDER_REJECT(11);
+    PRODUCTION_ORDER_REJECT(11),
+
+    /**
+     * 客户自动转公海
+     */
+    CUSTOMER_AUTO_TRANSFER(12);
+
     private final int type;
 
 }

+ 71 - 0
hx-customer/src/main/java/com/fjhx/customer/controller/customer/CustomerLvController.java

@@ -0,0 +1,71 @@
+package com.fjhx.customer.controller.customer;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.customer.entity.customer.dto.CustomerLvDto;
+import com.fjhx.customer.entity.customer.dto.CustomerLvSelectDto;
+import com.fjhx.customer.entity.customer.vo.CustomerLvVo;
+import com.fjhx.customer.service.customer.CustomerLvService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 客户等级 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@RestController
+@RequestMapping("/customerLv")
+public class CustomerLvController {
+
+    @Autowired
+    private CustomerLvService customerLvService;
+
+    /**
+     * 客户等级分页
+     */
+    @PostMapping("/page")
+    public Page<CustomerLvVo> page(@RequestBody CustomerLvSelectDto dto) {
+        return customerLvService.getPage(dto);
+    }
+
+    /**
+     * 客户等级明细
+     */
+    @PostMapping("/detail")
+    public CustomerLvVo detail(@RequestBody BaseSelectDto dto) {
+        return customerLvService.detail(dto.getId());
+    }
+
+    /**
+     * 客户等级新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody CustomerLvDto customerLvDto) {
+        customerLvService.add(customerLvDto);
+    }
+
+    /**
+     * 客户等级编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody CustomerLvDto customerLvDto) {
+        customerLvService.edit(customerLvDto);
+    }
+
+    /**
+     * 客户等级删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        customerLvService.delete(dto.getId());
+    }
+
+}

+ 17 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/dto/CustomerLvDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.customer.entity.customer.dto;
+
+import com.fjhx.customer.entity.customer.po.CustomerLv;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 客户等级新增编辑入参实体
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+public class CustomerLvDto extends CustomerLv {
+
+}

+ 17 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/dto/CustomerLvSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.customer.entity.customer.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 客户等级列表查询入参实体
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+public class CustomerLvSelectDto extends BaseSelectDto {
+
+}

+ 5 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/po/Customer.java

@@ -269,5 +269,10 @@ public class Customer extends BasePo {
      */
     private String privAccountNumber;
 
+    /**
+     * 客户等级id
+     */
+    private Long customerLvId;
+
 
 }

+ 36 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/po/CustomerLv.java

@@ -0,0 +1,36 @@
+package com.fjhx.customer.entity.customer.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 客户等级
+ * </p>
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+@TableName("customer_lv")
+public class CustomerLv extends BasePo {
+
+    /**
+     * 等级名称
+     */
+    private String lvName;
+
+    /**
+     * 最小未跟进天数
+     */
+    private Integer minNotFollow;
+
+    /**
+     * 最大未跟进天数
+     */
+    private Integer maxNotFollow;
+
+}

+ 17 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/vo/CustomerLvVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.customer.entity.customer.vo;
+
+import com.fjhx.customer.entity.customer.po.CustomerLv;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 客户等级列表查询返回值实体
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+public class CustomerLvVo extends CustomerLv {
+
+}

+ 5 - 0
hx-customer/src/main/java/com/fjhx/customer/entity/customer/vo/CustomerVo.java

@@ -84,4 +84,9 @@ public class CustomerVo extends Customer implements SetCustomizeAreaName {
      * 订单总金额
      */
     private BigDecimal orderAmountSum;
+
+    /**
+     * 客户等级名称
+     */
+    private String lvName;
 }

+ 26 - 0
hx-customer/src/main/java/com/fjhx/customer/mapper/customer/CustomerLvMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.customer.mapper.customer;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.customer.entity.customer.po.CustomerLv;
+import com.fjhx.customer.entity.customer.vo.CustomerLvVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 客户等级 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-04-02
+ */
+public interface CustomerLvMapper extends BaseMapper<CustomerLv> {
+
+    /**
+     * 客户等级分页
+     */
+    Page<CustomerLvVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<CustomerLv> wrapper);
+
+}

+ 46 - 0
hx-customer/src/main/java/com/fjhx/customer/service/customer/CustomerLvService.java

@@ -0,0 +1,46 @@
+package com.fjhx.customer.service.customer;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.customer.entity.customer.dto.CustomerLvDto;
+import com.fjhx.customer.entity.customer.dto.CustomerLvSelectDto;
+import com.fjhx.customer.entity.customer.po.CustomerLv;
+import com.fjhx.customer.entity.customer.vo.CustomerLvVo;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 客户等级 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-04-02
+ */
+public interface CustomerLvService extends BaseService<CustomerLv> {
+
+    /**
+     * 客户等级分页
+     */
+    Page<CustomerLvVo> getPage(CustomerLvSelectDto dto);
+
+    /**
+     * 客户等级明细
+     */
+    CustomerLvVo detail(Long id);
+
+    /**
+     * 客户等级新增
+     */
+    void add(CustomerLvDto customerLvDto);
+
+    /**
+     * 客户等级编辑
+     */
+    void edit(CustomerLvDto customerLvDto);
+
+    /**
+     * 客户等级删除
+     */
+    void delete(Long id);
+
+}

+ 3 - 0
hx-customer/src/main/java/com/fjhx/customer/service/customer/CustomerService.java

@@ -7,6 +7,7 @@ import com.fjhx.customer.entity.customer.dto.CustomerSelectDto;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.entity.customer.vo.CustomerVo;
 import com.ruoyi.common.core.service.BaseService;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 
 import java.util.List;
 import java.util.Map;
@@ -22,6 +23,8 @@ import java.util.Map;
 public interface CustomerService extends BaseService<Customer> {
 
 
+    List<CustomerVo> getList(IWrapper<Customer> wrapper);
+
     Page<CustomerVo> selPage(CustomerSelectDto dto);
 
     /**

+ 110 - 0
hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerLvServiceImpl.java

@@ -0,0 +1,110 @@
+package com.fjhx.customer.service.customer.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.enums.PushBusinessTypeEnum;
+import com.fjhx.customer.entity.customer.dto.CustomerLvDto;
+import com.fjhx.customer.entity.customer.dto.CustomerLvSelectDto;
+import com.fjhx.customer.entity.customer.po.Customer;
+import com.fjhx.customer.entity.customer.po.CustomerLv;
+import com.fjhx.customer.entity.customer.vo.CustomerLvVo;
+import com.fjhx.customer.entity.customer.vo.CustomerVo;
+import com.fjhx.customer.mapper.customer.CustomerLvMapper;
+import com.fjhx.customer.service.customer.CustomerLvService;
+import com.fjhx.customer.service.customer.CustomerService;
+import com.fjhx.socket.core.PushTypeEnum;
+import com.fjhx.socket.core.WebSocketPush;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.framework.mybatis.holder.TenantHolder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 客户等级 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-04-02
+ */
+@Service
+public class CustomerLvServiceImpl extends ServiceImpl<CustomerLvMapper, CustomerLv> implements CustomerLvService {
+    @Autowired
+    private CustomerService customerService;
+
+    @Override
+    public Page<CustomerLvVo> getPage(CustomerLvSelectDto dto) {
+        IWrapper<CustomerLv> wrapper = getWrapper();
+        wrapper.orderByDesc("cl", CustomerLv::getId);
+        Page<CustomerLvVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public CustomerLvVo detail(Long id) {
+        CustomerLv CustomerLv = this.getById(id);
+        CustomerLvVo result = BeanUtil.toBean(CustomerLv, CustomerLvVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(CustomerLvDto customerLvDto) {
+        this.save(customerLvDto);
+    }
+
+    @Override
+    public void edit(CustomerLvDto customerLvDto) {
+        this.updateById(customerLvDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+    /**
+     * 启动时和每天0点 自动将 超过指定时间没跟进的客户转入公海
+     */
+//    @PostConstruct
+    @Scheduled(cron = "0 0 0 * * ?")
+    void customerAutoTransfer() {
+        TenantHolder.setIgnore(true);
+        List<CustomerVo> list = customerService.getList(IWrapper.<Customer>getWrapper()
+                .apply("DATEDIFF(now(),IFNULL(c.last_follow_time, NOW())) >cul.max_not_follow")
+                .isNotNull("cul.max_not_follow")
+                .isNotNull("c.user_id")
+        );
+
+        if (ObjectUtil.isEmpty(list)) {
+            return;
+        }
+
+        for (CustomerVo customerVo : list) {
+            customerService.update(q -> q
+                    .eq(Customer::getId, customerVo.getId())
+                    .set(Customer::getUserId, null)
+                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    .set(BasePo::getUpdateTime, new Date())
+            );
+
+            JSONObject msg = new JSONObject();
+            msg.put("business_id", customerVo.getId());
+            WebSocketPush.byUser(PushTypeEnum.MESSAGE, customerVo.getUserId(),
+                    String.format("您的客户【%s】因长时间未跟进,已自动转入公海!"),
+                    PushBusinessTypeEnum.NEW_QUOTATION.getType(),
+                    msg.toString());
+        }
+        TenantHolder.clear();
+    }
+
+}

+ 5 - 0
hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerServiceImpl.java

@@ -67,6 +67,11 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
     private ISysDeptService deptService;
 
 
+    @Override
+    public List<CustomerVo> getList(IWrapper<Customer> wrapper) {
+        return baseMapper.getList(wrapper);
+    }
+
     /**
      * 客户下拉分页
      */

+ 17 - 0
hx-customer/src/main/resources/mapper/customer/CustomerLvMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.customer.mapper.customer.CustomerLvMapper">
+    <select id="getPage" resultType="com.fjhx.customer.entity.customer.vo.CustomerLvVo">
+        select cl.id,
+               cl.lv_name,
+               cl.min_not_follow,
+               cl.max_not_follow,
+               cl.update_time,
+               cl.update_user,
+               cl.create_user,
+               cl.create_time
+        from customer_lv cl
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 3 - 1
hx-customer/src/main/resources/mapper/customer/CustomerMapper.xml

@@ -56,8 +56,10 @@
                t1.lastSaleDate,
                IFNULL(t1.lastSaleDay, 0)    as lastSaleDay,
                IFNULL(t1.orderCount, 0)     as orderCount,
-               IFNULL(t1.orderAmountSum, 0) as orderAmountSum
+               IFNULL(t1.orderAmountSum, 0) as orderAmountSum,
+               cul.lv_name                  as lvName
         from customer c
+                 LEFT JOIN customer_lv cul ON c.customer_lv_id = cul.id
                  LEFT JOIN (SELECT c.id,
                                    count(cfr.id)                                 AS followCount,
                                    max(co.sale_date)                             AS lastSaleDate,