فهرست منبع

pms 任务动态模板属性

zhangcl 1 ماه پیش
والد
کامیت
dc193f570e
25فایلهای تغییر یافته به همراه1308 افزوده شده و 7 حذف شده
  1. 2 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 32 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/devicetemplate/IotDataSpecsDataTypeEnum.java
  3. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java
  4. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java
  5. 101 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/IotProjectTaskAttrsController.java
  6. 84 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsPageReqVO.java
  7. 101 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsRespVO.java
  8. 74 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsSaveReqVO.java
  9. 12 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskschedule/vo/IotProjectTaskScheduleRespVO.java
  10. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/IotProjectTaskTemplateController.java
  11. 54 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplatePageReqVO.java
  12. 63 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplateRespVO.java
  13. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplateSaveReqVO.java
  14. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java
  15. 113 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskattrs/IotProjectTaskAttrsDO.java
  16. 83 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskattrs/IotTaskAttrModelProperty.java
  17. 10 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskschedule/IotProjectTaskScheduleDO.java
  18. 70 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttasktemplate/IotProjectTaskTemplateDO.java
  19. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskattrs/IotProjectTaskAttrsMapper.java
  20. 34 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttasktemplate/IotProjectTaskTemplateMapper.java
  21. 64 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskattrs/IotProjectTaskAttrsService.java
  22. 78 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskattrs/IotProjectTaskAttrsServiceImpl.java
  23. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttasktemplate/IotProjectTaskTemplateService.java
  24. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttasktemplate/IotProjectTaskTemplateServiceImpl.java
  25. 0 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

+ 2 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -79,4 +79,6 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_PROJECT_TASK_SCHEDULE_NOT_EXISTS = new ErrorCode(1_002_004_005, "项目任务时间表/施工进度不存在");
     ErrorCode IOT_OPERATION_PLAN_NOT_EXISTS = new ErrorCode(156, "运行记录计划不存在");
     ErrorCode IOT_OPERATION_PLAN_DEV_NOT_EXISTS = new ErrorCode(157, "运行记录计划设备不存在");
+    ErrorCode IOT_PROJECT_TASK_TEMPLATE_NOT_EXISTS = new ErrorCode(257, "项目任务属性模板不存在");
+    ErrorCode IOT_PROJECT_TASK_ATTRS_NOT_EXISTS = new ErrorCode(258, "项目任务扩展属性不存在");
 }

+ 32 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/devicetemplate/IotDataSpecsDataTypeEnum.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.pms.enums.devicetemplate;
+
+import cn.iocoder.yudao.framework.common.core.ArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * pms 数据定义的数据类型枚举类
+ *
+ * @author ruiqi
+ */
+@AllArgsConstructor
+@Getter
+public enum IotDataSpecsDataTypeEnum implements ArrayValuable<String> {
+
+    DOUBLE("double"),
+    TEXT("text"),
+    TEXTAREA("textarea"),
+    DATE("date");
+
+    public static final String[] ARRAYS = Arrays.stream(values()).map(IotDataSpecsDataTypeEnum::getDataType).toArray(String[]::new);
+
+    private final String dataType;
+
+    @Override
+    public String[] array() {
+        return ARRAYS;
+    }
+
+}

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java

@@ -1,11 +1,13 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo;
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 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;
+import java.util.List;
 import java.util.Set;
 
 @Schema(description = "管理后台 - 项目信息任务拆分 Response VO")
@@ -99,4 +101,7 @@ public class IotProjectTaskRespVO {
      */
     @Schema(description = "项目所属部门id", example = "1755")
     private Long projectDeptId;
+
+    @Schema(description = "任务扩展属性", example = "[{\"a\": 1},{\"b\": 2}]")
+    private List<IotTaskAttrModelProperty> extProperty;
 }

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java

@@ -1,8 +1,10 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo;
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.util.List;
 import java.util.Set;
 
 @Schema(description = "管理后台 - 项目信息任务拆分新增/修改 Request VO")
@@ -69,4 +71,7 @@ public class IotProjectTaskSaveReqVO {
     @Schema(description = "合同编号")
     private String contractCode;
 
+    @Schema(description = "任务扩展属性", example = "[{\"a\": 1},{\"b\": 2}]")
+    private List<IotTaskAttrModelProperty> extProperty;
+
 }

