报修系统 - 详解项目
笔记
反规范的命名,唉。
# 角色
审核员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类对象
# 名词解释
标记的名词看不懂,这里有解释,都有标记
审核单:审核员要审核的订单
下班单:审核员下班了,但是还没来得及审核的订单。
笔记
问就是审核员不想加班,到点直接下班 😄
返工天数:接单人处理完订单后,开始对该订单计时。类似于淘宝拿到快递后,却没有去app点击确认收货,但是一定时间后app会自动确认收货
# util包
# 类结构
其他99%不会被修改
config
|—— quartzUtils
|—— BxdCheckTask
|—— FgAndPjTask
|—— OrderListener
|—— ShyCheck
├── AesTra
|── AutoOrder
├── DictItemTree
├── EwmUtil
├── GetInfo
├── GetSqlSession
├── Me
├── ParseUtil
├── PathUtil
├── RealMe
├── UnicodeEncode
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 内容
quartzUtils
包:都是定时任务执行的类BxdCheckTask
类:获取未派送的订单,将这些订单分配给有工时的接单人,并在易班推送消息给接单人executeBxdCheck
方法:获取未派送的订单,将这些订单分配给有工时的接单人,并在易班推送消息给接单人
FgAndPjTask
类:返工天数减一以及15天后默认好评reduceFgts
方法:返工天数减1。用到两个mapper:一个是获取已完成的订单,一个是给这些完成订单的返工时间减1setPjnr
方法: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
实体类,还有用户其他的真实信息如身份证。都存入sessionprintError
方法:获取报错信息,存储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
类:警告
不知道有何用处
# 优化
- 命名要规范
GetInfo
类的getMe
方法和getRealMe
方法合并Me
和RealMe
和DictItemTree
实体类不应该放在util目录下ParseUtil
类有switch,可尝试解构
# config包
# 结构
config
├── CrosConfig
|── QuartzConfiguration
├── RestTemplateConfig
├── Swagger2Config
2
3
4
5
# 内容
CrosConfig
类:解决跨域问题QuartzConfiguration
类:定时任务。一共有4个定时任务。分别为OrderListener
类的executeGsCheck
方法:当总订单派单工时已经超过12的接单人,他的其他订单重新派给未满12的接单人每天9点-18点内 每隔20分钟 执行一次这个方法
ShyCheck
类的executeShyCheck
方法:获取下班单,随机分配给在上夜班的审核员进行审核早上8点-早上10点 每隔15分钟 执行一次这个方法
警告
有疑惑,既然获取下班单,那么应该是晚上的夜班才对,怎么是早上
BxdCheckTask
类的executeBxdCheck
方法:处理没有派送的订单,让这些订单分配给空闲的接单人去处理。轮询查找早上9点-早上18点 每隔20分钟 执行一次
FgAndPjTask
类的executeFgAndPjTask
:返工天数减一以及15天后默认好评每天凌晨 3:30 触发一次
RestTemplateConfig
类:将RestTemplate
类放入IOC容器里,该类是restful风格的http。并给该http设置一些参数如请求超时时间,响应超时时间等,因为项目打算用RestTemplate
来和易班进行请求。不可能无线请求下去,一定时间内易班不给数据,则撤回请求,并报错,存入日志Swagger2Config
类:配置swagger,用于生成接口文档。指定了标题、描述、版本、作者、许可证等
# constant包
# 结构
constant
├── GlmcConstants
2
# 内容
GlmcConstants
类:桂林医学院报修系统的常量类。只有两个内容/** * 总工时,单位:小时 */ public static final double GS = 12.0; public static final String HC_APPEND_SYMBOL = "=";
1
2
3
4
5
# exception包
# 结构
exception
├── GlobalExceptionHandler
2
# 内容
GlobalExceptionHandler
类:全局异常处理类。笔记
用到了
@ControllerAdvice
注解,指定哪些方法处理哪些异常
# filter包
# 结构
filter
├── AddResponseHeaderFilter
2
# 内容
AddResponseHeaderFilter
类:给响应头配置参数,如UTF-8
,保证返回给前端的信息不乱码笔记
该类继承了
OncePerRequestFilter
类,表示能够确保在一次请求只通过一次filter,而不需要重复执行。其实在spring里,每个filter都默认继承OncePerRequestFilter
# response包
# 结构
response
├── ResponseData
2
# 内容
ResponseData
类:封装返回前端信息实体类,有状态码、信息数字、数据状态status:success、false
信息数字info:
- 0:未登录授权请登录,
- 1:程序错误请刷新,
- 2:无效参数,
- 3:缺少传递必要参数
- 其余的info就自己定义
# service包
# 结构
service
|—— impl
|—— 实现类
├── AdminService
|── BxdService
├── BxqyService
├── EwmService
├── ExportService
├── HcService
├── IDictService
├── JdrService
├── QdbService
├── ShyService
2
3
4
5
6
7
8
9
10
11
12
13
# 内容
AdminService
接口:用户相关操作login
方法:登录
BxdService
接口:报修单相关操作selforsbr
方法:根据申报人学号,获取该申报人申报的报修单selbxdforshyid
方法:根据报修单id,获取该报修单,返回内容只要求有审核员、审核员是否同意、接单人id,二维码id的信息selbxdbyadmin
方法:selbxdforeid
方法:根据二维码id,获取由该二维码扫描出的没有完成的报修单selbxdbyjdr
方法:根据接单人的易班id,获取由该接单人处理的报修单,如果报修单的状态不为空、二维码id不为空,也加入判断中selbxdbyshy
方法:根据审核员id,获得该审核员 处理 过的报修单。报修单不包括已撤回的,如果二维码id不为空,获得的报修单是该二维码区域的upbxdbysbr
方法:根据申报人学号、报修单id,来更新该报修单更新条件
如果申报人撤销了,则将报修单状态改为已撤销
如果申报人进行评价,则将该报修单的评价体系 加上 评价星级和内容
如果申报人追加评价,则将该报修单的评价体系 加上 该追加评价内容
upbxd1byshy
方法:当审核员 1 处理报修单,则根据该报修单 id,来进行更新处理结果更新条件
如果耗材了,则在报修单表加上耗材内容
如果接单人消耗工时了,则在报修单表加上消耗的工时
审核员2也处理了报修单,则在报修单表上加上处理结果
upbxd2byshy
方法:和上方同理,只是审核员1和审核员2调换位置upbxdhcbyshy
方法:当审核员1或者审核员2处理报修单,则根据该报修单id,来进行更新处理结果更新条件
- 如果耗材了,则在报修单表加上耗材内容
- 如果接单人消耗工时了,则在报修单表加上消耗的工时
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 内容
当status状态不为空,则返回对应状态的报修单。支持多个。状态对应: 1已派单,2已维修,3撤销单,4已验收,5不通过验收
当taskFgts不为空,则获取返工天数大于0的报修单
当taskPjnr不为空,则获取评价内容为空、评价星级为空、返工天数为0的报修单
updateBatch
方法:根据多个id,批量更新对应id的报修单更新条件
taskFgts不为空,代表返工天数未满15天,则进行返工天数减少1
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 内容
AdminLogin
类:用户相关的controlleradminLogin
方法:用户登录相关,成功则存入 session
AdminServlet
类:用户的请求处理类adminServlet
方法:获取用户相关的请求,根据请求参数处理内容
处理内容:
adminindex
方法:获取首页数据bxnum
方法:获取报修单总数newewm
方法:插入二维码到数据库newqy
方法:插入一个报修区域到数据upewm
方法:更新二维码到数据库upqy
方法:更新报修区域到数据库selewm
方法:查询一个二维码数据uppeople
方法:根据条件:删除一个审核员、修改一个审核员、删除一个接单人、修改一个接单人newpeople
方法:根据条件:添加一个审核员、添加一个接单人upbxdbyadmin
方法:分配或者审核报修单,并更新该报修单到数据库selqdb
方法:查询某个审核员的签到表数据selalljdr
方法:查询接单人的数据selOptimaljdrPC
方法:查询适合的接单人selallqy
方法:获取某个报修区域的数据selbxdbyadmin
方法:selbxdbyadminpc
方法:
BxdServlet
类:报修单相关的controllerbxdServlet
方法:获取报修单相关的请求,根据请求参数处理内容
处理内容:
selbxdforeid
方法:根据二维码id,获取由该二维码扫描出的没有完成的报修单selqybysbr
方法:提供二维码id,查询该二维码和所在的报修区域的数据filebase64
方法:整合返工和新增工单,返工要传jdr的jid和本单的idupbxdbysbr
方法:根据申报人学号、报修单id,来更新该报修单,如果报修单已被接单人接到,就提供易班告诉接单人:报修单的更新sbr
方法:根据申报人学号,获取该申报人申报的报修单
Fileload
类:文件上传处理相关的controllerVideoController
类:视频上传处理相关的controllerBxqyServlet
类:报修区域相关的controllerbxqyServlet
方法:获取报修区域相关的请求,根据请求参数处理内容
处理内容:
selqybyid
方法:根据报修区域id,获取该报修区域的数据
DictController
类:维修类型相关的controllergetAllWxlb
方法:获取维修类别,根据字符串解析为中文
EwmServlet
类:二维码相关的controllerewmServlet
方法:获取二维码相关的请求,根据请求参数处理内容
处理内容:
selEwmById
方法:根据二维码id,获取该二维码的数据updEwmQid
方法:根据二维码id范围,更新范围内的二维码所处的区域
export
类:导出为 xls 的文件相关的controllerexport2xlsx
方法:导出为 xls 文件
HcServlet
类:耗材相关的controllerhcServlet
方法:获取耗材相关的请求,根据请求参数处理内容
处理内容:
selHcByLb
方法:根据一级类别和二级类别获取耗材表的数据newhc
方法:插入一条耗材数据uphc
方法:更新一条耗材数据delhc
方法:删除一条耗材数据selhc
方法:查询所有耗材表的数据
JdrServlet
类:接单人相关的controllerjdrServlet
方法:获取接单人相关的请求,根据请求参数处理内容
处理内容:
selgs
方法:查询接单人当天 已维修和已验收 报修单的所花费的工时,存在工时则四舍五入计算,保留小数点 12 位,否则为0upbxdbyjdr
方法:通过接单人id和报修单id,来更新该报修单的数据,如耗材工时selbxdbyjdr
方法:根据接单人的易班id,获取由该接单人处理的报修单,如果报修单的状态不为空、二维码id不为空,也加入判断中
ShyServlet
类:审核员相关的controllershyServlet
方法:获取审核员相关的请求,根据请求参数处理内容
处理内容:
upbxdhcbyshy
方法:当审核员1或者审核员2处理报修单,则根据该报修单id,来进行更新处理结果更新条件
如果耗材了,则在报修单表加上耗材内容
如果接单人消耗工时了,则在报修单表加上消耗的工时
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
的概念