报修系统 - 详解项目
笔记
反规范的命名,唉。
# 角色
审核员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的概念