+ 101 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/IotProjectTaskAttrsController.java

@@ -0,0 +1,101 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs;
+
+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.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotProjectTaskAttrsDO;
+import cn.iocoder.yudao.module.pms.service.iotprojecttaskattrs.IotProjectTaskAttrsService;
+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("/rq/iot-project-task-attrs")
+@Validated
+public class IotProjectTaskAttrsController {
+
+    @Resource
+    private IotProjectTaskAttrsService iotProjectTaskAttrsService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建项目任务扩展属性")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:create')")
+    public CommonResult<Long> createIotProjectTaskAttrs(@Valid @RequestBody IotProjectTaskAttrsSaveReqVO createReqVO) {
+        return success(iotProjectTaskAttrsService.createIotProjectTaskAttrs(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新项目任务扩展属性")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:update')")
+    public CommonResult<Boolean> updateIotProjectTaskAttrs(@Valid @RequestBody IotProjectTaskAttrsSaveReqVO updateReqVO) {
+        iotProjectTaskAttrsService.updateIotProjectTaskAttrs(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除项目任务扩展属性")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:delete')")
+    public CommonResult<Boolean> deleteIotProjectTaskAttrs(@RequestParam("id") Long id) {
+        iotProjectTaskAttrsService.deleteIotProjectTaskAttrs(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得项目任务扩展属性")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:query')")
+    public CommonResult<IotProjectTaskAttrsRespVO> getIotProjectTaskAttrs(@RequestParam("id") Long id) {
+        IotProjectTaskAttrsDO iotProjectTaskAttrs = iotProjectTaskAttrsService.getIotProjectTaskAttrs(id);
+        return success(BeanUtils.toBean(iotProjectTaskAttrs, IotProjectTaskAttrsRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得项目任务扩展属性分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:query')")
+    public CommonResult<PageResult<IotProjectTaskAttrsRespVO>> getIotProjectTaskAttrsPage(@Valid IotProjectTaskAttrsPageReqVO pageReqVO) {
+        PageResult<IotProjectTaskAttrsDO> pageResult = iotProjectTaskAttrsService.getIotProjectTaskAttrsPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotProjectTaskAttrsRespVO.class));
+    }
+
+    @GetMapping("/attrs")
+    @Operation(summary = "获得项目任务扩展属性列表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:query')")
+    public CommonResult<List<IotProjectTaskAttrsRespVO>> attrs(@Valid IotProjectTaskAttrsPageReqVO pageReqVO) {
+        List<IotProjectTaskAttrsDO> pageResult = iotProjectTaskAttrsService.getIotProjectTaskAttrsList(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotProjectTaskAttrsRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出项目任务扩展属性 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-attrs:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotProjectTaskAttrsExcel(@Valid IotProjectTaskAttrsPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotProjectTaskAttrsDO> list = iotProjectTaskAttrsService.getIotProjectTaskAttrsPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "项目任务扩展属性.xls", "数据", IotProjectTaskAttrsRespVO.class,
+                        BeanUtils.toBean(list, IotProjectTaskAttrsRespVO.class));
+    }
+
+}

+ 84 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsPageReqVO.java

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.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 IotProjectTaskAttrsPageReqVO extends PageParam {
+
+    @Schema(description = "任务扩展模板id", example = "9437")
+    private Long templateId;
+
+    @Schema(description = "公司id", example = "157")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "15067")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    private String wellType;
+
+    @Schema(description = "井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "属性名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "属性标识符")
+    private String identifier;
+
+    @Schema(description = "数据类型(double text textarea date)")
+    private String dataType;
+
+    @Schema(description = "是否必填(0非必填 1必填)")
+    private Integer required;
+
+    @Schema(description = "单位")
+    private String unit;
+
+    @Schema(description = "访问模式(r读  w写)")
+    private String accessMode;
+
+    @Schema(description = "默认值")
+    private String defaultValue;
+
+    @Schema(description = "最大值")
+    private String maxValue;
+
+    @Schema(description = "最小值")
+    private String minValue;
+
+    @Schema(description = "不同专业公司的扩展属性")
+    private String extProperty;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "0")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 101 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsRespVO.java

@@ -0,0 +1,101 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo;
+
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+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 IotProjectTaskAttrsRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14405")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "任务扩展模板id", example = "9437")
+    @ExcelProperty("任务扩展模板id")
+    private Long templateId;
+
+    @Schema(description = "公司id", example = "17720")
+    @ExcelProperty("公司id")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "15067")
+    @ExcelProperty("项目id")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    @ExcelProperty("项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    @ExcelProperty("井型")
+    private String wellType;
+
+    @Schema(description = "井别")
+    @ExcelProperty("井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    @ExcelProperty("施工工艺")
+    private String technique;
+
+    @Schema(description = "属性名称", example = "芋艿")
+    @ExcelProperty("属性名称")
+    private String name;
+
+    @Schema(description = "属性标识符")
+    @ExcelProperty("属性标识符")
+    private String identifier;
+
+    @Schema(description = "数据类型(double text textarea date)")
+    @ExcelProperty("数据类型(double text textarea date)")
+    private String dataType;
+
+    @Schema(description = "是否必填(0非必填 1必填)")
+    @ExcelProperty("是否必填(0非必填 1必填)")
+    private Integer required;
+
+    @Schema(description = "单位")
+    @ExcelProperty("单位")
+    private String unit;
+
+    @Schema(description = "访问模式(r读  w写)")
+    @ExcelProperty("访问模式(r读  w写)")
+    private String accessMode;
+
+    @Schema(description = "默认值")
+    @ExcelProperty("默认值")
+    private String defaultValue;
+
+    @Schema(description = "最大值")
+    private String maxValue;
+
+    @Schema(description = "最小值")
+    private String minValue;
+
+    @Schema(description = "不同专业公司的扩展属性")
+    @ExcelProperty("不同专业公司的扩展属性")
+    private IotTaskAttrModelProperty extProperty;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "0")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 74 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskattrs/vo/IotProjectTaskAttrsSaveReqVO.java

@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo;
+
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 项目任务扩展属性新增/修改 Request VO")
+@Data
+public class IotProjectTaskAttrsSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14405")
+    private Long id;
+
+    @Schema(description = "任务扩展模板id", example = "9437")
+    private Long templateId;
+
+    @Schema(description = "公司id", example = "17720")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "15067")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    private String wellType;
+
+    @Schema(description = "井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "属性名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "属性标识符")
+    private String identifier;
+
+    @Schema(description = "数据类型(double text textarea date)")
+    private String dataType;
+
+    @Schema(description = "是否必填(0非必填 1必填)")
+    private Integer required;
+
+    @Schema(description = "单位")
+    private String unit;
+
+    @Schema(description = "访问模式(r读  w写)")
+    private String accessMode;
+
+    @Schema(description = "默认值")
+    private String defaultValue;
+
+    @Schema(description = "最大值")
+    private String maxValue;
+
+    @Schema(description = "最小值")
+    private String minValue;
+
+    @Schema(description = "不同专业公司的扩展属性")
+    private IotTaskAttrModelProperty extProperty;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "1")
+    private Integer status;
+
+}

+ 12 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttaskschedule/vo/IotProjectTaskScheduleRespVO.java

@@ -32,14 +32,22 @@ public class IotProjectTaskScheduleRespVO {
     @ExcelProperty("施工阶段描述")
     private String description;
 
-    @Schema(description = "状态起始时间")
-    @ExcelProperty("状态起始时间")
+    @Schema(description = "状态起始时间 计划")
+    @ExcelProperty("状态起始时间 计划")
     private LocalDateTime startTime;
 
-    @Schema(description = "状态结束时间")
-    @ExcelProperty("状态结束时间")
+    @Schema(description = "状态结束时间 计划")
+    @ExcelProperty("状态结束时间 计划")
     private LocalDateTime endTime;
 
+    @Schema(description = "状态起始时间 实际")
+    @ExcelProperty("状态起始时间 实际")
+    private LocalDateTime actualStartTime;
+
+    @Schema(description = "状态结束时间 实际")
+    @ExcelProperty("状态结束时间 实际")
+    private LocalDateTime actualEndTime;
+
     @Schema(description = "备注", example = "你说的对")
     @ExcelProperty("备注")
     private String remark;

+ 93 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/IotProjectTaskTemplateController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate;
+
+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.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplatePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplateRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplateSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate.IotProjectTaskTemplateDO;
+import cn.iocoder.yudao.module.pms.service.iotprojecttasktemplate.IotProjectTaskTemplateService;
+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("/rq/iot-project-task-template")
+@Validated
+public class IotProjectTaskTemplateController {
+
+    @Resource
+    private IotProjectTaskTemplateService iotProjectTaskTemplateService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建项目任务属性模板")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:create')")
+    public CommonResult<Long> createIotProjectTaskTemplate(@Valid @RequestBody IotProjectTaskTemplateSaveReqVO createReqVO) {
+        return success(iotProjectTaskTemplateService.createIotProjectTaskTemplate(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新项目任务属性模板")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:update')")
+    public CommonResult<Boolean> updateIotProjectTaskTemplate(@Valid @RequestBody IotProjectTaskTemplateSaveReqVO updateReqVO) {
+        iotProjectTaskTemplateService.updateIotProjectTaskTemplate(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除项目任务属性模板")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:delete')")
+    public CommonResult<Boolean> deleteIotProjectTaskTemplate(@RequestParam("id") Long id) {
+        iotProjectTaskTemplateService.deleteIotProjectTaskTemplate(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得项目任务属性模板")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:query')")
+    public CommonResult<IotProjectTaskTemplateRespVO> getIotProjectTaskTemplate(@RequestParam("id") Long id) {
+        IotProjectTaskTemplateDO iotProjectTaskTemplate = iotProjectTaskTemplateService.getIotProjectTaskTemplate(id);
+        return success(BeanUtils.toBean(iotProjectTaskTemplate, IotProjectTaskTemplateRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得项目任务属性模板分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:query')")
+    public CommonResult<PageResult<IotProjectTaskTemplateRespVO>> getIotProjectTaskTemplatePage(@Valid IotProjectTaskTemplatePageReqVO pageReqVO) {
+        PageResult<IotProjectTaskTemplateDO> pageResult = iotProjectTaskTemplateService.getIotProjectTaskTemplatePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotProjectTaskTemplateRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出项目任务属性模板 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-project-task-template:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotProjectTaskTemplateExcel(@Valid IotProjectTaskTemplatePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotProjectTaskTemplateDO> list = iotProjectTaskTemplateService.getIotProjectTaskTemplatePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "项目任务属性模板.xls", "数据", IotProjectTaskTemplateRespVO.class,
+                        BeanUtils.toBean(list, IotProjectTaskTemplateRespVO.class));
+    }
+
+}

+ 54 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplatePageReqVO.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.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 IotProjectTaskTemplatePageReqVO extends PageParam {
+
+    @Schema(description = "公司id", example = "21249")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "1118")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    private String wellType;
+
+    @Schema(description = "井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "模板名称", example = "李四")
+    private String name;
+
+    @Schema(description = "模板标识符")
+    private String identifier;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "0")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 63 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplateRespVO.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.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 IotProjectTaskTemplateRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "18517")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "公司id", example = "21249")
+    @ExcelProperty("公司id")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "1118")
+    @ExcelProperty("项目id")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    @ExcelProperty("项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    @ExcelProperty("井型")
+    private String wellType;
+
+    @Schema(description = "井别")
+    @ExcelProperty("井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    @ExcelProperty("施工工艺")
+    private String technique;
+
+    @Schema(description = "模板名称", example = "李四")
+    @ExcelProperty("模板名称")
+    private String name;
+
+    @Schema(description = "模板标识符")
+    @ExcelProperty("模板标识符")
+    private String identifier;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "0")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 43 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttasktemplate/vo/IotProjectTaskTemplateSaveReqVO.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 项目任务属性模板新增/修改 Request VO")
+@Data
+public class IotProjectTaskTemplateSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "18517")
+    private Long id;
+
+    @Schema(description = "公司id", example = "21249")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "1118")
+    private Long projectId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂 )")
+    private String projectClassification;
+
+    @Schema(description = "井型", example = "2")
+    private String wellType;
+
+    @Schema(description = "井别")
+    private String wellCategory;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "模板名称", example = "李四")
+    private String name;
+
+    @Schema(description = "模板标识符")
+    private String identifier;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "0")
+    private Integer status;
+
+}

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.*;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -94,6 +96,9 @@ public class IotProjectTaskDO extends BaseDO {
     @TableField(typeHandler = JacksonTypeHandler.class)
     private Set<Long> deptIds;
 
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<IotTaskAttrModelProperty> extProperty;
+
     /**
      * 该任务所属部门id
      */

+ 113 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskattrs/IotProjectTaskAttrsDO.java

@@ -0,0 +1,113 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.*;
+
+/**
+ * 项目任务扩展属性 DO
+ *
+ * @author 超级管理员
+ */
+@TableName(value = "rq_iot_project_task_attrs", autoResultMap = true)
+@KeySequence("rq_iot_project_task_attrs_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotProjectTaskAttrsDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 任务扩展模板id
+     */
+    private Long templateId;
+    /**
+     * 公司id
+     */
+    private Long deptId;
+    /**
+     * 项目id
+     */
+    private Long projectId;
+    /**
+     * 项目类别(钻井 修井 注氮 酸化压裂 )
+     */
+    private String projectClassification;
+    /**
+     * 井型
+     */
+    private String wellType;
+    /**
+     * 井别
+     */
+    private String wellCategory;
+    /**
+     * 施工工艺
+     */
+    private String technique;
+    /**
+     * 属性名称
+     */
+    private String name;
+    /**
+     * 属性标识符
+     */
+    private String identifier;
+    /**
+     * 数据类型(double text textarea date)
+     */
+    private String dataType;
+    /**
+     * 是否必填(0非必填 1必填)
+     */
+    private Integer required;
+    /**
+     * 单位
+     */
+    private String unit;
+    /**
+     * 访问模式(r读  w写)
+     */
+    private String accessMode;
+    /**
+     * 默认值
+     */
+    private String defaultValue;
+    /**
+     * 最大值
+     */
+    private String maxValue;
+    /**
+     * 最小值
+     */
+    private String minValue;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 不同专业公司的扩展属性
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private IotTaskAttrModelProperty extProperty;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private Integer status;
+
+}

+ 83 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskattrs/IotTaskAttrModelProperty.java

@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.pms.enums.devicetemplate.DeviceTemplateAttrAccessModeEnum;
+import cn.iocoder.yudao.module.pms.enums.devicetemplate.IotDataSpecsDataTypeEnum;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
+
+/**
+ * pms 任务扩展属性
+ *
+ * @author ruiqi
+ */
+@Data
+public class IotTaskAttrModelProperty {
+
+    /**
+     * 属性名称
+     */
+    @NotEmpty(message = "属性名称不能为空")
+    private String name;
+
+    /**
+     * 属性标识符
+     */
+    @NotEmpty(message = "属性标识符不能为空")
+    @Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9_]{0,31}$", message = "属性标识符只能由字母、数字和下划线组成,必须以字母开头,长度不超过 32 个字符")
+    private String identifier;
+
+    /**
+     * 参数值的数据类型 (double text textarea date)
+     *
+     * 枚举 {@link IotDataSpecsDataTypeEnum}
+     */
+    @NotEmpty(message = "数据类型不能为空")
+    @InEnum(IotDataSpecsDataTypeEnum.class)
+    private String dataType;
+
+    /**
+     * 是否必填(0非必填 1必填)
+     */
+    private Integer required;
+
+    /**
+     * 单位 MPa m
+     */
+    private String unit;
+
+    /**
+     * 可以对该属性进行的操作类型
+     *
+     * 枚举 {@link DeviceTemplateAttrAccessModeEnum}
+     */
+    @InEnum(DeviceTemplateAttrAccessModeEnum.class)
+    private String accessMode;
+
+    /**
+     * 默认值
+     */
+    private String defaultValue;
+
+    /**
+     * 最大值
+     */
+    private String maxValue;
+
+    /**
+     * 最小值
+     */
+    private String minValue;
+
+    /**
+     * 排序值
+     */
+    private Integer sort;
+
+    /**
+     * 字段值
+     */
+    private String actualValue;
+}

