Skip to content
0

报修系统 - 详解 项目

NOTE

反规范的命名,唉。

角色

审核员 2 名:审核订单的人。2 名都审核通过才会通过

接单人多名:处理订单的人,一对一

申报人多名:报修的人,一般为学生

名词翻译

实体类简称

Admin:用户

属性详解

id:用户 id

account:用户名

password:密码

bxd:报修单

属性详解

id:报修单 id

sbsj:申报时间

eid:二维码 id

xxdd:详细地点

yysj:预约时间(不是具体时间,是字符串)公共区域不用

bxlb:报修类别

bxnr:报修内容

sp:视频(视频地址)

tp:图片(图片地址)

sbr:申报人

shy1state:0 未审核,1 审核通过,2 审核未通过

sbrxh:申报人学号

hc:耗材使用

gs:工时

jid:接单人 ybid

shy1:第一位审核员

sbrsj:申报人手机号码

shy2:第二位审核员

shy2state:0 未审核,1 审核通过,2 审核未通过

wxsj:维修时间(或者是撤销时间)

cxsy:撤销事由

pj:评价星级

pjnr:评价内容

pjzj:评价追加

state:1 已派单,2 已维修,3 撤销单,4 已验收,5 不通过验收 qy:报修区域

qylb:报修区域列表

xq:校区

ewmdd:二维码所在区域

fgts:返工天数

jdsj:交单时间?

yssj:验收时间

bxqy:报修区域

属性详解

id:区域编号

qy:区域名称

qylb:区域类别

xq:校区

x:后台管理 x 坐标

y:后台管理 Y 坐标

ewm:二维码集合

b:保修单集合

countb

ewm:二维码

属性详解

id:二维码编号

qid:区域编号

xxdd:二维码详细地点(不等于报修的详细地点)

qy:报修区域

hc:耗材

属性详解

id:耗材编号

mc:材料名称

jg:价格

dw:单位

kc:库存

lb:耗材类别

xh:耗材型号

jdr:接单人

属性详解

ybid:易班 id

gh:工号

xm:姓名

sj:手机

yx:邮箱

state:1 在职,2 休假,3 离职

ywfw:(业务范围)1,2,4,8,16,32,64

zjds

dqds

pjpj

qdb:签到表

属性详解

id:签到表编号

qdsj:签到时间

shyid:审核员 id

xq:校区

state:1 签到,2 签退

shy:审核员

属性详解

ybid:易班 id

gh:工号

xm:姓名

zw:1 普通职员,2 高级职员

xq:当前校区

x:X 坐标

y:Y 坐标

其他简称

yb:易班

xq:校区

service 类对象简称

bs:报修单的 service 类对象

es:二维码的 service 类对象

zdpd:自动派单的 service 类对象

ss:审核员的 service 类对象

qs:签到表的 service 类对象

js:接单人的 service 类对象

ybmsg:请求易班的 service 类对象

名词解释

标记的名词看不懂,这里有解释,都有标记

审核单:审核员要审核的订单

下班单:审核员下班了,但是还没来得及审核的订单。

NOTE

问就是审核员不想加班,到点直接下班 😄

返工天数:接单人处理完订单后,开始对该订单计时。类似于淘宝拿到快递后,却没有去 app 点击确认收货,但是一定时间后 app 会自动确认收货

util 包

类结构

其他 99%不会被修改

config
|—— quartzUtils
	  |—— BxdCheckTask
	  |—— FgAndPjTask
	  |—— OrderListener
	  |—— ShyCheck
├── AesTra
|── AutoOrder
├── DictItemTree
├── EwmUtil
├── GetInfo
├── GetSqlSession
├── Me
├── ParseUtil
├── PathUtil
├── RealMe
├── UnicodeEncode

