Browse Source

pms 瑞恒日报 保存填报数据 日报列表

zhangcl 3 weeks ago
parent
commit
b3c209d731
10 changed files with 380 additions and 10 deletions
  1. 70 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicecategorytemplateattrs/vo/IotDeviceProperty.java
  2. 8 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java
  3. 70 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java
  4. 12 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/vo/IotRhDailyReportRespVO.java
  5. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotrhdailyreport/IotRhDailyReportConvert.java
  6. 24 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java
  7. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskschedule/IotProjectTaskScheduleMapper.java
  8. 12 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskService.java
  9. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java
  10. 145 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

+ 70 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicecategorytemplateattrs/vo/IotDeviceProperty.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateattrs.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 设备扩展属性 json 解析对象")
+@Data
+@ToString(callSuper = true)
+public class IotDeviceProperty {
+
+    private Integer id;
+    private Integer deviceCategoryId;
+    private Object templateId;
+    private String name;
+    private String code;
+    private String type;
+    private Integer requiredFlag;
+    private String defaultValue;
+    private String unit;
+    private String description;
+    private Integer status;
+    private String remark;
+    private Integer sort;
+    private SelectOptions selectOptions;
+    private Integer version;
+    private Long createTime;
+    private String value;
+
+    public static class DataSpecs {
+        private String dataType;
+        private Integer length;
+        private Integer max;
+        private Integer min;
+        private Integer step;
+        private Integer precise;
+        private Object defaultValue;
+        private String unit;
+        private String unitName;
+
+        // Getters and Setters
+    }
+
+    public static class DataSpecsItem {
+        private String dataType;
+        private String name;
+        private Object value;
+
+        // Getters and Setters
+    }
+
+    public static class SelectOptions {
+        private String name;
+        private Object placeHolder;
+        private String code;
+        private String type;
+        private Integer requiredFlag;
+        private Object sort;
+        private String identifier;
+        private Object defaultValue;
+        private Object accessMode;
+        private DataSpecs dataSpecs;
+        private List<DataSpecsItem> dataSpecsList;
+
+        // Getters and Setters
+    }
+
+}

+ 8 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java

@@ -64,9 +64,10 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "备注", example = "你说的对")
     private String remark;
 
-    @Schema(description = "施工队伍")
+    @Schema(description = "施工队伍集合")
     private Set<Long> deptIds;
 
+    @Schema(description = "施工队伍id")
     private Long deptId;
 
     @Schema(description = "客户名称")
@@ -78,4 +79,10 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "合同编号")
     private String contractCode;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "任务id集合")
+    private List<Long> taskIds;
+
 }

+ 70 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java

@@ -1,16 +1,27 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 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.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
+import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
+import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
 import cn.iocoder.yudao.module.pms.service.iotrhdailyreport.IotRhDailyReportService;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -22,10 +33,15 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
 
 @Tag(name = "管理后台 - 瑞恒日报")
 @RestController
@@ -35,6 +51,12 @@ public class IotRhDailyReportController {
 
     @Resource
     private IotRhDailyReportService iotRhDailyReportService;
+    @Resource
+    private DeptService deptService;
+    @Resource
+    private IotProjectInfoService iotProjectInfoService;
+    @Resource
+    private IotProjectTaskService iotProjectTaskService;
 
     @PostMapping("/create")
     @Operation(summary = "创建瑞恒日报")
@@ -74,7 +96,54 @@ public class IotRhDailyReportController {
     @PreAuthorize("@ss.hasPermission('pms:iot-rh-daily-report:query')")
     public CommonResult<PageResult<IotRhDailyReportRespVO>> getIotRhDailyReportPage(@Valid IotRhDailyReportPageReqVO pageReqVO) {
         PageResult<IotRhDailyReportDO> pageResult = iotRhDailyReportService.getIotRhDailyReportPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, IotRhDailyReportRespVO.class));
+
+        // List<IotRhDailyReportRespVO> rhDailyReports = IotRhDailyReportConvert.INSTANCE.convertList(pageResult.getList(), deptMap);
+        return success(new PageResult<>(buildRhDailyReports(pageResult.getList()), pageResult.getTotal()));
+        // return success(new PageResult<>(rhDailyReports, pageResult.getTotal()));
+    }
+
+    /**
+     * 瑞恒日报分布 设置关联查询信息
+     * @param reports
+     * @return
+     */
+    private List<IotRhDailyReportRespVO> buildRhDailyReports(List<IotRhDailyReportDO> reports) {
+        if (CollUtil.isEmpty(reports)) {
+            return Collections.emptyList();
+        }
+        // 设备部门信息
+        Map<Long, DeptDO> deptMap = deptService.getDeptMap(convertList(reports, IotRhDailyReportDO::getDeptId));
+        Map<Long, String> projectPair = new HashMap<>();
+        Map<Long, String> taskPair = new HashMap<>();
+        DataPermissionUtils.executeIgnore(() -> {
+            // 查询日报关联的项目信息
+            IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
+            reqVO.setProjectIds(convertList(reports, IotRhDailyReportDO::getProjectId));
+            List<IotProjectInfoDO> projects = iotProjectInfoService.getIotProjectInfos(reqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectPair.put(project.getId(), project.getContractName());
+                });
+            }
+            // 查询日报关联的任务信息
+            IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+            taskReqVO.setTaskIds(convertList(reports, IotRhDailyReportDO::getTaskId));
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(taskReqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskPair.put(task.getId(), StrUtil.join(" - ", task.getWellName(), task.getLocation()));
+                });
+            }
+        });
+        // 2. 拼接数据
+        return BeanUtils.toBean(reports, IotRhDailyReportRespVO.class, (reportVO) -> {
+            // 2.1 拼接部门信息
+            findAndThen(deptMap, reportVO.getDeptId(), dept -> reportVO.setDeptName(dept.getName()));
+            // 2.2 日报关联的项目信息
+            findAndThen(projectPair, reportVO.getProjectId(), contractName -> reportVO.setContractName(contractName));
+            // 2.3 日报关联的任务信息
+            findAndThen(taskPair, reportVO.getTaskId(), taskName -> reportVO.setTaskName(taskName));
+        });
     }
 
     @GetMapping("/export-excel")