+ 10 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttaskschedule/IotProjectTaskScheduleDO.java

@@ -45,13 +45,21 @@ public class IotProjectTaskScheduleDO extends BaseDO {
      */
     private String description;
     /**
-     * 状态起始时间
+     * 状态起始时间 计划
      */
     private LocalDateTime startTime;
     /**
-     * 状态结束时间
+     * 状态结束时间 计划
      */
     private LocalDateTime endTime;
+    /**
+     * 状态起始时间 实际
+     */
+    private LocalDateTime actualStartTime;
+    /**
+     * 状态结束时间 实际
+     */
+    private LocalDateTime actualEndTime;
     /**
      * 备注
      */

+ 70 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttasktemplate/IotProjectTaskTemplateDO.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate;
+
+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 超级管理员
+ */
+@TableName("rq_iot_project_task_template")
+@KeySequence("rq_iot_project_task_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotProjectTaskTemplateDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 公司id
+     */
+    private Long deptId;
+    /**
+     * 项目id
+     */
+    private Long projectId;
+    /**
+     * 项目类别(钻井 修井 注氮 酸化压裂 )
+     */
+    private String projectClassification;
+    /**
+     * 井型
+     */
+    private String wellType;
+    /**
+     * 井别
+     */
+    private String wellCategory;
+    /**
+     * 施工工艺
+     */
+    private String technique;
+    /**
+     * 模板名称
+     */
+    private String name;
+    /**
+     * 模板标识符
+     */
+    private String identifier;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private Integer status;
+
+}

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskattrs/IotProjectTaskAttrsMapper.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttaskattrs;
+
+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.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotProjectTaskAttrsDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 项目任务扩展属性 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface IotProjectTaskAttrsMapper extends BaseMapperX<IotProjectTaskAttrsDO> {
+
+    default PageResult<IotProjectTaskAttrsDO> selectPage(IotProjectTaskAttrsPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotProjectTaskAttrsDO>()
+                .eqIfPresent(IotProjectTaskAttrsDO::getTemplateId, reqVO.getTemplateId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotProjectTaskAttrsDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotProjectTaskAttrsDO::getWellCategory, reqVO.getWellCategory())
+                .eqIfPresent(IotProjectTaskAttrsDO::getTechnique, reqVO.getTechnique())
+                .likeIfPresent(IotProjectTaskAttrsDO::getName, reqVO.getName())
+                .eqIfPresent(IotProjectTaskAttrsDO::getIdentifier, reqVO.getIdentifier())
+                .eqIfPresent(IotProjectTaskAttrsDO::getExtProperty, reqVO.getExtProperty())
+                .eqIfPresent(IotProjectTaskAttrsDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotProjectTaskAttrsDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotProjectTaskAttrsDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotProjectTaskAttrsDO::getId));
+    }
+
+    default List<IotProjectTaskAttrsDO> selectList(IotProjectTaskAttrsPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotProjectTaskAttrsDO>()
+                .eqIfPresent(IotProjectTaskAttrsDO::getTemplateId, reqVO.getTemplateId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotProjectTaskAttrsDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotProjectTaskAttrsDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotProjectTaskAttrsDO::getWellCategory, reqVO.getWellCategory())
+                .eqIfPresent(IotProjectTaskAttrsDO::getTechnique, reqVO.getTechnique())
+                .likeIfPresent(IotProjectTaskAttrsDO::getName, reqVO.getName())
+                .eqIfPresent(IotProjectTaskAttrsDO::getIdentifier, reqVO.getIdentifier())
+                .eqIfPresent(IotProjectTaskAttrsDO::getExtProperty, reqVO.getExtProperty())
+                .eqIfPresent(IotProjectTaskAttrsDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotProjectTaskAttrsDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotProjectTaskAttrsDO::getCreateTime, reqVO.getCreateTime())
+                .orderByAsc(IotProjectTaskAttrsDO::getSort));
+    }
+
+}

