【开源】基于JAVA+Vue+SpringBoot的河南软件客服系统

news2024/9/21 12:40:08

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 系统管理人员
    • 2.2 业务操作人员
  • 三、系统展示
  • 四、核心代码
    • 4.1 查询客户
    • 4.2 新增客户跟进情况
    • 4.3 查询客户历史
    • 4.4 新增服务派单
    • 4.5 新增客户服务费
  • 五、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的河南软件客服系统,包含了客户信息维护模块、客户跟进记录模块、客户服务费模块、售后服务单模块、客服统计分析模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,河南软件客服系统基于角色的访问控制,给客服主管、普通客服使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

2.1 系统管理人员

包括系统维护,基础资料维护、统计分析/报表导出、系统登录、企业资源导入等功能;主要体现在系统的运行保障上面;数据统计导出相关报表,可让领导即时了解客户跟进情况,提取有用的信息转化成商机(销售软件、升级、加站等)﹐直接或者间接提升公司效益。

  1. 系统维护:用户管理(系统管理员、客服入员、资源分派员、技术服务等;包含基本信息、所属部门、角色、联系方式等)﹐数据字典维护,系统日志审计等。
  2. 基础资料维护:客户资料维护(包含企业名称、详细地址、企业社会信用码、注册日期、区域、法人、法人电话、财务、财务电话、出纳、出纳电话、所属行业、运营状态、跟进状态等))、部门、角色等。客户资料可手工录入亦可使用 Excel 根据制定的模板批量导入(通过一些渠道获取的大批量企业信息);
  3. 统计分析/报表导出:生成跟进汇总统计报表,可按日期时间段、客服人员、跟进进度等进行统计,可统计服务费收取情况、服务费到期情况、技术服务派单情况、商机转化情况,可导出Excel、PDF文件留档;
  4. 系统登录:系统管理员和业务员登录认证功能:根据登录用户的角色不同,所拥有的权限不同,显示不同的页面内容。
  5. 客户资源分派维护:客户资料可依据多种条件进行筛选(基本资料各个字段皆可作为条件任意组合进行正向或反向筛选,还需要根据分派情况正向或反向筛选),然后给客服人员进行分派;跟进不理想的资源可收回重新分派。
  6. 服务费审核:生成服务费流水账表,由财务人员进行对账审核;审核过之后才能计入对应客服的业绩。

2.2 业务操作人员

主要包括客户信息维护、服务费收取、客户跟进维护、售后服务、服务派单、客户评价等;成交客户反馈问题后,由客服人员录入系统,客服经理收到信息提示,然后进行服务派单,完成后由技术人员录入解决情况汇总到该客户档案中;资源池中客户被分派给跟进人进行电话跟进,根据情况转化成商机。

  1. 客户信息维护:客服人员收集到一些客户信息录入系统,有些信息可能有误或者企业信息变更,在跟进过程中可以进行修改调整,修改过程历史记录保留,可进行回查复核。添加企业联系人和电话,定期计算联系电话任职于几个企业,可查询相关联的企业信息。
  2. 客户跟进维护:客服人员定期主动电话联系客户,沟通信息化需求或者使用过程中的问题,记录跟进情况和维护跟进进度(跟进进度:启新老客户、已用金蝶、已用用友、已用其他软件、意向客户、长期跟进、暂无需求、其他)。历史记录保留可查,每次跟进人、跟进情况、跟进时间等。
  3. 服务费收取:成交客户可查看成交记录和服务费收取记录,以及服务费到期时间,服务费即将到期的客户要有消息提醒和一键查询功能,服务费逾期客户红色标注,收取服务费后录入系统,提示后台进行服务费审核对账。
  4. 售后服务:客服接到成交客户的咨询或者问题反馈后可快速查询定位到客户,调出客户档案和跟进历史记录,将客户多描述情况汇总录入系统,提交给客服经理,客户经理收到问题反馈,初步评估之后分派给技术服务人员跟进解决(亦可客服经理亲自解决),技术人员解决后将解决情况录入系统,该问题关闭。
  5. 回访评价:客户的问题解决后,由客服人员进行回访,根据客户反馈的情况对技术人员的服务态度、技术能力、回应速度等进行客观评价(很满意、满意、一般、有待改善)。

三、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、核心代码

4.1 查询客户

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询客户")
public Result<IPage<Customer>> getByPage(@ModelAttribute Customer customer ,@ModelAttribute PageVo page){
    QueryWrapper<Customer> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(customer.getCompanyName())) {
        qw.like("company_name",customer.getCompanyName());
    }
    if(!ZwzNullUtils.isNull(customer.getTrade())) {
        qw.like("trade",customer.getTrade());
    }
    if(!ZwzNullUtils.isNull(customer.getStatus2())) {
        qw.eq("status2",customer.getStatus2());
    }
    if(!ZwzNullUtils.isNull(customer.getMobile1())) {
        qw.and(wrapper -> wrapper.eq("mobile1", customer.getMobile1()).or().eq("mobile1",customer.getMobile1()).or().eq("mobile3",customer.getMobile1()));
    }
    IPage<Customer> data = iCustomerService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Customer>>().setData(data);
}