+ 12 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/vo/IotRhDailyReportRespVO.java

@@ -129,4 +129,16 @@ public class IotRhDailyReportRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "部门名称")
+    private String deptName;
+
+    @Schema(description = "项目/合同名称")
+    private String contractName;
+
+    @Schema(description = "任务 井号-施工地点")
+    private String taskName;
+
 }

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotrhdailyreport/IotRhDailyReportConvert.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.pms.convert.iotrhdailyreport;
+
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttasktemplate.vo.IotProjectTaskTemplateRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttasktemplate.IotProjectTaskTemplateDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface IotRhDailyReportConvert {
+
+    IotRhDailyReportConvert INSTANCE = Mappers.getMapper(IotRhDailyReportConvert.class);
+
+    default List<IotRhDailyReportRespVO> convertList(List<IotRhDailyReportDO> list, Map<Long, DeptDO> deptMap) {
+        return CollectionUtils.convertList(list, de -> convert(de, deptMap.get(de.getDeptId())));
+    }
+
+    default IotRhDailyReportRespVO convert(IotRhDailyReportDO user, DeptDO dept) {
+        IotRhDailyReportRespVO userVO = BeanUtils.toBean(user, IotRhDailyReportRespVO.class);
+        if (dept != null) {
+            userVO.setDeptName(dept.getName());
+        }
+        return userVO;
+    }
+
+}

+ 24 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java

@@ -1,17 +1,19 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask;
 
-import java.time.LocalDateTime;
-import java.util.*;
-
+import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 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.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+
 
 /**
  * 项目信息任务拆分 Mapper
@@ -53,6 +55,24 @@ public interface IotProjectTaskMapper extends BaseMapperX<IotProjectTaskDO> {
                 .orderByDesc(IotProjectTaskDO::getId));
     }
 
+    default List<IotProjectTaskDO> selectList(IotProjectTaskPageReqVO reqVO) {
+        LambdaQueryWrapperX<IotProjectTaskDO> wrapper = new LambdaQueryWrapperX<IotProjectTaskDO>()
+                .inIfPresent(IotProjectTaskDO::getId,  reqVO.getTaskIds())
+                .eqIfPresent(IotProjectTaskDO::getProjectId, reqVO.getProjectId())
+                .likeIfPresent(IotProjectTaskDO::getWellName, reqVO.getWellName())
+                .eqIfPresent(IotProjectTaskDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotProjectTaskDO::getLocation, reqVO.getLocation())
+                .eqIfPresent(IotProjectTaskDO::getTechnique, reqVO.getTechnique())
+                .eqIfPresent(IotProjectTaskDO::getWorkloadDesign, reqVO.getWorkloadDesign())
+                .betweenIfPresent(IotProjectTaskDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(IotProjectTaskDO::getUserName, reqVO.getUserName())
+                .eqIfPresent(IotProjectTaskDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(IotProjectTaskDO::getRemark, reqVO.getRemark());
+        if (ObjUtil.isNotEmpty(reqVO.getDeptId())) {
+            wrapper.apply("FIND_IN_SET({0}, REPLACE(REPLACE(dept_ids,'[',''),']',''))", reqVO.getDeptId());
+        }
+        return selectList(wrapper);
+    }
 
     IPage<IotProjectTaskDO> taskList(IPage<IotProjectTaskPageReqVO> page,
                                      @Param("manufactureName") String manufactureName,

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttaskschedule/IotProjectTaskScheduleMapper.java

@@ -40,7 +40,7 @@ public interface IotProjectTaskScheduleMapper extends BaseMapperX<IotProjectTask
                 .betweenIfPresent(IotProjectTaskScheduleDO::getEndTime, reqVO.getEndTime())
                 .eqIfPresent(IotProjectTaskScheduleDO::getRemark, reqVO.getRemark())
                 .betweenIfPresent(IotProjectTaskScheduleDO::getCreateTime, reqVO.getCreateTime())
-                .orderByAsc(IotProjectTaskScheduleDO::getStatus));
+                .orderByAsc(IotProjectTaskScheduleDO::getStartTime, IotProjectTaskScheduleDO::getStatus));
     }
 
 }

+ 12 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskService.java

@@ -1,13 +1,14 @@
 package cn.iocoder.yudao.module.pms.service.iotprojecttask;
 
-import java.util.*;
-import javax.validation.*;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 项目信息任务拆分 Service 接口
  *
@@ -58,6 +59,14 @@ public interface IotProjectTaskService {
      */
     PageResult<IotProjectTaskDO> getIotProjectTaskPage(IotProjectTaskPageReqVO pageReqVO);
 
