zhangcl 2 днів тому
батько
коміт
db22dc9ab3
40 змінених файлів з 2049 додано та 0 видалено
  1. 17 0
      yudao-module-rd/yudao-module-rd-api/src/main/java/cn/iocoder/yudao/module/rd/enums/ErrorCodeConstant.java
  2. 34 0
      yudao-module-rd/yudao-module-rd-api/src/main/java/cn/iocoder/yudao/module/rd/enums/approval/CommonAuditStatusEnum.java
  3. 7 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/constant/RdConstants.java
  4. 93 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/ExpertKeywordController.java
  5. 39 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordPageReqVO.java
  6. 43 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordRespVO.java
  7. 34 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordSaveReqVO.java
  8. 93 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/ExpertKeywordRelController.java
  9. 30 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelPageReqVO.java
  10. 31 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelRespVO.java
  11. 23 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelSaveReqVO.java
  12. 93 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/ExpertPoolController.java
  13. 72 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolPageReqVO.java
  14. 87 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolRespVO.java
  15. 63 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolSaveReqVO.java
  16. 93 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/TeamController.java
  17. 48 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamPageReqVO.java
  18. 55 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamRespVO.java
  19. 37 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamSaveReqVO.java
  20. 50 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertkeyword/ExpertKeywordDO.java
  21. 38 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertkeywordrel/ExpertKeywordRelDO.java
  22. 96 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertpool/ExpertPoolDO.java
  23. 62 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/team/TeamDO.java
  24. 29 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertkeyword/ExpertKeywordMapper.java
  25. 26 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertkeywordrel/ExpertKeywordRelMapper.java
  26. 40 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertpool/ExpertPoolMapper.java
  27. 32 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/team/TeamMapper.java
  28. 56 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/redis/BizNoRedisDAO.java
  29. 18 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/redis/RedisKeyConstants.java
  30. 31 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/framework/config/MultiThreadConfiguration.java
  31. 73 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/message/RdMessage.java
  32. 55 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeyword/ExpertKeywordService.java
  33. 72 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeyword/ExpertKeywordServiceImpl.java
  34. 55 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeywordrel/ExpertKeywordRelService.java
  35. 71 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeywordrel/ExpertKeywordRelServiceImpl.java
  36. 55 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertpool/ExpertPoolService.java
  37. 72 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertpool/ExpertPoolServiceImpl.java
  38. 0 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/service.txt
  39. 55 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/team/TeamService.java
  40. 71 0
      yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/team/TeamServiceImpl.java

+ 17 - 0
yudao-module-rd/yudao-module-rd-api/src/main/java/cn/iocoder/yudao/module/rd/enums/ErrorCodeConstant.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.rd.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+public interface ErrorCodeConstant {
+
+    ErrorCode TEAM_NOT_EXISTS = new ErrorCode(100, "团队不存在");
+    ErrorCode EXPERT_POOL_NOT_EXISTS = new ErrorCode(200, "专家库不存在");
+    ErrorCode EXPERT_KEYWORD_NOT_EXISTS = new ErrorCode(201, "专家热词字典不存在");
+    ErrorCode EXPERT_KEYWORD_REL_NOT_EXISTS = new ErrorCode(202, "专家热词关联不存在");
+
+    /***
+     * 数字油藏
+     */
+    ErrorCode LAS_WELL_NOT_EXISTS = new ErrorCode(1000, "数字油藏LAS数据文件-井信息不存在");
+    ErrorCode LAS_WELL_DATA_NOT_EXISTS = new ErrorCode(1001, "数字油藏LAS数据文件-测井数据不存在");
+}

+ 34 - 0
yudao-module-rd/yudao-module-rd-api/src/main/java/cn/iocoder/yudao/module/rd/enums/approval/CommonAuditStatusEnum.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.rd.enums.approval;
+
+import cn.iocoder.yudao.framework.common.core.ArrayValuable;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+
+/**
+ * 故障上报的审批状态
+ *
+ * @author phli
+ */
+@RequiredArgsConstructor
+@Getter
+public enum CommonAuditStatusEnum implements ArrayValuable<Integer> {
+
+    DRAFT(0, "未提交"),
+    PROCESS(10, "审批中"),
+    APPROVE(20, "审核通过"),
+	REJECT(30, "审核不通过"),
+    CANCEL(40, "已取消");
+
+    private final Integer status;
+    private final String name;
+
+    public static final Integer[] ARRAYS = Arrays.stream(values()).map(CommonAuditStatusEnum::getStatus).toArray(Integer[]::new);
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}

+ 7 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/constant/RdConstants.java

@@ -0,0 +1,7 @@
+package cn.iocoder.yudao.module.rd.constant;
+
+public interface RdConstants {
+
+    // 生产异常消息提醒
+    String PRODUCTION_EXCEPTION = "production-exception";
+}