内容

  • quartzUtils包:都是定时任务执行的类

    • BxdCheckTask 类:获取未派送的订单,将这些订单分配给有工时的接单人,并在易班推送消息给接单人

      • executeBxdCheck方法:获取未派送的订单,将这些订单分配给有工时的接单人,并在易班推送消息给接单人
    • FgAndPjTask类:返工天数减一以及 15 天后默认好评

      • reduceFgts方法:返工天数减 1。用到两个 mapper:一个是获取已完成的订单,一个是给这些完成订单的返工时间减 1

      • setPjnr方法:15 天后默认好评。用到两个 mapper:一个获取已满 15 天却未验收的订单,一个是给这些未验收订单主动验收,并给好评

        危险

        疑惑:怎么知道已满 15 天呢,我猜有定时任务,自动加 1 天吧,目前没看到,如果这条内容没有被删除,代表我没看到加 1 天的代码

    • OrderListener类:获取工时超过 12 的接单人的未处理的订单,交给其他人

      • executeGsCheck方法:当总订单派单工时已经超过 12 的接单人,他的其他订单重新派给未满 12 的接单人
    • ShyCheck类:获取下班单,随机分配给在上夜班的审核员进行审核

      • executeShyCheck:获取下班单,随机分配给在上夜班的审核员处进行审核
  • AesTra类:加密解密类

    • encrypt方法:传入密钥和密码进行加密。目前没用到该方法
    • decrypt方法:传入密钥和密码进行解密。目前没用到该方法
    • parseByte2HexStr方法:位运算进行加密。由encrypt方法调用
    • parseHexStr2Byte方法:位运算进行解密。由decrypt方法调用
  • AutoOrder类:处理派送订单类

    • zdpd方法:查找符合接单条件的接单人直接派单。条件:在职、工时小于 12、在负责的区域里,当天签到了
  • DictItemTree类:维修列表的实体类。存储如物业维修、热随维修、家电维修、空调维修等信息

    危险

    疑惑:为什么放在 utils 目录下

  • EwmUtil类:二维码工具类

    • generateQRCodeImage方法:生成二维码的条纹格式。用到的BarcodeFormat.QR_CODE枚举代表条纹格式的二维码
  • GetInfo类:与易班进行授权,并获取登录用户的隐私信息(token)和普通信息(用户名,头像)和真实信息(真实姓名)

    • init方法:要求授权并获得 token,将 token 存入session域里,如果授权失败,则返回登录页面继续授权

    • getMe方法:获取用户的基本信息,如用户名,头像,学校名等,存入Me实体类中。

      警告

      项目里并没有用到这个方法!用到下面这个方法

    • getRealMe方法:在getMe方法上,多了一个实体类RealMe,它不仅封装了Me实体类,还有用户其他的真实信息如身份证。都存入 session

    • printError方法:获取报错信息,存储 session 中,key 为message

  • GetSqlSession类:获取 mybatis 的openSession对象。

    警告

    项目没有用到!

  • Me类:用户信息的实体类,如昵称、性别、头像、学校等信息。主要存储与易班请求后得到数据的一个实体类。

  • ParseUtil类:解析报修类型和耗材内容。大部分内容都在数据库的bxd

    • paraseBxlb方法:参数为数字-数字。如 2-2,3-1。根据数字获得不同的报修内容,最终返回的结果是报修类型-具体类型。如 物业报修-家具。

      提示

      其实传来的参数是数字,解析后就是内容。数据库里已经规定一个数字代表一个内容

      点击我查看数字对应的类型

      第一个数字:

      • 1:物业保修

      • 2:水电维修

      • 3:热水维修

      • 4:家电维修

      • 5:空调维修

      • 6:其他维修

      第二个数字:

      1:家具

      2:腻子

      3:墙砖

      ......

      具体数据库,第二个数字有 60 个左右

    • paraseHc方法:获取耗材的相关信息。和上面方法类似,解析分割传来的参数,获得不同的小参数,去数据库获取内容,具体看源码

    • paraseHc1方法:和paraseHc几乎一样,只不过返回结果前,多加了一个字符串作为标识符

    • getzlb方法:提供保修类型的英文,转化对应的中文,就是上方隐藏的内容

  • PathUtil类:获取存放信息表格的路径,即 static所在的路径,分为生产和开发两个路径。前者是 resource 目录,后者是指定一个本地的文件夹

  • RealMe类:Me类的封装实体类,在Me的基础上多加了一些用户的真实信息

  • UnicodeEncode类:

    危险

    不知道有何用处

优化

  1. 命名要规范
  2. GetInfo类的getMe方法和getRealMe方法合并
  3. MeRealMeDictItemTree实体类不应该放在 util 目录下
  4. ParseUtil类有 switch,可尝试解构

