自定义业务和用户企业项目建立关联

> 概述: > > 此节将带领开发者创建自定义扩展模块(报修示例),实现扩展业务对象和平台内置业务对象建立关联关系。 ## 1.创建数据库 ```sql -- 该示例数据库使用MySql数据库。表结构示例如下: CREATE TABLE `repair` ( `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `created_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建名字', `created_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人id', `repair_time` datetime(0) NOT NULL COMMENT '报修时间', `describe` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '问题描述', `urgency` int(4) NOT NULL COMMENT '紧急程度(1:非常紧急、2:紧急、3:一般)', `state` int(4) NOT NULL COMMENT '状态(0:待处理、1:处理完成)', `Timeout` int(4) NOT NULL COMMENT '超时时间', `handle_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理人id', `handle_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理名字', `handle_time` datetime(0) NULL DEFAULT NULL COMMENT '处理时间', `project_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '所属项目', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; ``` ## 2.使用Mybatis-plus 构建 > 概述: ```Mybatis-plus``` 是一个 ```Mybatis``` 的增强工具为简化开发、提升效率而诞生代码生成可以使用编译工具```IDEA```生成同时也可以使用 ```Java``` 代码生成([Mybatis-plus 官网](https://baomidou.com/pages/981406/))。IDEA 生成示例如下: ![](../developerPlatform/img/spring-boot-img//01.gif) ## 3.编写后台业务逻辑 > ```Mybatis``` 现在已经生成完毕接下来将带领开发者编写新增报修、根据项目ID 查询报修数据。 ### 3.1新增报修记录 新增报修记录时要校验数据不能为空。 ```java // 检验参数 不能为空 if (ObjectUtil.isNull(repair)){ return Result.fail("不能添加空值"); } if (StringUtils.isEmpty(repair.getCreatedBy())){ return Result.fail("创建人不能为空"); } if (StringUtils.isEmpty(repair.getDescribe())){ return Result.fail("问题描述不能为空"); } if (null == repair.getUrgency()|| repair.getUrgency() == 0){ return Result.fail("紧急程度不能为空"); } if (null == repair.getTimeout() || repair.getTimeout() == 0){ return Result.fail("超时时间不能为空"); } if (StringUtils.isEmpty(repair.getProjectId())){ return Result.fail("项目不能为空"); } ``` 添加报修状态、报修时间、报修id,并保存报修记录到数据库里面。 ```java // 0 表示待处理 repair.setState(0); repair.setId(IDUtil.getUUID()); repair.setRepairTime(new Date()); boolean save = this.save(repair); ``` ### 3.2查询报修数据 根据项目ID查询报修记录需要用户的token并校验参数不能为空。 ```java if (projectIds.isEmpty()){ return Result.failKey("项目 id 不能为空"); } if (StringUtils.isEmpty(token)){ return Result.failKey("token 不能为空"); } ``` 通过项目ID查询项目下方的报修记录并使用云平台的SDK通过‘项目ID’查询具体的项目信息。 ```java // 查询 报修记录 List<Repair> list = this.lambdaQuery().in(Repair::getProjectId, projectIds).list(); // 通过sdk 查询项目信息 ProjectApi projectApi = new ProjectApi(token); List<ProjectVo> projectVoList = projectApi.getProjectListByIds(projectIds) .getData(); ``` 将项目信息转换成【项目id:项目名字】的‘Map键值对’。 ``` java Map<String, String> projectMap = projectVoList.stream() .collect(Collectors.toMap(ProjectVo::getId, p -> p.getName())); ``` 转换超时时间和增加项目id对应的项目名字 ```java // 根据项目ID查询报修记录 示例如下: List<RepairVO> repairVOList = new ArrayList<>(); for (Repair repair : list) { if (projectMap.containsKey(repair.getProjectId())){ RepairVO repairVO = new RepairVO(); BeanUtils.copyProperties(repair,repairVO); repairVO.setProjectName(projectMap.get(repair.getProjectId())); conversionTime(repair,repairVO); repairVOList.add(repairVO); } } private void conversionTime(Repair repair,RepairVO repairVO){ Calendar rightNow = Calendar.getInstance(); rightNow.setTime(repair.getRepairTime()); rightNow.add(Calendar.DATE,repair.getTimeout()); repairVO.setExpiration(rightNow.getTime()); } ```