Crm-服务管理&统计报表

服务管理表结构设计

t_customer_serve 客户服务表
字段 字段类型 字段限制 字段描述
主键 id int(11) 自增 id主键
serve_type varchar(30) 可空 服务类型
overview varchar(500) 可空 概要
customer varchar(30) 可空 客户
state varchar(20) 可空 服务状态
service_request varchar(500) 可空 服务请求
create_people varchar(100) 可空 服务创建人
assigner varchar(100) 可空 服务分配人
assign_time datetime 可空 分配时间
service_proce varchar(500) 可空 服务处理
service_proce_people varchar(20) 可空 服务处理人
service_proce_time datetime 可空 服务处理时间
service_proce_result varchar(500) 可空 处理结果
myd varchar(50) 可空 满意度
is_valid int(4) 可空 是否有效
update_date datetime 可空 更新时间
create_date datetime 可空 创建时间

服务管理模块实现

​ Crm系统添加客服系统便于企业更好的服务与客户需要,及时满足客户对于企业信息,产品相关信息的了解,同时对于产品售后也起到好的保障。这里在实现服务管理时设置服务记录的创建,分配,处理,反馈与归档五个子模块。

在这里插入图片描述

服务列表展示核心实现
  • CustomerServeMapper.xml
<select id="selectByParams" parameterType="com.xxxx.crm.query.CustomerServeQuery" resultType="com.xxxx.crm.vo.CustomerServe">
      select c.*,d.data_dic_value as dic_value
      from t_customer_serve c left join t_datadic d on c.serve_type = d.id
     <where>
          c.is_valid=1
          <if test="null !=customer and customer!=''">
               and customer like concat('%',#{customer},'%')
          </if>
         <if test="null !=state and state!=''">
           and state =#{state}
         </if>
         <if test="null !=type and type!=''">
           and serve_type = #{type}
         </if>
       <if test="null !=assigner">
         and assigner = #{assigner}
       </if>
     </where>
</select>
  • CustomerServeController.java
@Controller
@RequestMapping("customer_serve")
public class CustomerServeController extends BaseController {
   

    @Resource
    private CustomerServeService customerServeService;

    // 服务管理页面转发方法
    @RequestMapping("index/{type}")
    public String index(@PathVariable Integer type){
   
        if(type==1){
   
            return "customerServe/customer_serve";
        }else if(type==2){
   
            return "customerServe/customer_serve_assign";
        }else if(type==3){
   
            return "customerServe/customer_serve_proce";
        }else if(type==4){
   
            return "customerServe/customer_serve_feed_back";
        }else if(type==5){
   
            return "customerServe/customer_serve_archive";
        }else{
   
            return "";
        }
    }
 
    
    // 服务信息列表展示
    @RequestMapping("list")
    @ResponseBody
    public Map<String,Object> queryCustomerServeByParams(Integer flag, HttpServletRequest request, CustomerServeQuery customerServeQuery){
   
        if(null !=flag && flag==1){
   
            customerServeQuery.setAssigner(LoginUserUtil.releaseUserIdFromCookie(request));
        }
        return  customerServeService.queryByParamsForTable(customerServeQuery);
    }
    
    // 服务添加页面转发
    @RequestMapping("addCustomerServePage")
    public String addCustomerServePage(){
   
        return "customerServe/customer_serve_add";
    }

    //服务分配页面转发
    @RequestMapping("addCustomerServeAssignPage")
    public String addCustomerServeAssignPage(Integer id, Model model){
   
        model.addAttribute("customerServe",customerServeService.selectByPrimaryKey(id));
        return "customerServe/customer_serve_assign_add";
    }

    // 服务反馈页面转发
    @RequestMapping("addCustomerServeBackPage")
    public String addCustomerServeBackPage(Integer id, Model model){
   
        model.addAttribute("customerServe",customerServeService.selectByPrimaryKey(id));
        return "customerServe/customer_serve_feed_back_add";
    }

    // 服务处理页面转发
    @RequestMapping("addCustomerServeProcePage")
    public String addCustomerServeProcePage(Integer id, Model model){
   
        model.addAttribute("customerServe",customerServeService.selectByPrimaryKey(id));
        return "customerServe/customer_serve_proce_add";
    }



    //服务添加 分配  处理 归档处理
    @RequestMapping("saveOrUpdateCustomerServe")
    @ResponseBody
    public ResultInfo saveOrUpdateCustomerServe(CustomerServe customerServe){
   
         customerServeService.saveOrUpdateCustomerServe(customerServe);
         return success("操作成功");
    }
服务记录创建、分配、处理后端核心实现

​ 这里对于服务管理服务的创建,分配,处理与反馈后端代码实现放在同一个方法中进行处理,同时方便对于服务状态值统一处理,这里定义CustomerServeStatus 枚举类来实现。

  • 服务状态枚举类定义
/**
 * 客户服务状态枚举类
 */
public enum  CustomerServeStatus {
   
    // 创建
    CREATED("fw_001"),
    // 分配
    ASSIGNED("fw_002"),
    // 处理
    PROCED("fw_003"),
    // 反馈
    FEED_BACK("fw_004"),
    // 归档
    ARCHIVED("fw_005");

    private String state;

    CustomerServeStatus(String state) {
   
        this.state = state;
    }

    public String getState() {
   
        return state;
    }
}
  • CustomerServeService.java
@Transactional(propagation = Propagation.REQUIRED)
public void saveOrUpdateCustomerServe(CustomerServe customerServe){
   
    if(null == customerServe.getId()){
   
        /**  服务添加操作
         * 1.参数校验
         *     客户名  非空
         *     客户类型  非空
         * 2.添加默认值
         *    state  设置状态值
         *    isValid  createDate updateDate
         *  3.执行添加 判断结果
         */
        AssertUtil.isTrue(StringUtils.isBlank(customerServe.getCustomer()),"请指定客户!");
        AssertUtil.isTrue(null ==customerMapper.queryCustomerByName(customerServe.getCustomer()),"当前客户暂不存在!");
        AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServeType()),"请指定服务类型!");
        customerServe.setIsValid(1);
        customerServe.setCreateDate(new Date());
        customerServe.setUpdateDate(new Date());
        customerServe.setState(CustomerServeStatus.CREATED.getState());
        AssertUtil.isTrue(insertSelective(customerServe)<1,"服务记录添加失败!");
    }else{
   
        /**
         * 分配  处理  反馈
         */
        CustomerServe temp =  selectByPrimaryKey(customerServe.getId());
        AssertUtil.isTrue(null == temp,"待处理的服务记录不存在!");
        if(customerServe.getState().equals(CustomerServeStatus.ASSIGNED.getState())){
   
            // 服务分配
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getAssigner())||
                    (null == userMapper.selectByPrimaryKey(Integer.parseInt(customerServe.getAssigner()))),"待分配用户不存在");
            customerServe.setAssignTime(new Date());
            customerServe.setUpdateDate(new Date());
            AssertUtil.isTrue(updateByPrimaryKeySelective(customerServe)<1,"服务分配失败!");
        } if(customerServe.getState().equals(CustomerServeStatus.PROCED.getState())){
   
            // 服务处理
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProce()),"请指定处理内容!");
            customerServe.setServiceProceTime(new Date());
            customerServe.setUpdateDate(new Date());
            AssertUtil.isTrue(updateByPrimaryKeySelective(customerServe)<1,"服务处理失败!");
        }if(customerServe.getState().equals(CustomerServeStatus.FEED_BACK.getState())){
   
            // 服务处理
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProceResult()),"请指定反馈内容!");
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getMyd()),"请指定反馈满意度!");
            customerServe.setUpdateDate(new Date());
            customerServe.setState(CustomerServeStatus.ARCHIVED.getState());
            AssertUtil.isTrue(updateByPrimaryKeySelective(customerServe)<1,"服务反馈失败!");
        }
    }

}
服务创建前端视图 & 核心代码
服务列表主页面视图 & 核心js
  • customer_serve.ftl