config 包

结构

config
├── CrosConfig
|── QuartzConfiguration
├── RestTemplateConfig
├── Swagger2Config

内容

  • CrosConfig类:解决跨域问题

  • QuartzConfiguration类:定时任务。一共有 4 个定时任务。分别为

    1. OrderListener类的executeGsCheck方法:当总订单派单工时已经超过 12 的接单人,他的其他订单重新派给未满 12 的接单人

      每天 9 点-18 点内 每隔 20 分钟 执行一次这个方法

    2. ShyCheck类的executeShyCheck方法:获取下班单,随机分配给在上夜班的审核员进行审核

      早上 8 点-早上 10 点 每隔 15 分钟 执行一次这个方法

      危险

      有疑惑,既然获取下班单,那么应该是晚上的夜班才对,怎么是早上

    3. BxdCheckTask类的executeBxdCheck方法:处理没有派送的订单,让这些订单分配给空闲的接单人去处理。轮询查找

      早上 9 点-早上 18 点 每隔 20 分钟 执行一次

    4. FgAndPjTask类的executeFgAndPjTask返工天数减一以及 15 天后默认好评

      每天凌晨 3:30 触发一次

  • RestTemplateConfig类:将RestTemplate类放入 IOC 容器里,该类是 restful 风格的 http。并给该 http 设置一些参数如请求超时时间,响应超时时间等,因为项目打算用RestTemplate来和易班进行请求。不可能无线请求下去,一定时间内易班不给数据,则撤回请求,并报错,存入日志

  • Swagger2Config类:配置 swagger,用于生成接口文档。指定了标题、描述、版本、作者、许可证等

constant 包

结构

constant
├── GlmcConstants

内容

  • GlmcConstants类:桂林医学院报修系统的常量类。只有两个内容

    java
    /**
    * 总工时,单位:小时
     */
    public static final double GS = 12.0;
    public static final String HC_APPEND_SYMBOL = "=";

exception 包

结构

exception
├── GlobalExceptionHandler

内容

  • GlobalExceptionHandler类:全局异常处理类。

    NOTE

    用到了@ControllerAdvice注解,指定哪些方法处理哪些异常

filter 包

结构

filter
├── AddResponseHeaderFilter

内容

  • AddResponseHeaderFilter类:给响应头配置参数,如UTF-8,保证返回给前端的信息不乱码

    NOTE

    该类继承了OncePerRequestFilter类,表示能够确保在一次请求只通过一次 filter,而不需要重复执行。

    其实在 spring 里,每个 filter 都默认继承 OncePerRequestFilter

response 包

结构

response
├── ResponseData

内容

  • ResponseData类:封装返回前端信息实体类,有状态码、信息数字、数据

    • 状态 status:success、false

    • 信息数字 info:

      • 0:未登录授权请登录,
      • 1:程序错误请刷新,
      • 2:无效参数,
      • 3:缺少传递必要参数
      • 其余的 info 就自己定义

service 包

结构

service
|—— impl
	|—— 实现类
├── AdminService
|── BxdService
├── BxqyService
├── EwmService
├── ExportService
├── HcService
├── IDictService
├── JdrService
├── QdbService
├── ShyService

