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

  • 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 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 模板文件。




    服务创建
    <#include "../common.ftl">



搜索
  • 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: $("#type").val()  //服务类型
            }
        })
    });
});
服务创建视图 & 核心js

image-20200228102447560

这里添加服务创建点击事件,修改customer.serve.js

//头工具栏事件
table.on('toolbar(customerServes)', function(obj){
    switch(obj.event){
        case "add":
            openAddCustomerServeDialog();
            break;
    };
});


// 打开服务创建页面
function openAddCustomerServeDialog(){
    var url  =  ctx+"/customer_serve/addCustomerServePage";
    layui.layer.open({
        title : "服务管理-服务创建",
        type : 2,
        area:["700px","420px"],
        maxmin:true,
        content : url
    });
}
  • customer_serve_add.ftl

views/customerServe 目录下添加customer_serve_add.ftl 文件准备服务添加表单




    <#include "../common.ftl">



  • customer.serve.add.js

js/customerServe 目录下添加customer.serve.add.js 实现服务记录添加操作

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

    form.on("submit(addOrUpdateCustomerServe)", function (data) {
        // 额外设置用户名
        data.field.createPeople=$.cookie("trueName");
        var index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
        //弹出loading
        $.post(ctx + "/customer_serve/saveOrUpdateCustomerServe", data.field, function (res) {
            if (res.code == 200) {
                setTimeout(function () {
                    top.layer.close(index);
                    top.layer.msg("操作成功!");
                    layer.closeAll("iframe");
                    //刷新父页面
                    parent.location.reload();
                }, 500);
            } else {
                layer.msg(
                    res.msg, {
                        icon: 5
                    }
                );
            }
        });
        return false;
    });
});

服务分配

​ 服务分配实现将添加的服务记录分配该指定类型人员进行下一步处理操作,这里对于服务分配后端代码在前面已实现,这里主要添加前端视图与核心js。

待分配服务表格数据展示

  • customer_serve_assign.ftl

views/customerServe 目录下添加customer_serve_assign.ftl 模板文件,展示要分配的服务记录




    服务创建
    <#include "../common.ftl">



搜索
  • customer.serve.assign.js

js/customerServe 目录下添加customer.serve.assign.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: 'assignTime', title: '分配时间', minWidth:50, align:"center"},
            {field: 'assigner', title: '分配人', minWidth:100, align:'center'},
            {field: 'createDate', title: '创建时间', align:'center',minWidth:150},
            {field: 'updateDate', title: '更新时间', align:'center',minWidth:150},
            {title: '操作', minWidth:150, templet:'#customerServeListBar',fixed:"right",align:"center"}
        ]]
    });

    // 多条件搜索
    $(".search_btn").on("click",function(){
        table.reload("customerServeListTable",{
            page: {
                curr: 1 //重新从第 1 页开始
            },
            where: {
                customer: $("input[name='customer']").val(),  //客户名
                type: $("#type").val()  //服务类型
            }
        })
    });

});

修改customer.serve.assign.js 添加点击分配事件,实现分配操作

table.on("tool(customerServes)", function(obj){
    var layEvent = obj.event;
    if(layEvent === "assign") {
        openCustomerAssignDialog(obj.data.id);
    }
});


function openCustomerAssignDialog(id){
    var url  =  ctx+"/customer_serve/addCustomerServeAssignPage?id="+id;
    layui.layer.open({
        title : "服务管理-服务分配",
        type : 2,
        area:["700px","420px"],
        maxmin:true,
        content : url
    });
}

服务分配表单处理

  • customer_serve_assign_add.ftl

views/customerServe 目录下添加customer_serve_assign_add.ftl 模板文件,执行分配操作




    <#include "../common.ftl">



  • customer.serve.assign.add.js

js/customerServe 目录下添加customer.serve.assign.add.js文件,执行分配操作

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


    // 初始化分配用户下拉框
    $.post(ctx+"/user/queryAllCustomerManager",function (res) {
        for (var i = 0; i < res.length; i++) {
                $("#assigner").append("");
        }
        //重新渲染
        layui.form.render("select");
    });

    form.on("submit(addOrUpdateCustomerServe)", function (data) {
        var index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
        //弹出loading
        $.post(ctx + "/customer_serve/saveOrUpdateCustomerServe", data.field, function (res) {
            if (res.code == 200) {
                setTimeout(function () {
                    top.layer.close(index);
                    top.layer.msg("操作成功!");
                    layer.closeAll("iframe");
                    //刷新父页面
                    parent.location.reload();
                }, 500);
            } else {
                layer.msg(
                    res.msg, {
                        icon: 5
                    }
                );
            }
        });
        return false;
    });
});

服务处理

当服务信息分配后,用户登录到crm系统点击服务处理进入处理处理页面执行处理操作

待处理服务记录列表信息展示

  • customer_serve_proce.ftl

views/customerServe 目录下添加customer_serve_proce.ftl 文件展示待处理服务列表。




    服务创建
    <#include "../common.ftl">



搜索
  • customer.serve.proce.js

