当前位置: 移动技术网 > IT编程>数据库>Oracle > 运维工作台方案详解

运维工作台方案详解

2020年07月18日  | 移动技术网IT编程  | 我要评论

一、运维工作台功能简介    

  1. 用户发起运维问题操作页面
  2. 运维工作台查收问题平台
  3. 运维问题查询报表

  

运维问题报表,查看当前问题的处理情况:

      

运维工作台,管理员可以在此页面解决提交过来的问题,解决完毕的问题会在已解决页面展示出来: 

 已解决页面: 

我的问题单,用户可以在我的问题单提出系统存在的问题或者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。

  接口:

          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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网