内容

  • AdminService接口:用户相关操作

    • login 方法:登录
  • BxdService 接口:报修单相关操作

    • selforsbr 方法:根据申报人学号,获取该申报人申报的报修单

    • selbxdforshyid 方法:根据报修单 id,获取该报修单,返回内容只要求有审核员、审核员是否同意、接单人 id,二维码 id 的信息

    • selbxdbyadmin 方法:

    • selbxdforeid 方法:根据二维码 id,获取由该二维码扫描出的没有完成的报修单

    • selbxdbyjdr 方法:根据接单人的易班 id,获取由该接单人处理的报修单,如果报修单的状态不为空、二维码 id 不为空,也加入判断中

    • selbxdbyshy 方法:根据审核员 id,获得该审核员 处理 过的报修单。报修单不包括已撤回的,如果二维码 id 不为空,获得的报修单是该二维码区域的

    • upbxdbysbr 方法:根据申报人学号、报修单 id,来更新该报修单

      更新条件

      1. 如果申报人撤销了,则将报修单状态改为已撤销

      2. 如果申报人进行评价,则将该报修单的评价体系 加上 评价星级和内容

      3. 如果申报人追加评价,则将该报修单的评价体系 加上 该追加评价内容

    • upbxd1byshy 方法:当审核员 1 处理报修单,则根据该报修单 id,来进行更新处理结果

      更新条件

      1. 如果耗材了,则在报修单表加上耗材内容

      2. 如果接单人消耗工时了,则在报修单表加上消耗的工时

      3. 审核员 2 也处理了报修单,则在报修单表上加上处理结果

    • upbxd2byshy 方法:和上方同理,只是审核员 1 和审核员 2 调换位置

    • upbxdhcbyshy 方法:当审核员 1 或者审核员 2 处理报修单,则根据该报修单 id,来进行更新处理结果

      更新条件

      1. 如果耗材了,则在报修单表加上耗材内容
      2. 如果接单人消耗工时了,则在报修单表加上消耗的工时
    • upbxdbyadmin 方法:只要报修单表的任意字段不为空,则进行更新

    • fg 方法:更新申报时间、交单时间、验收时间,只要报修单表的任意字段不为空,则进行更新

    • upbxdbyjdr 方法:通过接单人 id 和报修单 id,来更新该报修单

    • del 方法:根据报修单 id,删除该报修单

    • newbxdbysbr 方法:插入数据到报修单表中

    • selnumforstate 方法:查询不同状态的报修单总数,如已派单的报修单有多少个、已维修的报修单有多少个

    • selnumforpj 方法:查询不同评价星级的报修单总和,如 5 星的报修单有多少个

    • allcount 方法:查询一共有多少个报修单,即表里的全部报修单

    • selgs 方法:查询接单人当天 已维修和已验收 报修单的所花费的工时,工时四舍五入计算,保留小数点 12 位

    • tj 方法:获取一些不同状态的报修单数量

    • getsbrbxdnewid 方法:根据申报人学号,获取他最新申报的报修单,可能申报了多个,这方法只获取最新时间的那个

    • upbxdbyysr 方法:更新报修单的状态,如果验收时间不为空,则也进行更新

    • selishc 方法:根据报修单 id,查询该报修单的耗材数据

    • selonebxd 方法:根据报修单 id,查询该报修单的全部信息

    • xxsjBxd 方法:查看在休息时间内 有一个审核员审核,另一个审核员未审核的报修单的报修单。休息时间:当天 18 点 到第二天 10 点

    • selwpdbxd 方法:查询前 20 个未派单的报修单

    • selBxdByMap 方法:根据一个 map,查询符合条件的报修单

      map 内容

      1. 当 status 状态不为空,则返回对应状态的报修单。支持多个。状态对应: 1 已派单,2 已维修,3 撤销单,4 已验收,5 不通过验收

      2. 当 taskFgts 不为空,则获取返工天数大于 0 的报修单

      3. 当 taskPjnr 不为空,则获取评价内容为空、评价星级为空、返工天数为 0 的报修单

    • updateBatch 方法:根据多个 id,批量更新对应 id 的报修单

      更新条件

      1. taskFgts 不为空,代表返工天数未满 15 天,则进行返工天数减少 1

      2. taskPjnr 不为空,代表返工天数到达 15 天,则默认五星评价星级评价,内容为好评

    • seljdrforpd 方法:仅查询出有 接单人易班 id、业务范围,不同状态的接单人信息,还包括 所有在职的易班 id 总数

  • BxqyService 接口:报修区域相关操作

    • selbxqy 方法:根据报修区域 id,获取该报修区域的数据
    • selallqy 方法:获取所有报修区域的数据
    • ditu 方法:获取某个报修区域的数据
    • newqy 方法:插入一条报修区域的数据
    • upqy 方法:更新一条报修区域的数据
    • selByEwmId 方法:根据二维码 id,查询该二维码数据
  • EwmService 接口:二维码相关操作

    • selewm 方法:根据区域 id,查询该区域的二维码数据
    • selqyidbyewm 方法:根据二维码 id,查询该二维码的数据
    • selqybysbr 方法:根据二维码 id,查询该二维码和所在的报修区域的数据
    • newewm 方法:插入一个二维码
    • upewm 方法:更新一个二维码
    • selxxwz 方法:获得二维码的详细地点信息
    • selById 方法:根据二维码 id,获取该二维码的数据
    • updQidyAdmin 方法:根据二维码 id 范围,更新范围内的二维码所处的区域
  • ExportService 接口:将数据以 xls 文件形式导出

  • HcService 接口:耗材相关操作

    • selall 方法:查询所有耗材表的数据
    • selHcByLb 方法:根据一级类别和二级类别获取耗材表的数据
    • selOneHc 方法:根据耗材 id,获取该耗材的数据
    • delhc 方法:根据耗材 id,删除该耗材的数据
    • newhc 方法:插入一条耗材数据到耗材表
    • uphc 方法:根据耗材 id,更新该耗材的数据
  • JdrService 接口:

    • selalljdr 方法:查询接单人的数据
    • del 方法:根据接单人易班 id,删除该接单人的数据
    • newjdr 方法:插入一条接单人的数据
    • upjdr 方法:更新一条接单人的数据
    • selOptimaljdr 方法:
    • selOptimaljdrPC 方法:
  • MsgPushService 接口:发布消息给易班

  • QdbService 接口:

    • selallqy 方法:根据审核员 id,查询该审核员的所有签到表
    • qd 方法:插入一条审核员的签到数据到签到表
    • selectOptimalXq 方法:根据审核员 id,从签到表查询该审核员签到的校区地点,前提:审核员在职
    • selectOptimalXqForShy 方法:根据审核员 id,从签到表查询该审核员签到的校区地点,和上方方法比较:该方法不管审核员是否在职
  • ShyService 接口:

    • selallqy 方法:查询所有的审核员数据
    • del 方法:根据审核员 id,删除该审核员
    • newshy 方法:插入一条审核员数据
    • UPshy 方法:根据审核员 id,更新该审核员的姓名和职位,职位:1:普通职员、2:高级职员
    • selOptimalShy 方法:根据签到区域,查询今日到第二天早上 9 点前签到的并且没有签退的审核员
    • selqtShy 方法:根据签到区域,查询今日签退的审核员
    • sellsqdshy 方法:根据签到区域,查询历史签到以及签退的审核员,也有可能是今天的
    • selOneShy 方法:根据易班 id,查询 id 对于的审核员数据