+ 93 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/ExpertKeywordController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeyword;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordRespVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeyword.ExpertKeywordDO;
+import cn.iocoder.yudao.module.rd.service.expertkeyword.ExpertKeywordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 专家热词字典")
+@RestController
+@RequestMapping("/rd/expert-keyword")
+@Validated
+public class ExpertKeywordController {
+
+    @Resource
+    private ExpertKeywordService expertKeywordService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建专家热词字典")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:create')")
+    public CommonResult<Long> createExpertKeyword(@Valid @RequestBody ExpertKeywordSaveReqVO createReqVO) {
+        return success(expertKeywordService.createExpertKeyword(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新专家热词字典")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:update')")
+    public CommonResult<Boolean> updateExpertKeyword(@Valid @RequestBody ExpertKeywordSaveReqVO updateReqVO) {
+        expertKeywordService.updateExpertKeyword(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除专家热词字典")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:delete')")
+    public CommonResult<Boolean> deleteExpertKeyword(@RequestParam("id") Long id) {
+        expertKeywordService.deleteExpertKeyword(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得专家热词字典")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:query')")
+    public CommonResult<ExpertKeywordRespVO> getExpertKeyword(@RequestParam("id") Long id) {
+        ExpertKeywordDO expertKeyword = expertKeywordService.getExpertKeyword(id);
+        return success(BeanUtils.toBean(expertKeyword, ExpertKeywordRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得专家热词字典分页")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:query')")
+    public CommonResult<PageResult<ExpertKeywordRespVO>> getExpertKeywordPage(@Valid ExpertKeywordPageReqVO pageReqVO) {
+        PageResult<ExpertKeywordDO> pageResult = expertKeywordService.getExpertKeywordPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ExpertKeywordRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出专家热词字典 Excel")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportExpertKeywordExcel(@Valid ExpertKeywordPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ExpertKeywordDO> list = expertKeywordService.getExpertKeywordPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "专家热词字典.xls", "数据", ExpertKeywordRespVO.class,
+                        BeanUtils.toBean(list, ExpertKeywordRespVO.class));
+    }
+
+}

+ 39 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordPageReqVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 专家热词字典分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ExpertKeywordPageReqVO extends PageParam {
+
+    @Schema(description = "热词名称", example = "芋艿")
+    private String keywordName;
+
+    @Schema(description = "热词类型,如:技术方向/学历/头衔/软件/自定义等", example = "2")
+    private String keywordType;
+
+    @Schema(description = "来源:1-系统预置, 2-用户自定义")
+    private Integer source;
+
+    @Schema(description = "状态:0-启用, 1-禁用", example = "1")
+    private Integer status;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 43 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordRespVO.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 专家热词字典 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ExpertKeywordRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "16788")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "热词名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("热词名称")
+    private String keywordName;
+
+    @Schema(description = "热词类型,如:技术方向/学历/头衔/软件/自定义等", example = "2")
+    @ExcelProperty("热词类型,如:技术方向/学历/头衔/软件/自定义等")
+    private String keywordType;
+
+    @Schema(description = "来源:1-系统预置, 2-用户自定义", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("来源:1-系统预置, 2-用户自定义")
+    private Integer source;
+
+    @Schema(description = "状态:0-启用, 1-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态:0-启用, 1-禁用")
+    private Integer status;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 34 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeyword/vo/ExpertKeywordSaveReqVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 专家热词字典新增/修改 Request VO")
+@Data
+public class ExpertKeywordSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "16788")
+    private Long id;
+
+    @Schema(description = "热词名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "热词名称不能为空")
+    private String keywordName;
+
+    @Schema(description = "热词类型,如:技术方向/学历/头衔/软件/自定义等", example = "2")
+    private String keywordType;
+
+    @Schema(description = "来源:1-系统预置, 2-用户自定义", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "来源:1-系统预置, 2-用户自定义不能为空")
+    private Integer source;
+
+    @Schema(description = "状态:0-启用, 1-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态:0-启用, 1-禁用不能为空")
+    private Integer status;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+}

+ 93 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/ExpertKeywordRelController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelRespVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeywordrel.ExpertKeywordRelDO;
+import cn.iocoder.yudao.module.rd.service.expertkeywordrel.ExpertKeywordRelService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 专家热词关联")
+@RestController
+@RequestMapping("/rd/expert-keyword-rel")
+@Validated
+public class ExpertKeywordRelController {
+
+    @Resource
+    private ExpertKeywordRelService expertKeywordRelService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建专家热词关联")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:create')")
+    public CommonResult<Long> createExpertKeywordRel(@Valid @RequestBody ExpertKeywordRelSaveReqVO createReqVO) {
+        return success(expertKeywordRelService.createExpertKeywordRel(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新专家热词关联")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:update')")
+    public CommonResult<Boolean> updateExpertKeywordRel(@Valid @RequestBody ExpertKeywordRelSaveReqVO updateReqVO) {
+        expertKeywordRelService.updateExpertKeywordRel(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除专家热词关联")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:delete')")
+    public CommonResult<Boolean> deleteExpertKeywordRel(@RequestParam("id") Long id) {
+        expertKeywordRelService.deleteExpertKeywordRel(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得专家热词关联")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:query')")
+    public CommonResult<ExpertKeywordRelRespVO> getExpertKeywordRel(@RequestParam("id") Long id) {
+        ExpertKeywordRelDO expertKeywordRel = expertKeywordRelService.getExpertKeywordRel(id);
+        return success(BeanUtils.toBean(expertKeywordRel, ExpertKeywordRelRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得专家热词关联分页")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:query')")
+    public CommonResult<PageResult<ExpertKeywordRelRespVO>> getExpertKeywordRelPage(@Valid ExpertKeywordRelPageReqVO pageReqVO) {
+        PageResult<ExpertKeywordRelDO> pageResult = expertKeywordRelService.getExpertKeywordRelPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ExpertKeywordRelRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出专家热词关联 Excel")
+    @PreAuthorize("@ss.hasPermission('rd:expert-keyword-rel:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportExpertKeywordRelExcel(@Valid ExpertKeywordRelPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ExpertKeywordRelDO> list = expertKeywordRelService.getExpertKeywordRelPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "专家热词关联.xls", "数据", ExpertKeywordRelRespVO.class,
+                        BeanUtils.toBean(list, ExpertKeywordRelRespVO.class));
+    }
+
+}

+ 30 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelPageReqVO.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 专家热词关联分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ExpertKeywordRelPageReqVO extends PageParam {
+
+    @Schema(description = "专家ID", example = "1663")
+    private Long expertId;
+
+    @Schema(description = "热词ID", example = "16216")
+    private Long keywordId;
+
+    @Schema(description = "绑定时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 31 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelRespVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 专家热词关联 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ExpertKeywordRelRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "28133")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "专家ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1663")
+    @ExcelProperty("专家ID")
+    private Long expertId;
+
+    @Schema(description = "热词ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16216")
+    @ExcelProperty("热词ID")
+    private Long keywordId;
+
+    @Schema(description = "绑定时间")
+    @ExcelProperty("绑定时间")
+    private LocalDateTime createTime;
+
+}

+ 23 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertkeywordrel/vo/ExpertKeywordRelSaveReqVO.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 专家热词关联新增/修改 Request VO")
+@Data
+public class ExpertKeywordRelSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "28133")
+    private Long id;
+
+    @Schema(description = "专家ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1663")
+    @NotNull(message = "专家ID不能为空")
+    private Long expertId;
+
+    @Schema(description = "热词ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16216")
+    @NotNull(message = "热词ID不能为空")
+    private Long keywordId;
+
+}

+ 93 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/ExpertPoolController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertpool;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolRespVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertpool.ExpertPoolDO;
+import cn.iocoder.yudao.module.rd.service.expertpool.ExpertPoolService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 专家库")
+@RestController
+@RequestMapping("/rd/expert-pool")
+@Validated
+public class ExpertPoolController {
+
+    @Resource
+    private ExpertPoolService expertPoolService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建专家库")
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:create')")
+    public CommonResult<Long> createExpertPool(@Valid @RequestBody ExpertPoolSaveReqVO createReqVO) {
+        return success(expertPoolService.createExpertPool(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新专家库")
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:update')")
+    public CommonResult<Boolean> updateExpertPool(@Valid @RequestBody ExpertPoolSaveReqVO updateReqVO) {
+        expertPoolService.updateExpertPool(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除专家库")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:delete')")
+    public CommonResult<Boolean> deleteExpertPool(@RequestParam("id") Long id) {
+        expertPoolService.deleteExpertPool(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得专家库")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:query')")
+    public CommonResult<ExpertPoolRespVO> getExpertPool(@RequestParam("id") Long id) {
+        ExpertPoolDO expertPool = expertPoolService.getExpertPool(id);
+        return success(BeanUtils.toBean(expertPool, ExpertPoolRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得专家库分页")
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:query')")
+    public CommonResult<PageResult<ExpertPoolRespVO>> getExpertPoolPage(@Valid ExpertPoolPageReqVO pageReqVO) {
+        PageResult<ExpertPoolDO> pageResult = expertPoolService.getExpertPoolPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ExpertPoolRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出专家库 Excel")
+    @PreAuthorize("@ss.hasPermission('rd:expert-pool:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportExpertPoolExcel(@Valid ExpertPoolPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ExpertPoolDO> list = expertPoolService.getExpertPoolPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "专家库.xls", "数据", ExpertPoolRespVO.class,
+                        BeanUtils.toBean(list, ExpertPoolRespVO.class));
+    }
+
+}

+ 72 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolPageReqVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 专家库分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ExpertPoolPageReqVO extends PageParam {
+
+    @Schema(description = "所属部门", example = "30265")
+    private Long deptId;
+
+    @Schema(description = "梯队(第一 第二 第三)")
+    private String echelon;
+
+    @Schema(description = "序列(技术 商务 运营 法务 安全)")
+    private String expertRank;
+
+    @Schema(description = "所属团队(多个逗号分隔)")
+    private String teamIds;
+
+    @Schema(description = "头像url")
+    private String avatar;
+
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
+    @Schema(description = "学历")
+    private String education;
+
+    @Schema(description = "专业方向(多个逗号分隔)")
+    private String specialDirection;
+
+    @Schema(description = "主要业绩")
+    private String achievement;
+
+    @Schema(description = "专业软件技能")
+    private String softwareSkills;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "5592")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "2")
+    private Integer auditStatus;
+
+    @Schema(description = "审批意见")
+    private String opinion;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 87 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolRespVO.java

@@ -0,0 +1,87 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 专家库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ExpertPoolRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24775")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "所属部门", example = "30265")
+    @ExcelProperty("所属部门")
+    private Long deptId;
+
+    @Schema(description = "梯队(第一 第二 第三)")
+    @ExcelProperty("梯队(第一 第二 第三)")
+    private String echelon;
+
+    @Schema(description = "序列(技术 商务 运营 法务 安全)")
+    @ExcelProperty("序列(技术 商务 运营 法务 安全)")
+    private String expertRank;
+
+    @Schema(description = "所属团队(多个逗号分隔)")
+    @ExcelProperty("所属团队(多个逗号分隔)")
+    private String teamIds;
+
+    @Schema(description = "头像url")
+    @ExcelProperty("头像url")
+    private String avatar;
+
+    @Schema(description = "出生日期")
+    @ExcelProperty("出生日期")
+    private LocalDateTime birthday;
+
+    @Schema(description = "学历")
+    @ExcelProperty("学历")
+    private String education;
+
+    @Schema(description = "专业方向(多个逗号分隔)")
+    @ExcelProperty("专业方向(多个逗号分隔)")
+    private String specialDirection;
+
+    @Schema(description = "主要业绩")
+    @ExcelProperty("主要业绩")
+    private String achievement;
+
+    @Schema(description = "专业软件技能")
+    @ExcelProperty("专业软件技能")
+    private String softwareSkills;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "5592")
+    @ExcelProperty("流程实例id")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "2")
+    @ExcelProperty("审批状态 未提交、审批中、审批通过、审批不通过、已取消")
+    private Integer auditStatus;
+
+    @Schema(description = "审批意见")
+    @ExcelProperty("审批意见")
+    private String opinion;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 63 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/expertpool/vo/ExpertPoolSaveReqVO.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 专家库新增/修改 Request VO")
+@Data
+public class ExpertPoolSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24775")
+    private Long id;
+
+    @Schema(description = "所属部门", example = "30265")
+    private Long deptId;
+
+    @Schema(description = "梯队(第一 第二 第三)")
+    private String echelon;
+
+    @Schema(description = "序列(技术 商务 运营 法务 安全)")
+    private String expertRank;
+
+    @Schema(description = "所属团队(多个逗号分隔)")
+    private String teamIds;
+
+    @Schema(description = "头像url")
+    private String avatar;
+
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
+    @Schema(description = "学历")
+    private String education;
+
+    @Schema(description = "专业方向(多个逗号分隔)")
+    private String specialDirection;
+
+    @Schema(description = "主要业绩")
+    private String achievement;
+
+    @Schema(description = "专业软件技能")
+    private String softwareSkills;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "5592")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "2")
+    private Integer auditStatus;
+
+    @Schema(description = "审批意见")
+    private String opinion;
+
+}

+ 93 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/TeamController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.rd.controller.admin.team;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamRespVO;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.team.TeamDO;
+import cn.iocoder.yudao.module.rd.service.team.TeamService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 团队")
+@RestController
+@RequestMapping("/rd/team")
+@Validated
+public class TeamController {
+
+    @Resource
+    private TeamService teamService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建团队")
+    @PreAuthorize("@ss.hasPermission('rd:team:create')")
+    public CommonResult<Long> createTeam(@Valid @RequestBody TeamSaveReqVO createReqVO) {
+        return success(teamService.createTeam(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新团队")
+    @PreAuthorize("@ss.hasPermission('rd:team:update')")
+    public CommonResult<Boolean> updateTeam(@Valid @RequestBody TeamSaveReqVO updateReqVO) {
+        teamService.updateTeam(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除团队")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rd:team:delete')")
+    public CommonResult<Boolean> deleteTeam(@RequestParam("id") Long id) {
+        teamService.deleteTeam(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得团队")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rd:team:query')")
+    public CommonResult<TeamRespVO> getTeam(@RequestParam("id") Long id) {
+        TeamDO team = teamService.getTeam(id);
+        return success(BeanUtils.toBean(team, TeamRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得团队分页")
+    @PreAuthorize("@ss.hasPermission('rd:team:query')")
+    public CommonResult<PageResult<TeamRespVO>> getTeamPage(@Valid TeamPageReqVO pageReqVO) {
+        PageResult<TeamDO> pageResult = teamService.getTeamPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, TeamRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出团队 Excel")
+    @PreAuthorize("@ss.hasPermission('rd:team:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportTeamExcel(@Valid TeamPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<TeamDO> list = teamService.getTeamPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "团队.xls", "数据", TeamRespVO.class,
+                        BeanUtils.toBean(list, TeamRespVO.class));
+    }
+
+}

+ 48 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamPageReqVO.java

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.rd.controller.admin.team.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 团队分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TeamPageReqVO extends PageParam {
+
+    @Schema(description = "所属部门", example = "22275")
+    private Long deptId;
+
+    @Schema(description = "团队类别")
+    private String category;
+
+    @Schema(description = "团队名称", example = "李四")
+    private String teamName;
+
+    @Schema(description = "团队logo地址")
+    private String avatar;
+
+    @Schema(description = "团队简介")
+    private String summary;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 55 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamRespVO.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.rd.controller.admin.team.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 团队 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TeamRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7313")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "所属部门", example = "22275")
+    @ExcelProperty("所属部门")
+    private Long deptId;
+
+    @Schema(description = "团队类别")
+    @ExcelProperty("团队类别")
+    private String category;
+
+    @Schema(description = "团队名称", example = "李四")
+    @ExcelProperty("团队名称")
+    private String teamName;
+
+    @Schema(description = "团队logo地址")
+    @ExcelProperty("团队logo地址")
+    private String avatar;
+
+    @Schema(description = "团队简介")
+    @ExcelProperty("团队简介")
+    private String summary;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 37 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/controller/admin/team/vo/TeamSaveReqVO.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.rd.controller.admin.team.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 团队新增/修改 Request VO")
+@Data
+public class TeamSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7313")
+    private Long id;
+
+    @Schema(description = "所属部门", example = "22275")
+    private Long deptId;
+
+    @Schema(description = "团队类别")
+    private String category;
+
+    @Schema(description = "团队名称", example = "李四")
+    private String teamName;
+
+    @Schema(description = "团队logo地址")
+    private String avatar;
+
+    @Schema(description = "团队简介")
+    private String summary;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    private Integer status;
+
+}

+ 50 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertkeyword/ExpertKeywordDO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.rd.dal.dataobject.expertkeyword;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 专家热词字典 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rd_expert_keyword")
+@KeySequence("rd_expert_keyword_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExpertKeywordDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 热词名称
+     */
+    private String keywordName;
+    /**
+     * 热词类型,如:技术方向/学历/头衔/软件/自定义等
+     */
+    private String keywordType;
+    /**
+     * 来源:1-系统预置, 2-用户自定义
+     */
+    private Integer source;
+    /**
+     * 状态:0-启用, 1-禁用
+     */
+    private Integer status;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+
+}

+ 38 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertkeywordrel/ExpertKeywordRelDO.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.rd.dal.dataobject.expertkeywordrel;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 专家热词关联 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rd_expert_keyword_rel")
+@KeySequence("rd_expert_keyword_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExpertKeywordRelDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 专家ID
+     */
+    private Long expertId;
+    /**
+     * 热词ID
+     */
+    private Long keywordId;
+
+}

+ 96 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/expertpool/ExpertPoolDO.java

@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.rd.dal.dataobject.expertpool;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 专家库 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rd_expert_pool")
+@KeySequence("rd_expert_pool_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExpertPoolDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 所属部门
+     */
+    private Long deptId;
+    /**
+     * 梯队(第一 第二 第三)
+     */
+    private String echelon;
+    /**
+     * 序列(技术 商务 运营 法务 安全)
+     */
+    private String expertRank;
+    /**
+     * 所属团队(多个逗号分隔)
+     */
+    private String teamIds;
+    /**
+     * 头像url
+     */
+    private String avatar;
+    /**
+     * 出生日期
+     */
+    private LocalDateTime birthday;
+    /**
+     * 学历
+     */
+    private String education;
+    /**
+     * 专业方向(多个逗号分隔)
+     */
+    private String specialDirection;
+    /**
+     * 主要业绩
+     */
+    private String achievement;
+    /**
+     * 专业软件技能
+     */
+    private String softwareSkills;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private Integer status;
+    /**
+     * 流程实例id
+     */
+    private String processInstanceId;
+    /**
+     * 审批状态 未提交、审批中、审批通过、审批不通过、已取消
+     */
+    private Integer auditStatus;
+    /**
+     * 审批意见
+     */
+    private String opinion;
+
+}

+ 62 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/dataobject/team/TeamDO.java

@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.rd.dal.dataobject.team;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 团队 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rd_team")
+@KeySequence("rd_team_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TeamDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 所属部门
+     */
+    private Long deptId;
+    /**
+     * 团队类别
+     */
+    private String category;
+    /**
+     * 团队名称
+     */
+    private String teamName;
+    /**
+     * 团队logo地址
+     */
+    private String avatar;
+    /**
+     * 团队简介
+     */
+    private String summary;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private Integer status;
+
+}

+ 29 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertkeyword/ExpertKeywordMapper.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.rd.dal.mysql.expertkeyword;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordPageReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeyword.ExpertKeywordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 专家热词字典 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface ExpertKeywordMapper extends BaseMapperX<ExpertKeywordDO> {
+
+    default PageResult<ExpertKeywordDO> selectPage(ExpertKeywordPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<ExpertKeywordDO>()
+                .likeIfPresent(ExpertKeywordDO::getKeywordName, reqVO.getKeywordName())
+                .eqIfPresent(ExpertKeywordDO::getKeywordType, reqVO.getKeywordType())
+                .eqIfPresent(ExpertKeywordDO::getSource, reqVO.getSource())
+                .eqIfPresent(ExpertKeywordDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(ExpertKeywordDO::getSort, reqVO.getSort())
+                .betweenIfPresent(ExpertKeywordDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(ExpertKeywordDO::getId));
+    }
+
+}

+ 26 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertkeywordrel/ExpertKeywordRelMapper.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.rd.dal.mysql.expertkeywordrel;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelPageReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeywordrel.ExpertKeywordRelDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 专家热词关联 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface ExpertKeywordRelMapper extends BaseMapperX<ExpertKeywordRelDO> {
+
+    default PageResult<ExpertKeywordRelDO> selectPage(ExpertKeywordRelPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<ExpertKeywordRelDO>()
+                .eqIfPresent(ExpertKeywordRelDO::getExpertId, reqVO.getExpertId())
+                .eqIfPresent(ExpertKeywordRelDO::getKeywordId, reqVO.getKeywordId())
+                .betweenIfPresent(ExpertKeywordRelDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(ExpertKeywordRelDO::getId));
+    }
+
+}

+ 40 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/expertpool/ExpertPoolMapper.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.rd.dal.mysql.expertpool;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolPageReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertpool.ExpertPoolDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 专家库 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface ExpertPoolMapper extends BaseMapperX<ExpertPoolDO> {
+
+    default PageResult<ExpertPoolDO> selectPage(ExpertPoolPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<ExpertPoolDO>()
+                .eqIfPresent(ExpertPoolDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(ExpertPoolDO::getEchelon, reqVO.getEchelon())
+                .eqIfPresent(ExpertPoolDO::getExpertRank, reqVO.getExpertRank())
+                .eqIfPresent(ExpertPoolDO::getTeamIds, reqVO.getTeamIds())
+                .eqIfPresent(ExpertPoolDO::getAvatar, reqVO.getAvatar())
+                .eqIfPresent(ExpertPoolDO::getBirthday, reqVO.getBirthday())
+                .eqIfPresent(ExpertPoolDO::getEducation, reqVO.getEducation())
+                .eqIfPresent(ExpertPoolDO::getSpecialDirection, reqVO.getSpecialDirection())
+                .eqIfPresent(ExpertPoolDO::getAchievement, reqVO.getAchievement())
+                .eqIfPresent(ExpertPoolDO::getSoftwareSkills, reqVO.getSoftwareSkills())
+                .eqIfPresent(ExpertPoolDO::getSort, reqVO.getSort())
+                .eqIfPresent(ExpertPoolDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(ExpertPoolDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(ExpertPoolDO::getProcessInstanceId, reqVO.getProcessInstanceId())
+                .eqIfPresent(ExpertPoolDO::getAuditStatus, reqVO.getAuditStatus())
+                .eqIfPresent(ExpertPoolDO::getOpinion, reqVO.getOpinion())
+                .betweenIfPresent(ExpertPoolDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(ExpertPoolDO::getId));
+    }
+
+}

+ 32 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/mysql/team/TeamMapper.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.rd.dal.mysql.team;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamPageReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.team.TeamDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 团队 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface TeamMapper extends BaseMapperX<TeamDO> {
+
+    default PageResult<TeamDO> selectPage(TeamPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<TeamDO>()
+                .eqIfPresent(TeamDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(TeamDO::getCategory, reqVO.getCategory())
+                .likeIfPresent(TeamDO::getTeamName, reqVO.getTeamName())
+                .eqIfPresent(TeamDO::getAvatar, reqVO.getAvatar())
+                .eqIfPresent(TeamDO::getSummary, reqVO.getSummary())
+                .eqIfPresent(TeamDO::getSort, reqVO.getSort())
+                .eqIfPresent(TeamDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(TeamDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(TeamDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(TeamDO::getId));
+    }
+
+}

+ 56 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/redis/BizNoRedisDAO.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.rd.dal.redis;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+
+/**
+ * rd 业务单据的 Redis DAO
+ *
+ * @author ruiqi
+ */
+@Repository
+public class BizNoRedisDAO {
+
+    /**
+     * 保养计划
+     */
+    public static final String MAIN_PLAN_NO_PREFIX = "BYJH";
+
+    /**
+     * 保养工单
+     */
+    public static final String MAIN_WORK_ORDER_NO_PREFIX = "BYGD";
+
+    /**
+     * 物料领用单
+     */
+    public static final String MATERIAL_REQ_ORDER_NO_PREFIX = "WLLY";
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 生成序号,使用当前日期,格式为 {PREFIX} + yyyyMMdd + 6 位自增
+     * 例如说:BYJH 202109 000001 (没有中间空格)
+     *
+     * @param prefix 前缀
+     * @return 序号
+     */
+    public String generate(String prefix) {
+        // 递增序号
+        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN);
+        String key = RedisKeyConstants.NO + noPrefix;
+        Long no = stringRedisTemplate.opsForValue().increment(key);
+        // 设置过期时间
+        stringRedisTemplate.expire(key, Duration.ofDays(1L));
+        return noPrefix + String.format("%06d", no);
+    }
+
+}

+ 18 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/dal/redis/RedisKeyConstants.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.rd.dal.redis;
+
+/**
+ * Redis Key 枚举类
+ *
+ * @author ruiqi
+ */
+public interface RedisKeyConstants {
+
+    /**
+     * 序号的缓存
+     *
+     * KEY 格式:trade_no:{prefix}
+     * VALUE 数据格式:编号自增
+     */
+    String NO = "rd:seq_no:";
+
+}

+ 31 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/framework/config/MultiThreadConfiguration.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.rd.framework.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 多线程配置
+ */
+@Configuration(proxyBeanMethods = false)
+public class MultiThreadConfiguration {
+
+    public static final String RD_THREAD_POOL_TASK_EXECUTOR = "RD_THREAD_POOL_TASK_EXECUTOR";
+
+    @Bean(RD_THREAD_POOL_TASK_EXECUTOR)
+    public ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(8); // 设置核心线程数
+        executor.setMaxPoolSize(16); // 设置最大线程数
+        executor.setKeepAliveSeconds(60); // 设置空闲时间
+        executor.setQueueCapacity(100); // 设置队列大小
+        executor.setThreadNamePrefix("rd-task-"); // 配置线程池的前缀
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 进行加载
+        executor.initialize();
+        return executor;
+    }
+
+}

+ 73 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/message/RdMessage.java

@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.rd.message;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.rd.constant.RdConstants;
+import cn.iocoder.yudao.module.system.api.dingtalk.DingtalkSendApi;
+import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
+import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class RdMessage {
+    @Autowired
+    private NotifyMessageSendApi notifyMessageSendApi;
+    @Resource
+    private DingtalkSendApi dingtalkSendApi;
+
+    @Value("${system.url}")
+    private String systemUrl;
+
+    public void sendMessage(Long businessId, String name, String businessType, Long userId, String mobile){
+
+        Map<String, Object> templateParams = new HashMap<>();
+
+        if(/* RdConstants.GENERATE_OPERATION.equals(businessType) */ true){
+
+        } else {
+            templateParams.put("name", name);
+            templateParams.put("businessType", businessType);
+            templateParams.put("businessId", businessId);
+        }
+
+        notifyMessageSendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO()
+                .setUserId(userId).setTemplateCode(businessType).setTemplateParams(templateParams));
+        String title = "DeepOil-R&D消息提醒";
+        if (StrUtil.isNotBlank(mobile)) {
+            //发送钉钉消息
+            String msg = "您有新的巡检工单待处理,请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+
+
+            // 生产异常
+            if (RdConstants.PRODUCTION_EXCEPTION.equals(businessType)) {
+                msg = "生产异常  \n" + name + "["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            }
+
+            String url = "";
+
+            if(/* RdConstants.GENERATE_OPERATION.equals(businessType) */ true) {
+
+            } else {
+                url = systemUrl + "dingding?id=" + businessId + "&type=" + businessType + "&userId=" + userId;
+            }
+
+            if (/* RdConstants.FAILURE_NO_PASS.equals(businessType) || RdConstants.ALARM_MESSAGE.equals(businessType)
+                    || RdConstants.GENERATE_QHSE_CERT.equals(businessType) || RdConstants.WEEK_ALARM_MESSAGE.equals(businessType) */ true) {
+                //通知设备状态变更为观察使用
+                dingtalkSendApi.send(mobile, msg, "text",url,  title);
+            } else if (RdConstants.PRODUCTION_EXCEPTION.equals(businessType)) {
+                // markdown 类型消息 支持 文字加粗
+                dingtalkSendApi.send(mobile, msg, "markdown",url,  title);
+            } else {
+                dingtalkSendApi.send(mobile, msg,"link", url, title);
+            }
+        }
+    }
+}

+ 55 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeyword/ExpertKeywordService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.rd.service.expertkeyword;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeyword.ExpertKeywordDO;
+
+import javax.validation.Valid;
+
+/**
+ * 专家热词字典 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface ExpertKeywordService {
+
+    /**
+     * 创建专家热词字典
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createExpertKeyword(@Valid ExpertKeywordSaveReqVO createReqVO);
+
+    /**
+     * 更新专家热词字典
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateExpertKeyword(@Valid ExpertKeywordSaveReqVO updateReqVO);
+
+    /**
+     * 删除专家热词字典
+     *
+     * @param id 编号
+     */
+    void deleteExpertKeyword(Long id);
+
+    /**
+     * 获得专家热词字典
+     *
+     * @param id 编号
+     * @return 专家热词字典
+     */
+    ExpertKeywordDO getExpertKeyword(Long id);
+
+    /**
+     * 获得专家热词字典分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 专家热词字典分页
+     */
+    PageResult<ExpertKeywordDO> getExpertKeywordPage(ExpertKeywordPageReqVO pageReqVO);
+
+}

+ 72 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeyword/ExpertKeywordServiceImpl.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.rd.service.expertkeyword;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeyword.vo.ExpertKeywordSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeyword.ExpertKeywordDO;
+import cn.iocoder.yudao.module.rd.dal.mysql.expertkeyword.ExpertKeywordMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.rd.enums.ErrorCodeConstant.EXPERT_KEYWORD_NOT_EXISTS;
+
+
+/**
+ * 专家热词字典 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class ExpertKeywordServiceImpl implements ExpertKeywordService {
+
+    @Resource
+    private ExpertKeywordMapper expertKeywordMapper;
+
+    @Override
+    public Long createExpertKeyword(ExpertKeywordSaveReqVO createReqVO) {
+        // 插入
+        ExpertKeywordDO expertKeyword = BeanUtils.toBean(createReqVO, ExpertKeywordDO.class);
+        expertKeywordMapper.insert(expertKeyword);
+        // 返回
+        return expertKeyword.getId();
+    }
+
+    @Override
+    public void updateExpertKeyword(ExpertKeywordSaveReqVO updateReqVO) {
+        // 校验存在
+        validateExpertKeywordExists(updateReqVO.getId());
+        // 更新
+        ExpertKeywordDO updateObj = BeanUtils.toBean(updateReqVO, ExpertKeywordDO.class);
+        expertKeywordMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteExpertKeyword(Long id) {
+        // 校验存在
+        validateExpertKeywordExists(id);
+        // 删除
+        expertKeywordMapper.deleteById(id);
+    }
+
+    private void validateExpertKeywordExists(Long id) {
+        if (expertKeywordMapper.selectById(id) == null) {
+            throw exception(EXPERT_KEYWORD_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ExpertKeywordDO getExpertKeyword(Long id) {
+        return expertKeywordMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ExpertKeywordDO> getExpertKeywordPage(ExpertKeywordPageReqVO pageReqVO) {
+        return expertKeywordMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeywordrel/ExpertKeywordRelService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.rd.service.expertkeywordrel;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeywordrel.ExpertKeywordRelDO;
+
+import javax.validation.Valid;
+
+/**
+ * 专家热词关联 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface ExpertKeywordRelService {
+
+    /**
+     * 创建专家热词关联
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createExpertKeywordRel(@Valid ExpertKeywordRelSaveReqVO createReqVO);
+
+    /**
+     * 更新专家热词关联
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateExpertKeywordRel(@Valid ExpertKeywordRelSaveReqVO updateReqVO);
+
+    /**
+     * 删除专家热词关联
+     *
+     * @param id 编号
+     */
+    void deleteExpertKeywordRel(Long id);
+
+    /**
+     * 获得专家热词关联
+     *
+     * @param id 编号
+     * @return 专家热词关联
+     */
+    ExpertKeywordRelDO getExpertKeywordRel(Long id);
+
+    /**
+     * 获得专家热词关联分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 专家热词关联分页
+     */
+    PageResult<ExpertKeywordRelDO> getExpertKeywordRelPage(ExpertKeywordRelPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertkeywordrel/ExpertKeywordRelServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.rd.service.expertkeywordrel;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertkeywordrel.vo.ExpertKeywordRelSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertkeywordrel.ExpertKeywordRelDO;
+import cn.iocoder.yudao.module.rd.dal.mysql.expertkeywordrel.ExpertKeywordRelMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.rd.enums.ErrorCodeConstant.EXPERT_KEYWORD_REL_NOT_EXISTS;
+
+/**
+ * 专家热词关联 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class ExpertKeywordRelServiceImpl implements ExpertKeywordRelService {
+
+    @Resource
+    private ExpertKeywordRelMapper expertKeywordRelMapper;
+
+    @Override
+    public Long createExpertKeywordRel(ExpertKeywordRelSaveReqVO createReqVO) {
+        // 插入
+        ExpertKeywordRelDO expertKeywordRel = BeanUtils.toBean(createReqVO, ExpertKeywordRelDO.class);
+        expertKeywordRelMapper.insert(expertKeywordRel);
+        // 返回
+        return expertKeywordRel.getId();
+    }
+
+    @Override
+    public void updateExpertKeywordRel(ExpertKeywordRelSaveReqVO updateReqVO) {
+        // 校验存在
+        validateExpertKeywordRelExists(updateReqVO.getId());
+        // 更新
+        ExpertKeywordRelDO updateObj = BeanUtils.toBean(updateReqVO, ExpertKeywordRelDO.class);
+        expertKeywordRelMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteExpertKeywordRel(Long id) {
+        // 校验存在
+        validateExpertKeywordRelExists(id);
+        // 删除
+        expertKeywordRelMapper.deleteById(id);
+    }
+
+    private void validateExpertKeywordRelExists(Long id) {
+        if (expertKeywordRelMapper.selectById(id) == null) {
+            throw exception(EXPERT_KEYWORD_REL_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ExpertKeywordRelDO getExpertKeywordRel(Long id) {
+        return expertKeywordRelMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ExpertKeywordRelDO> getExpertKeywordRelPage(ExpertKeywordRelPageReqVO pageReqVO) {
+        return expertKeywordRelMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertpool/ExpertPoolService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.rd.service.expertpool;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertpool.ExpertPoolDO;
+
+import javax.validation.Valid;
+
+/**
+ * 专家库 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface ExpertPoolService {
+
+    /**
+     * 创建专家库
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createExpertPool(@Valid ExpertPoolSaveReqVO createReqVO);
+
+    /**
+     * 更新专家库
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateExpertPool(@Valid ExpertPoolSaveReqVO updateReqVO);
+
+    /**
+     * 删除专家库
+     *
+     * @param id 编号
+     */
+    void deleteExpertPool(Long id);
+
+    /**
+     * 获得专家库
+     *
+     * @param id 编号
+     * @return 专家库
+     */
+    ExpertPoolDO getExpertPool(Long id);
+
+    /**
+     * 获得专家库分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 专家库分页
+     */
+    PageResult<ExpertPoolDO> getExpertPoolPage(ExpertPoolPageReqVO pageReqVO);
+
+}

+ 72 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/expertpool/ExpertPoolServiceImpl.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.rd.service.expertpool;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.expertpool.vo.ExpertPoolSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.expertpool.ExpertPoolDO;
+import cn.iocoder.yudao.module.rd.dal.mysql.expertpool.ExpertPoolMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.rd.enums.ErrorCodeConstant.EXPERT_POOL_NOT_EXISTS;
+
+
+/**
+ * 专家库 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class ExpertPoolServiceImpl implements ExpertPoolService {
+
+    @Resource
+    private ExpertPoolMapper expertPoolMapper;
+
+    @Override
+    public Long createExpertPool(ExpertPoolSaveReqVO createReqVO) {
+        // 插入
+        ExpertPoolDO expertPool = BeanUtils.toBean(createReqVO, ExpertPoolDO.class);
+        expertPoolMapper.insert(expertPool);
+        // 返回
+        return expertPool.getId();
+    }
+
+    @Override
+    public void updateExpertPool(ExpertPoolSaveReqVO updateReqVO) {
+        // 校验存在
+        validateExpertPoolExists(updateReqVO.getId());
+        // 更新
+        ExpertPoolDO updateObj = BeanUtils.toBean(updateReqVO, ExpertPoolDO.class);
+        expertPoolMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteExpertPool(Long id) {
+        // 校验存在
+        validateExpertPoolExists(id);
+        // 删除
+        expertPoolMapper.deleteById(id);
+    }
+
+    private void validateExpertPoolExists(Long id) {
+        if (expertPoolMapper.selectById(id) == null) {
+            throw exception(EXPERT_POOL_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ExpertPoolDO getExpertPool(Long id) {
+        return expertPoolMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ExpertPoolDO> getExpertPoolPage(ExpertPoolPageReqVO pageReqVO) {
+        return expertPoolMapper.selectPage(pageReqVO);
+    }
+
+}

+ 0 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/service.txt


+ 55 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/team/TeamService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.rd.service.team;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.team.TeamDO;
+
+import javax.validation.Valid;
+
+/**
+ * 团队 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface TeamService {
+
+    /**
+     * 创建团队
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createTeam(@Valid TeamSaveReqVO createReqVO);
+
+    /**
+     * 更新团队
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateTeam(@Valid TeamSaveReqVO updateReqVO);
+
+    /**
+     * 删除团队
+     *
+     * @param id 编号
+     */
+    void deleteTeam(Long id);
+
+    /**
+     * 获得团队
+     *
+     * @param id 编号
+     * @return 团队
+     */
+    TeamDO getTeam(Long id);
+
+    /**
+     * 获得团队分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 团队分页
+     */
+    PageResult<TeamDO> getTeamPage(TeamPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-rd/yudao-module-rd-biz/src/main/java/cn/iocoder/yudao/module/rd/service/team/TeamServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.rd.service.team;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamPageReqVO;
+import cn.iocoder.yudao.module.rd.controller.admin.team.vo.TeamSaveReqVO;
+import cn.iocoder.yudao.module.rd.dal.dataobject.team.TeamDO;
+import cn.iocoder.yudao.module.rd.dal.mysql.team.TeamMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.rd.enums.ErrorCodeConstant.TEAM_NOT_EXISTS;
+
+/**
+ * 团队 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class TeamServiceImpl implements TeamService {
+
+    @Resource
+    private TeamMapper teamMapper;
+
+    @Override
+    public Long createTeam(TeamSaveReqVO createReqVO) {
+        // 插入
+        TeamDO team = BeanUtils.toBean(createReqVO, TeamDO.class);
+        teamMapper.insert(team);
+        // 返回
+        return team.getId();
+    }
+
+    @Override
+    public void updateTeam(TeamSaveReqVO updateReqVO) {
+        // 校验存在
+        validateTeamExists(updateReqVO.getId());
+        // 更新
+        TeamDO updateObj = BeanUtils.toBean(updateReqVO, TeamDO.class);
+        teamMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteTeam(Long id) {
+        // 校验存在
+        validateTeamExists(id);
+        // 删除
+        teamMapper.deleteById(id);
+    }
+
+    private void validateTeamExists(Long id) {
+        if (teamMapper.selectById(id) == null) {
+            throw exception(TEAM_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public TeamDO getTeam(Long id) {
+        return teamMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<TeamDO> getTeamPage(TeamPageReqVO pageReqVO) {
+        return teamMapper.selectPage(pageReqVO);
+    }
+
+}