+ 34 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttasktemplate/IotProjectTaskTemplateMapper.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttasktemplate;
+
+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.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplatePageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate.IotProjectTaskTemplateDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 项目任务属性模板 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface IotProjectTaskTemplateMapper extends BaseMapperX<IotProjectTaskTemplateDO> {
+
+    default PageResult<IotProjectTaskTemplateDO> selectPage(IotProjectTaskTemplatePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotProjectTaskTemplateDO>()
+                .eqIfPresent(IotProjectTaskTemplateDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotProjectTaskTemplateDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotProjectTaskTemplateDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotProjectTaskTemplateDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotProjectTaskTemplateDO::getWellCategory, reqVO.getWellCategory())
+                .eqIfPresent(IotProjectTaskTemplateDO::getTechnique, reqVO.getTechnique())
+                .likeIfPresent(IotProjectTaskTemplateDO::getName, reqVO.getName())
+                .eqIfPresent(IotProjectTaskTemplateDO::getIdentifier, reqVO.getIdentifier())
+                .eqIfPresent(IotProjectTaskTemplateDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotProjectTaskTemplateDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotProjectTaskTemplateDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotProjectTaskTemplateDO::getId));
+    }
+
+}

+ 64 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskattrs/IotProjectTaskAttrsService.java