+    /**
+     * 项目信息任务列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 项目信息任务列表
+     */
+    List<IotProjectTaskDO> projectTasks(IotProjectTaskPageReqVO pageReqVO);
+
     PageResult<IotProjectTaskDO> getIotProjectTaskPage1(IotProjectTaskPageReqVO pageReqVO,Collection<Long> deptIds);
 
 

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java

@@ -110,6 +110,11 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
         return iotProjectTaskMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<IotProjectTaskDO> projectTasks(IotProjectTaskPageReqVO pageReqVO) {
+        return iotProjectTaskMapper.selectList(pageReqVO);
+    }
+
     @Override
     public PageResult<IotProjectTaskDO> getIotProjectTaskPage1(IotProjectTaskPageReqVO pageReqVO, Collection<Long> deptIds) {
         return iotProjectTaskMapper.selectPage1(pageReqVO, deptIds);

+ 145 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

@@ -1,15 +1,41 @@
 package cn.iocoder.yudao.module.pms.service.iotrhdailyreport;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 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.iotdevicecategorytemplateattrs.vo.IotDeviceProperty;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.IotRhDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotrhdailyreport.IotRhDailyReportMapper;
+import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
+import cn.iocoder.yudao.module.system.service.dict.DictDataService;
+import cn.iocoder.yudao.module.system.service.dict.DictTypeService;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RH_DAILY_REPORT_NOT_EXISTS;
@@ -25,12 +51,131 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
 
     @Resource
     private IotRhDailyReportMapper iotRhDailyReportMapper;
+    @Resource
+    private IotProjectTaskMapper iotProjectTaskMapper;
+    @Resource
+    private IotDeviceMapper iotDeviceMapper;
+    @Resource
+    private DictDataService dictDataService;
+    @Resource
+    private DictTypeService dictTypeService;
+
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createIotRhDailyReport(IotRhDailyReportSaveReqVO createReqVO) {
         // 插入
         IotRhDailyReportDO iotRhDailyReport = BeanUtils.toBean(createReqVO, IotRhDailyReportDO.class);
+        // 根据日报的 施工队伍 deptId 查询队伍所在的 项目 任务
+        // 根据日报的施工状态 更新 对应任务的 状态
+        if (ObjUtil.isNotEmpty(createReqVO.getDeptId())) {
+            Set<Long> deviceIds = new HashSet<>();
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setDeptId(createReqVO.getDeptId());
+            // 查询包含当前日报施工队伍的任务
+            List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(reqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                IotProjectTaskDO task = tasks.get(0);
+                // 暂时只考虑1个施工队伍只属于1个任务
+                iotRhDailyReport.setProjectId(task.getProjectId());
+                iotRhDailyReport.setTaskId(task.getId());
+                // 根据日报状态 查新 日报所属任务的状态
+                if (ObjUtil.isNotEmpty(createReqVO.getConstructionStatus())) {
+                    task.setStatus(createReqVO.getConstructionStatus());
+                    // 更新任务状态
+                    iotProjectTaskMapper.updateById(task);
+                }
+                // 查询任务的设备列表
+                deviceIds = task.getDeviceIds();
+            }
+
+            // 找到当前小队下的 电驱增压机 分类下设备的产能 计算 运行时效
+            DictTypeDO dictType = dictTypeService.getDictType("rq_iot_charger_device_category");
+            AtomicReference<BigDecimal> capacity = new AtomicReference<>(BigDecimal.ZERO);
+            if (ObjUtil.isNotEmpty(dictType)) {
+                if (StrUtil.isNotBlank(dictType.getRemark())) {
+                    IotDevicePageReqVO capacityReqVO = new IotDevicePageReqVO();
+                    capacityReqVO.setDeptId(createReqVO.getDeptId());
+                    capacityReqVO.setAssetClass(Long.valueOf(dictType.getRemark()));
+                    List<IotDeviceDO> capacityDevices = iotDeviceMapper.selectList(capacityReqVO);
+                    if (CollUtil.isNotEmpty(capacityDevices)) {
+                        // 解析每个设备的 扩展属性 找出 已经设置 了产能的设备并提取值
+                        capacityDevices.forEach(device -> {
+                            if (StrUtil.isNotBlank(device.getTemplateJson())) {
+                                Gson gson = new Gson();
+                                Type listType = new TypeToken<List<IotDeviceProperty>>(){}.getType();
+                                List<IotDeviceProperty> deviceProperties = gson.fromJson(device.getTemplateJson(), listType);
+                                if (CollUtil.isNotEmpty(deviceProperties)) {
+                                    deviceProperties.forEach(property -> {
+                                        if ("产能".equals(property.getName()) && StrUtil.isNotBlank(property.getValue())) {
+                                            // 当前扩展属性已经维护了 产能 值
+                                            capacity.set(new BigDecimal(property.getValue()));
+                                        }
+                                    });
+                                }
+                            }
+                        });
+                        // 计算运行时效 当日注气量/产能
+                        if (ObjUtil.isNotEmpty(createReqVO.getDailyGasInjection()) && (capacity.get().compareTo(BigDecimal.ZERO)>0)) {
+                            iotRhDailyReport.setTransitTime(createReqVO.getDailyGasInjection().divide(capacity.get(), 2, RoundingMode.HALF_UP));
+                        }
+                    }
+                }
+            }
+
+            // 查询当前日报所属任务关联的设备
+            if (CollUtil.isNotEmpty(deviceIds)) {
+                // 查询当前小队下所有设备
+                IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
+                // deviceReqVO.setDeptId(createReqVO.getDeptId());
+                deviceReqVO.setDeviceIds(new ArrayList<>(deviceIds));
+                List<IotDeviceDO> devices = iotDeviceMapper.selectList(deviceReqVO);
+                if (CollUtil.isNotEmpty(devices)) {
+                    AtomicReference<String> deviceNewStatus = new AtomicReference<>(StrUtil.EMPTY);
+                    // 日报状态 与 设备状态 对应关系
+                    // 动迁 施工 现场待命/驻地待命(待命) pms_device_status
+                    List<DictDataDO> dictDatas = dictDataService.getDictDataListByDictType("rq_iot_project_work_progress");
+                    AtomicReference<String> dailyDictLabel = new AtomicReference<>(StrUtil.EMPTY);
+                    List<DictDataDO> deviceDictDatas = dictDataService.getDictDataListByDictType("pms_device_status");
+                    if (CollUtil.isNotEmpty(dictDatas)) {
+                        dictDatas.forEach(data -> {
+                            if (createReqVO.getConstructionStatus().equals(Integer.valueOf(data.getValue()))) {
+                                dailyDictLabel.set(data.getLabel());
+                            }
+                        });
+                        if (CollUtil.isNotEmpty(deviceDictDatas)) {
+                            deviceDictDatas.forEach(data -> {
+                                if (dailyDictLabel.equals(data.getLabel())) {
+                                    // 动迁 施工
+                                    deviceNewStatus.set(data.getValue());
+                                }
+                                if (data.getLabel().contains(dailyDictLabel.get())) {
+                                    // 现场待命/驻地待命(待命)
+                                    deviceNewStatus.set(data.getValue());
+                                }
+                            });
+                        }
+                    }
+                    // 批量更新设备状态
+                    devices.forEach(device -> {
+                        device.setDeviceStatus(deviceNewStatus.get());
+                    });
+                }
+            }
+        }
+        // 设置任务时间范围 昨天下午4点到今天下午4点
+        // 设置任务时间范围 昨天下午4点到今天下午4点
+        LocalDateTime now = LocalDateTime.now();
+        // 今天下午4点
+        LocalDateTime today4pm = now.withHour(16).withMinute(0).withSecond(0).withNano(0);
+        // 昨天下午4点
+        LocalDateTime yesterday4pm = today4pm.minusDays(1);
+        iotRhDailyReport.setConstructionStartDate(yesterday4pm);
+        iotRhDailyReport.setConstructionEndDate(today4pm);
         iotRhDailyReportMapper.insert(iotRhDailyReport);
+        // 当天如果已经有此小队的记录 新增
+        // 当天如果没有此小队的日报记录 修改
+
         // 返回
         return iotRhDailyReport.getId();
     }