js/customerServe 目录下添加customer.serve.proce.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_002',
        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: 'assignTime', title: '分配时间', minWidth:50, align:"center"},
            {field: 'assigner', title: '分配人', minWidth:100, align:'center'},
            {field: 'createDate', title: '创建时间', align:'center',minWidth:150},
            {field: 'updateDate', title: '更新时间', align:'center',minWidth:150},
            {title: '操作', minWidth:150, templet:'#customerServeListBar',fixed:"right",align:"center"}
        ]]
    });

    // 多条件搜索
    $(".search_btn").on("click",function(){
        table.reload("customerServeListTable",{
            page: {
                curr: 1 //重新从第 1 页开始
            },
            where: {
                customer: $("input[name='customer']").val(),  //客户名
                type: $("#type").val()  //服务类型
            }
        })
    });


    table.on("tool(customerServes)", function(obj){
        var layEvent = obj.event;
        if(layEvent === "assign") {
            openCustomerAssignDialog(obj.data.id);
        }
    });


    function openCustomerAssignDialog(id){
        var url  =  ctx+"/customer_serve/addCustomerServeProcePage?id="+id;
        layui.layer.open({
            title : "服务管理-服务处理",
            type : 2,
            area:["700px","420px"],
            maxmin:true,
            content : url
        });
    }

});

服务处理表单处理

  • customer_serve_proce_add.ftl

views/customerServe 目录下添加customer_serve_proce_add.ftl 处理表单




    <#include "../common.ftl">



  • customer.serve.proce.add.js

js/customerServe 目录下添加customer.serve.proce.add.js 文件实现服务处理表单提交。

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


    $.post(ctx+"/user/queryAllCustomerManager",function (res) {
        for (var i = 0; i < res.length; i++) {
            if($("input[name='man']").val() == res[i].id ){
                $("#assigner").append("");
            }else {
                $("#assigner").append("");
            }
        }
        //重新渲染
        layui.form.render("select");
    });

    form.on("submit(addOrUpdateCustomerServe)", function (data) {
        var index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
        data.field.serviceProcePeople=$.cookie("trueName");
        //弹出loading
        $.post(ctx + "/customer_serve/saveOrUpdateCustomerServe", data.field, function (res) {
            if (res.code == 200) {
                setTimeout(function () {
                    top.layer.close(index);
                    top.layer.msg("操作成功!");
                    layer.closeAll("iframe");
                    //刷新父页面
                    parent.location.reload();
                }, 500);
            } else {
                layer.msg(
                    res.msg, {
                        icon: 5
                    }
                );
            }
        });
        return false;
    });
});

服务反馈

当服务信息处理完毕后,下一步执行服务反馈处理,用于对客户服务的满意度进行收集。

image-20200228113501774

image-20200228113650078

待反馈服务记录列表展示

  • customer_serve_feed_back.ftl

views/customerServe 目录下添加customer_serve_feed_back.ftl 文件展示待反馈服务列表。




    服务创建
    <#include "../common.ftl">



搜索
  • customer.serve.feed.back.js

js/customerServe 目录下添加customer.serve.feed.back.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_003',
        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: 'assignTime', title: '分配时间', minWidth:50, align:"center"},
            {field: 'assigner', title: '分配人', minWidth:100, align:'center'},
            {field: 'serviceProcePeople', title: '处理人', minWidth:50, align:"center"},
            {field: 'serviceProceTime', title: '处理人', minWidth:100, align:'center'},
            {field: 'createDate', title: '创建时间', align:'center',minWidth:150},
            {field: 'updateDate', title: '更新时间', align:'center',minWidth:150},
            {title: '操作', minWidth:150, templet:'#customerServeListBar',fixed:"right",align:"center"}
        ]]
    });

    // 多条件搜索
    $(".search_btn").on("click",function(){
        table.reload("customerServeListTable",{
            page: {
                curr: 1 //重新从第 1 页开始
            },
            where: {
                customer: $("input[name='customer']").val(),  //客户名
                type: $("#type").val()  //服务类型
            }
        })
    });


    table.on("tool(customerServes)", function(obj){
        var layEvent = obj.event;
        if(layEvent === "back") {
            openCustomerBackDialog(obj.data.id);
        }
    });


    function openCustomerBackDialog(id){
        var url  =  ctx+"/customer_serve/addCustomerServeBackPage?id="+id;
        layui.layer.open({
            title : "服务管理-服务反馈",
            type : 2,
            area:["700px","420px"],
            maxmin:true,
            content : url
        });
    }

});

服务反馈表单处理

  • customer_serve_feed_back_add.ftl

view/customerServe 目录下添加customer_serve_feed_back_add.ftl 反馈表单模板文件




    <#include "../common.ftl">



  • customer.serve.feed.back.add.js

js/customerServe 目录下添加customer.serve.feed.back.add.js 实现反馈表单数据提交

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

    $.post(ctx+"/user/queryAllCustomerManager",function (res) {
        for (var i = 0; i < res.length; i++) {
            if($("input[name='man']").val() == res[i].id ){
                $("#assigner").append("");
            }else {
                $("#assigner").append("");
            }
        }
        //重新渲染
        layui.form.render("select");
    });

    form.on("submit(addOrUpdateCustomerServe)", function (data) {
        var index = top.layer.msg('数据提交中,请稍候', {icon: 16, time: false, shade: 0.8});
        //弹出loading
        $.post(ctx + "/customer_serve/saveOrUpdateCustomerServe", data.field, function (res) {
            if (res.code == 200) {
                setTimeout(function () {
                    top.layer.close(index);
                    top.layer.msg("操作成功!");
                    layer.closeAll("iframe");
                    //刷新父页面
                    parent.location.reload();
                }, 500);
            } else {
                layer.msg(
                    res.msg, {
                        icon: 5
                    }
                );
            }
        });
        return false;
    });
});

你可能感兴趣的:(Crm-服务管理&统计报表)