@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.pms.service.iotprojecttaskattrs;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotProjectTaskAttrsDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 项目任务扩展属性 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface IotProjectTaskAttrsService {
+
+    /**
+     * 创建项目任务扩展属性
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotProjectTaskAttrs(@Valid IotProjectTaskAttrsSaveReqVO createReqVO);
+
+    /**
+     * 更新项目任务扩展属性
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotProjectTaskAttrs(@Valid IotProjectTaskAttrsSaveReqVO updateReqVO);
+
+    /**
+     * 删除项目任务扩展属性
+     *
+     * @param id 编号
+     */
+    void deleteIotProjectTaskAttrs(Long id);
+
+    /**
+     * 获得项目任务扩展属性
+     *
+     * @param id 编号
+     * @return 项目任务扩展属性
+     */
+    IotProjectTaskAttrsDO getIotProjectTaskAttrs(Long id);
+
+    /**
+     * 获得项目任务扩展属性分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 项目任务扩展属性分页
+     */
+    PageResult<IotProjectTaskAttrsDO> getIotProjectTaskAttrsPage(IotProjectTaskAttrsPageReqVO pageReqVO);
+
+    /**
+     * 获得项目任务扩展属性列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 项目任务扩展属性列表
+     */
+    List<IotProjectTaskAttrsDO> getIotProjectTaskAttrsList(IotProjectTaskAttrsPageReqVO pageReqVO);
+
+}