4.2 新增客户跟进情况

@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增单条客户跟进")
public Result<Object> addOne(@RequestParam String id,@RequestParam String level,@RequestParam String content){
    Customer customer = iCustomerService.getById(id);
    if(customer == null) {
        return ResultUtil.error("客户不存在");
    }
    CustomerItem customerItem = new CustomerItem();
    customerItem.setCustomerId(customer.getId());
    customerItem.setCustomerName(customer.getCompanyName());
    customerItem.setLevel(level);
    customerItem.setContent(content);
    User currUser = securityUtil.getCurrUser();
    customerItem.setUserId(currUser.getId());
    customerItem.setUserName(currUser.getNickname());
    customerItem.setTime(DateUtil.now());
    iCustomerItemService.saveOrUpdate(customerItem);
    return ResultUtil.success();
}

4.3 查询客户历史

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询客户历史")
public Result<IPage<CustomerHistory>> getByPage(@ModelAttribute CustomerHistory customerHistory ,@ModelAttribute PageVo page){
    QueryWrapper<CustomerHistory> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(customerHistory.getCompanyName())) {
        qw.like("company_name",customerHistory.getCompanyName());
    }
    IPage<CustomerHistory> data = iCustomerHistoryService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<CustomerHistory>>().setData(data);
}

4.4 新增服务派单

@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增单条服务派单")
public Result<Object> addOne(@RequestParam String id,@RequestParam String content){
    Customer customer = iCustomerService.getById(id);
    if(customer == null) {
        return ResultUtil.error("客户不存在");
    }
    ServiceOrder serviceOrder = new ServiceOrder();
    serviceOrder.setCustomerId(customer.getId());
    serviceOrder.setCustomerName(customer.getCompanyName());
    serviceOrder.setContent(content);
    User currUser = securityUtil.getCurrUser();
    serviceOrder.setStatus("未派单");
    serviceOrder.setUserId(currUser.getId());
    serviceOrder.setUserName(currUser.getNickname());
    serviceOrder.setWorkId("");
    serviceOrder.setWorkName("");
    serviceOrder.setReplyContent("");
    serviceOrder.setAppraiseLevel("");
    serviceOrder.setAppraiseContent("");
    iServiceOrderService.saveOrUpdate(serviceOrder);
    return ResultUtil.success();
}

4.5 新增客户服务费

@RequestMapping(value = "/addOne", method = RequestMethod.GET)
@ApiOperation(value = "新增客户服务费")
public Result<Object> addOne(@RequestParam String id,@RequestParam String startDate,@RequestParam String endDate,
                                    @RequestParam BigDecimal price){
    Customer customer = iCustomerService.getById(id);
    if(customer == null) {
        return ResultUtil.error("客户不存在");
    }
    User currUser = securityUtil.getCurrUser();
    ServicePrice servicePrice = new ServicePrice();
    servicePrice.setCustomerId(customer.getId());
    servicePrice.setCustomerName(customer.getCompanyName());
    servicePrice.setStartDate(startDate);
    servicePrice.setEndDate(endDate);
    servicePrice.setPrice(price);
    servicePrice.setStatus("未审核");
    servicePrice.setUserId(currUser.getId());
    servicePrice.setUserName(currUser.getNickname());
    servicePrice.setTime(DateUtil.now());
    iServicePriceService.saveOrUpdate(servicePrice);
    return ResultUtil.success();
}

五、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习ArtTs -- 初见ArkTs

作者&#xff1a;Uncle_Tom 原文链接&#xff1a;学习ArtTs -- 初见ArkTs-云社区-华为云 1. 前言 需要静态分析去检查一个语言&#xff0c;必须对这个语言有深刻的认识&#xff0c;才能有效的对这个语言进行有效的检查。 我常说:“作为一个程序分析员需要比一般的程序员考虑…

Springboot写一个对接钉钉机器人的小插件

钉钉机器人 有时候我门需要监控各种事件&#xff0c;需要机器人给我发给提醒 如&#xff1a;git代码交接&#xff0c;代码合并&#xff0c; 服务器异常捕获&#xff0c;。。。。 参照钉钉给我们的开发文档&#xff0c;可以发现对接起来是非常简单哈哈 这是我写的小插件以及例子…

渗透测试培训学习笔记汇总1(小迪安全)

第一天 域名 概念&#xff1a;域名&#xff08;英语&#xff1a;Domain Name&#xff09;&#xff0c;又称网域&#xff0c;是由一串用点分隔的名字组成的互联网上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&a…

修改MFC图标

摘要&#xff1a;本文主要讲解了MFC程序窗口图标的添加、任务栏、底部托盘的图标添加&#xff0c;以及所生成的exe文件图标的添加。 ​​​​​​​1、在资源视图添加Icon资源 透明图标怎么制作&#xff1f; 1&#xff09;点击图片》右键&#xff1a;使用画图3D进行编辑 2&a…