views/customerServe 目录下新建customer_serve.ftl 模板文件。

<!DOCTYPE html>
<html>
<head>
    <title>服务创建</title>
    <#include "../common.ftl">
</head>
<body class="childrenBody">

<form class="layui-form" >
    <blockquote class="layui-elem-quote quoteBox">
        <form class="layui-form">
            <div class="layui-inline">
                <div class="layui-input-inline">
                    <input type="text" name="customer"
                           class="layui-input
               searchVal" placeholder="客户" />
                </div>
                <div class="layui-input-inline">
                    <select name="type"  id="type">
                        <option value="" >请选择</option>
                        <option value="6">咨询</option>
                        <option value="7" >投诉</option>
                        <option value="8" >建议</option>
                    </select>
                </div>

                <a class="layui-btn search_btn" data-type="reload"><i
                            class="layui-icon">&#xe615;</i> 搜索</a>
            </div>
        </form>
    </blockquote>
    <table id="customerServeList" class="layui-table"  lay-filter="customerServes"></table>


    <script type="text/html" id="toolbarDemo">
        <a class="layui-btn layui-btn-normal addNews_btn" lay-event="add">
            <i class="layui-icon">&#xe608;</i>
            添加
        </a>
    </script>

</form>
<script type="text/javascript" src="${ctx}/static/js/customerServe/customer.serve.js"></script>

</body>
</html>
  • customer.serve.js

js/customerServe 目录下新建customer.serve.js 文件,实现记录服务记录列表展示

layui.use(['table','layer',"form"],function(){
   
    var layer = parent.layer === undefined ? layui.layer : top.layer,
        $ = layui.jquery,
        table = layui.table;

    //服务列表展示
    table.render({
   
        elem: '#customerServeList',
        url : ctx+'/customer_serve/list?state=fw_001',
        cellMinWidth : 95,
        page : true,
        height : "full-125",
        limits : [10,15,20,25],
        limit : 10,
        toolbar: "#toolbarDemo",
        id : "customerServeListTable",
        cols : [[
            {
   type: "checkbox", fixed:"left", width:50},
            {
   field: "id", title:'编号',fixed:"true", width:80},
            {
   field: 'customer', title: '客户名', minWidth:50, align:"center"},
            {
   field: 'dicValue', title: '服务类型', minWidth:100, align:'center'},
            {
   field: 'overview', title: '概要信息', align:'center'},
            {
   field: 'createPeople', title: '创建人', minWidth:100, align:'center'},
            {
   field: 'createDate', title: '创建时间', align:'center',minWidth:150},
            {
   field: 'updateDate', title: '更新时间', align:'center',minWidth:150},
        ]]
    });

    // 多条件搜索
    $(".search_btn").on("click",function(){
   
        table.reload("customerServeListTable",{
   
            page: {
   
                curr: 1 //重新从第 1 页开始
            },
            where: {
   
                customer: $("input[name='customer']").val(),  //客户名
                type: 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值