+ 78 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttaskattrs/IotProjectTaskAttrsServiceImpl.java

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.pms.service.iotprojecttaskattrs;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskattrs.vo.IotProjectTaskAttrsSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotProjectTaskAttrsDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttaskattrs.IotProjectTaskAttrsMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_ATTRS_NOT_EXISTS;
+
+/**
+ * 项目任务扩展属性 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class IotProjectTaskAttrsServiceImpl implements IotProjectTaskAttrsService {
+
+    @Resource
+    private IotProjectTaskAttrsMapper iotProjectTaskAttrsMapper;
+
+    @Override
+    public Long createIotProjectTaskAttrs(IotProjectTaskAttrsSaveReqVO createReqVO) {
+        // 插入
+        IotProjectTaskAttrsDO iotProjectTaskAttrs = BeanUtils.toBean(createReqVO, IotProjectTaskAttrsDO.class);
+        iotProjectTaskAttrsMapper.insert(iotProjectTaskAttrs);
+        // 返回
+        return iotProjectTaskAttrs.getId();
+    }
+
+    @Override
+    public void updateIotProjectTaskAttrs(IotProjectTaskAttrsSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotProjectTaskAttrsExists(updateReqVO.getId());
+        // 更新
+        IotProjectTaskAttrsDO updateObj = BeanUtils.toBean(updateReqVO, IotProjectTaskAttrsDO.class);
+        iotProjectTaskAttrsMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotProjectTaskAttrs(Long id) {
+        // 校验存在
+        validateIotProjectTaskAttrsExists(id);
+        // 删除
+        iotProjectTaskAttrsMapper.deleteById(id);
+    }
+
+    private void validateIotProjectTaskAttrsExists(Long id) {
+        if (iotProjectTaskAttrsMapper.selectById(id) == null) {
+            throw exception(IOT_PROJECT_TASK_ATTRS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotProjectTaskAttrsDO getIotProjectTaskAttrs(Long id) {
+        return iotProjectTaskAttrsMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotProjectTaskAttrsDO> getIotProjectTaskAttrsPage(IotProjectTaskAttrsPageReqVO pageReqVO) {
+        return iotProjectTaskAttrsMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<IotProjectTaskAttrsDO> getIotProjectTaskAttrsList(IotProjectTaskAttrsPageReqVO pageReqVO) {
+        return iotProjectTaskAttrsMapper.selectList(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttasktemplate/IotProjectTaskTemplateService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotprojecttasktemplate;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplatePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplateSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate.IotProjectTaskTemplateDO;
+
+import javax.validation.Valid;
+
+/**
+ * 项目任务属性模板 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface IotProjectTaskTemplateService {
+
+    /**
+     * 创建项目任务属性模板
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotProjectTaskTemplate(@Valid IotProjectTaskTemplateSaveReqVO createReqVO);
+
+    /**
+     * 更新项目任务属性模板
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotProjectTaskTemplate(@Valid IotProjectTaskTemplateSaveReqVO updateReqVO);
+
+    /**
+     * 删除项目任务属性模板
+     *
+     * @param id 编号
+     */
+    void deleteIotProjectTaskTemplate(Long id);
+
+    /**
+     * 获得项目任务属性模板
+     *
+     * @param id 编号
+     * @return 项目任务属性模板
+     */
+    IotProjectTaskTemplateDO getIotProjectTaskTemplate(Long id);
+
+    /**
+     * 获得项目任务属性模板分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 项目任务属性模板分页
+     */
+    PageResult<IotProjectTaskTemplateDO> getIotProjectTaskTemplatePage(IotProjectTaskTemplatePageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttasktemplate/IotProjectTaskTemplateServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotprojecttasktemplate;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplatePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplateSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate.IotProjectTaskTemplateDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttasktemplate.IotProjectTaskTemplateMapper;
+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.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_TEMPLATE_NOT_EXISTS;
+
+/**
+ * 项目任务属性模板 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class IotProjectTaskTemplateServiceImpl implements IotProjectTaskTemplateService {
+
+    @Resource
+    private IotProjectTaskTemplateMapper iotProjectTaskTemplateMapper;
+
+    @Override
+    public Long createIotProjectTaskTemplate(IotProjectTaskTemplateSaveReqVO createReqVO) {
+        // 插入
+        IotProjectTaskTemplateDO iotProjectTaskTemplate = BeanUtils.toBean(createReqVO, IotProjectTaskTemplateDO.class);
+        iotProjectTaskTemplateMapper.insert(iotProjectTaskTemplate);
+        // 返回
+        return iotProjectTaskTemplate.getId();
+    }
+
+    @Override
+    public void updateIotProjectTaskTemplate(IotProjectTaskTemplateSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotProjectTaskTemplateExists(updateReqVO.getId());
+        // 更新
+        IotProjectTaskTemplateDO updateObj = BeanUtils.toBean(updateReqVO, IotProjectTaskTemplateDO.class);
+        iotProjectTaskTemplateMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotProjectTaskTemplate(Long id) {
+        // 校验存在
+        validateIotProjectTaskTemplateExists(id);
+        // 删除
+        iotProjectTaskTemplateMapper.deleteById(id);
+    }
+
+    private void validateIotProjectTaskTemplateExists(Long id) {
+        if (iotProjectTaskTemplateMapper.selectById(id) == null) {
+            throw exception(IOT_PROJECT_TASK_TEMPLATE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotProjectTaskTemplateDO getIotProjectTaskTemplate(Long id) {
+        return iotProjectTaskTemplateMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotProjectTaskTemplateDO> getIotProjectTaskTemplatePage(IotProjectTaskTemplatePageReqVO pageReqVO) {
+        return iotProjectTaskTemplateMapper.selectPage(pageReqVO);
+    }
+
+}

+ 0 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

@@ -399,7 +399,6 @@ public class DeptServiceImpl implements DeptService {
                 DataPermissionUtils.executeIgnore(() -> {
                     // 查询当前部门dept的所有子部门
                     Set<Long> tempDeptIds = getChildDeptIdListFromCache(dept.getId());
-                    allDeptIds.add(dept.getId());
                     allDeptIds.addAll(tempDeptIds);
                 });
             });