Optimizer:基于.Net开发的、提升Windows系统性能的终极开源工具

我们电脑使用久了后&#xff0c;就会产生大量的垃圾文件、无用的配置等&#xff0c;手动删除非常麻烦&#xff0c;今天推荐一个开源工具&#xff0c;可以快速帮助我们更好的优化Windos电脑。 01 项目简介 Optimizer是一个面向Windows系统的优化工具&#xff0c;旨在提升计算机…

Centos 7.5 安装 NVM 详细步骤

NVM&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具&#xff0c;它可以让你轻松地在多个版本之间切换。NVM 通过下载和管理 Node.js 的多个版本&#xff0c;为用户提供了一种灵活的方式来使用不同版本的 Node.js。如果你需要更多关于NVM的信息&a…

VS打包.exe文件步骤

1.借助vs自带扩展工具 2.1打开扩展栏 2.2搜索栏填入 " installer " 2.3下载安装 下载完成后&#xff0c;推出vs自动弹出安装。 2.生成安装包 2.1新建一个项目 2.2输入"setup" 直接下一步 2.3输入项目名称和存储位置、点击创建 出现该栏 2.4选择 主文件…

寒假 day1

1、请简述栈区和堆区的区别? 2、有一个整形数组:int arr[](数组的值由外部输入决定)&#xff0c;一个整型变量: x(也 由外部输入决定)。要求: 1)删除数组中与x的值相等的元素 2)不得创建新的数组 3)最多只允许使用单层循环 4)无需考虑超出新数组长度后面的元素&#xff0c;所以…

【智能家居入门3】(MQTT服务器、MQTT协议、微信小程序、STM32)

前面已经写了三篇博客关于智能家居的&#xff0c;服务器全都是使用ONENET中国移动&#xff0c;他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器&#xff0c;有公用的&#xff0c;也可以自己搭建&#xff08;应该要钱&#xff09;&#xf…

GMT绘图笔记

(1)图框设置。在利用GMT绘制图件时&#xff0c;需要设置边框的类型&#xff0c;字体的大小&#xff0c;标记距离边框的距离。主要涉及的参数有&#xff1a; gmt set MAP_FRAME_TYPE plain/fancy 可以调整边框为火车轨道或者线段。 (2)调整图框的粗细&#xff1a;主要是包含有…

c语言二叉树的创建,三种遍历方式,销毁

二叉树的创建 typedef char datatype; typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child;}*Btree; //二叉树的创建 Btree create_node() {Btree t(Btree)malloc(sizeof(struct Node));if(NULLt)return NULL;t->data0;t->left_chil…

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题&#xff1f;以…

SpringBoot数据访问复习

SpringBoot数据访问复习 数据访问准备 引入jdbc所需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency> 原理分析 导入的启动器引入了两个…

Vue.js设计与实现(霍春阳)

Vue.js设计与实现 (霍春阳) 电子版获取链接&#xff1a;Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 &#xff1a;1.对Vue.js 2/3具有上手经验&#xff0c;且希望进一步理解Vue.js框架设计原理的开发人员&#xff1b; 2.没有使用过Vue.js&#xff0c;但对Vue.js框架设计感兴趣…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器&#xff0c;可以播放本地媒体文件和网络串流&#xff0c;帮助我们排查音视频开发过程中遇到的问题。大部分情况下&#xff0c;我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的&#xff1a;我们的音视频拉流软…

Java 数据结构 二叉树(一)二叉查询树

目录 树的种类 二叉树 二叉查找树 满二叉树 ​编辑 完全二叉树 二叉树的数据存储 链式存储 数组存储 寻址方式&#xff1a; 二叉树的遍历&#xff08;了解即可&#xff09; ​编辑 二叉查询树缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满…

JVM之Java内存区域

JVM-Java内存区域 Java内存区域是Java虚拟机&#xff08;JVM&#xff09;管理的内存资源的逻辑划分&#xff0c;用于存储程序运行时所需的数据。Java内存区域的合理划分和管理对于程序的性能和稳定性具有重要影响。本文将深入探讨Java内存区域的各个部分&#xff0c;包括方法区…

C语言第十八弹---指针(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、const修饰指针 1.1、const修饰变量 1.2、const修饰指针变量 2、指针运算 2.1、指针- 整数 2.2、指针-指针 2.3、指针的关系运算 3、野指针 3.1、…

由于误删了node依赖,导致这后面的一系列操作

文章目录 1. 事发原因&#xff1a;Delete select files2. Delete select files引起的cross-env报错3. cross-env是node_modules的依赖工具4. 那么Delete selected files到底是什么操作5. 重装node_modules依赖包&#xff0c;也报错6. 报错&#xff1a;cb() never called!7. 算了…

Transformer 自然语言处理(三)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第八章&#xff1a;使 transformers 在生产中更高效 在之前的章节中&#xff0c;您已经看到了 transformers 如何被微调以在各种任务上产生出色的结果。…