controller 包

结构

controller
|—— admin
	|—— AdminLogin
	|—— AdminServlet
├── bxd
	|—— BxdServlet
	|—— Fileload
	|—— VideoController
|── bxqy
	|—— BxqyServlet
├── dict
	|—— DictController
├── ewm
	|—— EwmServlet
├── export
	|—— export
├── hc
	|—— HcServlet
├── jdr
	|—— JdrServlet
├── shy
	|—— ShyServlet
├── Info
├── Login
├── Service

内容

  • AdminLogin 类:用户相关的 controller

    • adminLogin 方法:用户登录相关,成功则存入 session
  • AdminServlet 类:用户的请求处理类

    • adminServlet 方法:获取用户相关的请求,根据请求参数处理内容

    处理内容:

    • adminindex 方法:获取首页数据
    • bxnum 方法:获取报修单总数
    • newewm 方法:插入二维码到数据库
    • newqy 方法:插入一个报修区域到数据
    • upewm 方法:更新二维码到数据库
    • upqy 方法:更新报修区域到数据库
    • selewm 方法:查询一个二维码数据
    • uppeople 方法:根据条件:删除一个审核员、修改一个审核员、删除一个接单人、修改一个接单人
    • newpeople 方法:根据条件:添加一个审核员、添加一个接单人
    • upbxdbyadmin 方法:分配或者审核报修单,并更新该报修单到数据库
    • selqdb 方法:查询某个审核员的签到表数据
    • selalljdr 方法:查询接单人的数据
    • selOptimaljdrPC 方法:查询适合的接单人
    • selallqy 方法:获取某个报修区域的数据
    • selbxdbyadmin 方法:
    • selbxdbyadminpc 方法:
  • BxdServlet 类:报修单相关的 controller

    • bxdServlet 方法:获取报修单相关的请求,根据请求参数处理内容

    处理内容:

    • selbxdforeid 方法:根据二维码 id,获取由该二维码扫描出的没有完成的报修单
    • selqybysbr 方法:提供二维码 id,查询该二维码和所在的报修区域的数据
    • filebase64 方法:整合返工和新增工单,返工要传 jdr 的 jid 和本单的 id
    • upbxdbysbr 方法:根据申报人学号、报修单 id,来更新该报修单,如果报修单已被接单人接到,就提供易班告诉接单人:报修单的更新
    • sbr 方法:根据申报人学号,获取该申报人申报的报修单
  • Fileload 类:文件上传处理相关的 controller

  • VideoController 类:视频上传处理相关的 controller

  • BxqyServlet 类:报修区域相关的 controller

    • bxqyServlet 方法:获取报修区域相关的请求,根据请求参数处理内容

    处理内容:

    • selqybyid 方法:根据报修区域 id,获取该报修区域的数据
  • DictController 类:维修类型相关的 controller

    • getAllWxlb 方法:获取维修类别,根据字符串解析为中文
  • EwmServlet 类:二维码相关的 controller

    • ewmServlet 方法:获取二维码相关的请求,根据请求参数处理内容

    处理内容:

    • selEwmById 方法:根据二维码 id,获取该二维码的数据
    • updEwmQid 方法:根据二维码 id 范围,更新范围内的二维码所处的区域
  • export 类:导出为 xls 的文件相关的 controller

    • export2xlsx 方法:导出为 xls 文件
  • HcServlet 类:耗材相关的 controller

    • hcServlet 方法:获取耗材相关的请求,根据请求参数处理内容

    处理内容:

    • selHcByLb 方法:根据一级类别和二级类别获取耗材表的数据
    • newhc 方法:插入一条耗材数据
    • uphc 方法:更新一条耗材数据
    • delhc 方法:删除一条耗材数据
    • selhc 方法:查询所有耗材表的数据
  • JdrServlet 类:接单人相关的 controller

    • jdrServlet 方法:获取接单人相关的请求,根据请求参数处理内容

    处理内容:

    • selgs 方法:查询接单人当天 已维修和已验收 报修单的所花费的工时,存在工时则四舍五入计算,保留小数点 12 位,否则为 0
    • upbxdbyjdr 方法:通过接单人 id 和报修单 id,来更新该报修单的数据,如耗材工时
    • selbxdbyjdr 方法:根据接单人的易班 id,获取由该接单人处理的报修单,如果报修单的状态不为空、二维码 id 不为空,也加入判断中
  • ShyServlet 类:审核员相关的 controller

    • shyServlet 方法:获取审核员相关的请求,根据请求参数处理内容

    处理内容:

    • upbxdhcbyshy 方法:当审核员 1 或者审核员 2 处理报修单,则根据该报修单 id,来进行更新处理结果

      更新条件

      1. 如果耗材了,则在报修单表加上耗材内容

      2. 如果接单人消耗工时了,则在报修单表加上消耗的工时

    • selqdb 方法:根据审核员 id,查询该审核员的所有签到表

    • qd 方法:插入一条审核员的签到数据到签到表

    • upbxdbyshy 方法:当审核员 1 或者审核员 2 处理报修单,则根据该报修单 id,来进行更新处理结果,并查询该报修单是否已经真正处理,然后推送结果给接单人

    • upbxdbyysr 方法:更新报修单的状态,并通知处理该报修单的接单人

    • selbxdbyshy 方法:根据审核员 id,获得该审核员 处理 过的报修单。报修单不包括已撤回的,如果二维码 id 不为空,获得的报修单是该二维码区域的

  • Info 类:从 session 获取用户的信息

  • Login 类:登录成功或者失败,页面的跳转,后者因为用户名密码错误或者过期,跳转登录页

  • Service 类:通过易班 id,获取该 id 的个人信息,并通过工号判断属于哪类人。1:申报人、2:接单人、3:审核员

学到的技巧

大部分学到的内容都在上方用 笔记蓝色框 标记了

  • 如果对数据库进行批量的增删改。不要在 Java 代码里循环,然后调用 mapper 层。而是以集合的方式把所有参数传给 mybatis,让 mybatis 进行遍历,即使用forreach标签
  • @ControllerAdvice 注解实现全局异常处理
  • OncePerRequestFilter的概念
最近更新