运维工作台方案详解
一、运维工作台功能简介
- 用户发起运维问题操作页面
- 运维工作台查收问题平台
- 运维问题查询报表
运维问题报表,查看当前问题的处理情况:
运维工作台,管理员可以在此页面解决提交过来的问题,解决完毕的问题会在已解决页面展示出来:
已解决页面:
我的问题单,用户可以在我的问题单提出系统存在的问题或者bug:
可以点击再次提问,重复在问题描述中提出问题, 然后点击保存,即可到运维工作台页面:
第一版数据库设计:
sys_problem_record 与 sys_problem_message 关联关系为:
(sys_problem_record)message_id =(sys_problem_message ) id
数据库表设计:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_problem_record
-- ----------------------------
DROP TABLE IF EXISTS `sys_problem_record`;
CREATE TABLE `sys_problem_record` (
`id` bigint(20) NOT NULL,
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '问题标题',
`problem_status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '问题状态',
`problem_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '问题类型',
`problem_level` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '问题级别',
`problem_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '联系电话',
`problem_email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '联系方式',
`attachment_oid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '附件Oid',
`message_id` bigint(20) NULL DEFAULT NULL COMMENT '消息id',
`version_number` int(11) NOT NULL DEFAULT 1,
`created_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`created_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP,
`last_updated_by` bigint(20) NULL DEFAULT NULL COMMENT '最后更新人',
`last_updated_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
消息表:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_problem_message
-- ----------------------------
DROP TABLE IF EXISTS `sys_problem_message`;
CREATE TABLE `sys_problem_message` (
`id` bigint(20) NOT NULL,
`message_desc` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '问题描述',
`message_reply` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '问题答复',
`version_number` int(11) NOT NULL DEFAULT 1,
`created_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`created_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP,
`last_updated_by` bigint(20) NULL DEFAULT NULL COMMENT '最后更新人',
`last_updated_date` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
存在的问题:
1. 用户如果多次回复,那么会出现id主键重复的情况。
2. 怎么将用户每次提交和回复的消息存放到一条记录里。
3. 需要考虑到运维工作台那边不过有多少次消息的提交和回复,都应该只有一条记录。
第二版:
在sys_proplem_message表里新增一个字段message_id,用来与sys_proplem_record做关联。
每次提交任务的时候,判断一下body的sys_problem_record是否含有Message_id,如果每个message里不含有id,表示是新增提交任务,如果带id那么就是消息的回复,根据message表的id来找到对应的message_desc。
接口:
http://10.72.9.128:9098/api/insertOrUpdate/problem/record POST方式
提交任务的body:
{
"title": "发票录入bug",
"problemType": "01",
"problemLevel": "01",
"problemPhone": "15997937193",
"problemEmail": "2432835715@qq.com",
"sysProblemMessage": [
{
"messageDesc": "发票操作的时候出现问题",
"messageReply": ""
}
],
"attachments":[
{
"attachmentOid":"5aeb4d56-0e4e-4572-9b0a-8b55a394e715"
},{
"attachmentOid":"86aa448d-e027-4b4a-aca4-2e216f03648d"
}
]
}
实现原理:
1. 根据record的id来判断是不是新提的问题。
2. 根据message的id判断是不是提交的任务。
3. 每次去获取到最新的最大的messageId+1最为最新的提交任务的message_id。
/**
* 提交任务或连续提交任务。
*/
@PostMapping("/insertOrUpdate/problem/record")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<ProblemRecordDTO> insertOrUpdateProbleam(@RequestBody ProblemRecordDTO dto){
SysProblemRecord sysProblemRecord=new SysProblemRecord();
BeanUtils.copyProperties(dto, sysProblemRecord);
//消息处理
List<SysProblemMessage> messages=dto.getSysProblemMessage();
//附件处理
List<AttachmentDTO> attachmentDTOS=dto.getAttachments();
if (!CollectionUtils.isEmpty(attachmentDTOS)){
List<UUID> oids = attachmentDTOS.stream().map(AttachmentDTO::getAttachmentOid).collect(toList());
sysProblemRecord.setAttachmentOid(listToString(oids,","));
}
Long maxMessageId=null;
if (dto.getMessageId()==null){
maxMessageId=problemMessageService.selectMaxMessageId();
}
for (SysProblemMessage e:messages){
// 1. 如果是单个来回的回复,那么只需要插入消息和更新消息
//新增
if (!StringUtils.isEmpty(e.getMessageReply())){
sysProblemRecord.setProblemStatus("R");
}
if (e.getMessageId()==null){
//创建新的一个消息
if (dto.getMessageId()!=null){
//连续回复的消息Id设置
e.setMessageId(dto.getMessageId());
}else{
// 新增提交消息
e.setMessageId(maxMessageId+1);
}
problemMessageService.insert(e);
//如果说已经存在了消息,那么就不设置消息id
sysProblemRecord.setMessageId(e.getMessageId());
//每次新插入一条消息,表示问题待提交
sysProblemRecord.setProblemStatus("P");
}else{
//更新
problemMessageService.updateById(e);
}
}
if (dto.getId()==null){
sysProblemRecord.setProblemStatus("P");
//获取创建人的公司和部门id
CompanyCO companyCO= companyClient.getByUserOid(OrgInformationUtil.getCurrentUserOid());
if (companyCO!=null){
sysProblemRecord.setCompanyId(companyCO.getId());
}
Optional<Department> departmentUser=departmentUserService.getDepartmentByUserId(OrgInformationUtil.getCurrentUserId());
Department department= departmentUser.get();
if (department!=null){
sysProblemRecord.setDepartmentId(department.getId());
}
problemService.insert(sysProblemRecord);
}else{
problemService.updateById(sysProblemRecord);
}
BeanUtils.copyProperties(sysProblemRecord,dto);
return new ResponseEntity<>(dto, HttpStatus.OK);
}
本文地址:https://blog.csdn.net/qq_33036061/article/details/107255706