Przeglądaj źródła

pms 瑞恒日报 中航北斗数据

zhangcl 7 godzin temu
rodzic
commit
d36bc659c7
25 zmienionych plików z 1331 dodań i 79 usunięć
  1. 2 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/IotCarZhbdController.java
  3. 48 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/vo/IotCarZhbdPageReqVO.java
  4. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/vo/IotCarZhbdRespVO.java
  5. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/vo/IotCarZhbdSaveReqVO.java
  6. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/IotDailyReportFuelController.java
  7. 59 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelPageReqVO.java
  8. 68 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelRespVO.java
  9. 49 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelSaveReqVO.java
  10. 15 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java
  11. 13 7
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotZHBDController.java
  12. 11 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/vo/IotRhDailyReportRespVO.java
  13. 50 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcarzhbd/IotCarZhbdDO.java
  14. 77 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotdailyreportfuel/IotDailyReportFuelDO.java
  15. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrhdailyreport/IotRhDailyReportDO.java
  16. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcarzhbd/IotCarZhbdMapper.java
  17. 54 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdailyreportfuel/IotDailyReportFuelMapper.java
  18. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotDeviceCarFuelVO.java
  19. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/httpEntity/ResponseOilData.java
  20. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcarzhbd/IotCarZhbdService.java
  21. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcarzhbd/IotCarZhbdServiceImpl.java
  22. 64 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdailyreportfuel/IotDailyReportFuelService.java
  23. 78 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdailyreportfuel/IotDailyReportFuelServiceImpl.java
  24. 145 70
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java
  25. 134 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/ZHBDUtil.java

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

@@ -97,4 +97,6 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_DAILY_REPORT_TIME_NOT_EXISTS = new ErrorCode(272, "未传递创建时间查询参数");
     ErrorCode IOT_DAILY_REPORT_DEPT_NOT_EXISTS = new ErrorCode(273, "未选择项目部");
     ErrorCode IOT_DEPT_TYPE_NOT_EXISTS = new ErrorCode(274, "部门类型不存在");
+    ErrorCode IOT_CAR_ZHBD_NOT_EXISTS = new ErrorCode(275, "中航北斗车辆表不存在");
+    ErrorCode IOT_DAILY_REPORT_FUEL_NOT_EXISTS = new ErrorCode(276, "日报-油耗不存在");
 }

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

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd;
+
+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.iotcarzhbd.vo.IotCarZhbdPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
+import cn.iocoder.yudao.module.pms.service.iotcarzhbd.IotCarZhbdService;
+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("/pms/iot-car-zhbd")
+@Validated
+public class IotCarZhbdController {
+
+    @Resource
+    private IotCarZhbdService iotCarZhbdService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建中航北斗车辆表")
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:create')")
+    public CommonResult<Long> createIotCarZhbd(@Valid @RequestBody IotCarZhbdSaveReqVO createReqVO) {
+        return success(iotCarZhbdService.createIotCarZhbd(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新中航北斗车辆表")
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:update')")
+    public CommonResult<Boolean> updateIotCarZhbd(@Valid @RequestBody IotCarZhbdSaveReqVO updateReqVO) {
+        iotCarZhbdService.updateIotCarZhbd(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除中航北斗车辆表")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:delete')")
+    public CommonResult<Boolean> deleteIotCarZhbd(@RequestParam("id") Long id) {
+        iotCarZhbdService.deleteIotCarZhbd(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得中航北斗车辆表")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:query')")
+    public CommonResult<IotCarZhbdRespVO> getIotCarZhbd(@RequestParam("id") Long id) {
+        IotCarZhbdDO iotCarZhbd = iotCarZhbdService.getIotCarZhbd(id);
+        return success(BeanUtils.toBean(iotCarZhbd, IotCarZhbdRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得中航北斗车辆表分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:query')")
+    public CommonResult<PageResult<IotCarZhbdRespVO>> getIotCarZhbdPage(@Valid IotCarZhbdPageReqVO pageReqVO) {
+        PageResult<IotCarZhbdDO> pageResult = iotCarZhbdService.getIotCarZhbdPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotCarZhbdRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出中航北斗车辆表 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-car-zhbd:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotCarZhbdExcel(@Valid IotCarZhbdPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotCarZhbdDO> list = iotCarZhbdService.getIotCarZhbdPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "中航北斗车辆表.xls", "数据", IotCarZhbdRespVO.class,
+                        BeanUtils.toBean(list, IotCarZhbdRespVO.class));
+    }
+
+}

+ 48 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/vo/IotCarZhbdPageReqVO.java

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.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 java.util.Collection;
+
+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 IotCarZhbdPageReqVO extends PageParam {
+
+    @Schema(description = "组织id")
+    private String deviceCode;
+
+    @Schema(description = "工单名称", example = "芋艿")
+    private String deviceName;
+
+    @Schema(description = "工单类型", example = "10570")
+    private String carId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "用户名称", example = "芋艿")
+    private String userName;
+
+    @Schema(description = "用户id", example = "26763")
+    private Long userId;
+
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "设备编码 有的编码在设备表中不存在", example = "10570")
+    private Collection<String> deviceCodes;
+
+    @Schema(description = "设备编码 与设备表额外匹配的编码", example = "10570")
+    private Collection<String> customDeviceCodes;
+}

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

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.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 IotCarZhbdRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10183")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "组织id")
+    @ExcelProperty("组织id")
+    private String deviceCode;
+
+    @Schema(description = "工单名称", example = "芋艿")
+    @ExcelProperty("工单名称")
+    private String deviceName;
+
+    @Schema(description = "工单类型", example = "10570")
+    @ExcelProperty("工单类型")
+    private String carId;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "用户名称", example = "芋艿")
+    @ExcelProperty("用户名称")
+    private String userName;
+
+    @Schema(description = "用户id", example = "26763")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+}

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcarzhbd/vo/IotCarZhbdSaveReqVO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 中航北斗车辆表新增/修改 Request VO")
+@Data
+public class IotCarZhbdSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10183")
+    private Long id;
+
+    @Schema(description = "组织id")
+    private String deviceCode;
+
+    @Schema(description = "工单名称", example = "芋艿")
+    private String deviceName;
+
+    @Schema(description = "工单类型", example = "10570")
+    private String carId;
+
+    @Schema(description = "用户名称", example = "芋艿")
+    private String userName;
+
+    @Schema(description = "用户id", example = "26763")
+    private Long userId;
+
+}

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

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel;
+
+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.iotdailyreportfuel.vo.IotDailyReportFuelPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo.IotDailyReportFuelRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo.IotDailyReportFuelSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
+import cn.iocoder.yudao.module.pms.service.iotdailyreportfuel.IotDailyReportFuelService;
+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("/pms/iot-daily-report-fuel")
+@Validated
+public class IotDailyReportFuelController {
+
+    @Resource
+    private IotDailyReportFuelService iotDailyReportFuelService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建日报-油耗")
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:create')")
+    public CommonResult<Long> createIotDailyReportFuel(@Valid @RequestBody IotDailyReportFuelSaveReqVO createReqVO) {
+        return success(iotDailyReportFuelService.createIotDailyReportFuel(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新日报-油耗")
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:update')")
+    public CommonResult<Boolean> updateIotDailyReportFuel(@Valid @RequestBody IotDailyReportFuelSaveReqVO updateReqVO) {
+        iotDailyReportFuelService.updateIotDailyReportFuel(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除日报-油耗")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:delete')")
+    public CommonResult<Boolean> deleteIotDailyReportFuel(@RequestParam("id") Long id) {
+        iotDailyReportFuelService.deleteIotDailyReportFuel(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得日报-油耗")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:query')")
+    public CommonResult<IotDailyReportFuelRespVO> getIotDailyReportFuel(@RequestParam("id") Long id) {
+        IotDailyReportFuelDO iotDailyReportFuel = iotDailyReportFuelService.getIotDailyReportFuel(id);
+        return success(BeanUtils.toBean(iotDailyReportFuel, IotDailyReportFuelRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得日报-油耗分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:query')")
+    public CommonResult<PageResult<IotDailyReportFuelRespVO>> getIotDailyReportFuelPage(@Valid IotDailyReportFuelPageReqVO pageReqVO) {
+        PageResult<IotDailyReportFuelDO> pageResult = iotDailyReportFuelService.getIotDailyReportFuelPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotDailyReportFuelRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出日报-油耗 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-daily-report-fuel:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotDailyReportFuelExcel(@Valid IotDailyReportFuelPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotDailyReportFuelDO> list = iotDailyReportFuelService.getIotDailyReportFuelPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "日报-油耗.xls", "数据", IotDailyReportFuelRespVO.class,
+                        BeanUtils.toBean(list, IotDailyReportFuelRespVO.class));
+    }
+
+}

+ 59 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelPageReqVO.java

@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.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.math.BigDecimal;
+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 IotDailyReportFuelPageReqVO extends PageParam {
+
+    @Schema(description = "瑞恒RH 瑞鹰RY 瑞都RD", example = "1")
+    private String type;
+
+    @Schema(description = "日报id", example = "13065")
+    private Long reportId;
+
+    @Schema(description = "设备(车辆)id", example = "887")
+    private Long deviceId;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "油服设备编码")
+    private String yfDeviceCode;
+
+    @Schema(description = "设备名称", example = "赵六")
+    private String deviceName;
+
+    @Schema(description = "zhbd车辆id", example = "23704")
+    private String carId;
+
+    @Schema(description = "zhdb油耗(L)")
+    private BigDecimal zhbdFuel;
+
+    @Schema(description = "修正后的油耗(L)")
+    private BigDecimal customFuel;
+
+    @Schema(description = "获取油耗时的日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] queryDate;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 68 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelRespVO.java

@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 日报-油耗 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotDailyReportFuelRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23733")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "瑞恒RH 瑞鹰RY 瑞都RD", example = "1")
+    @ExcelProperty("瑞恒RH 瑞鹰RY 瑞都RD")
+    private String type;
+
+    @Schema(description = "日报id", example = "13065")
+    @ExcelProperty("日报id")
+    private Long reportId;
+
+    @Schema(description = "设备(车辆)id", example = "887")
+    @ExcelProperty("设备(车辆)id")
+    private Long deviceId;
+
+    @Schema(description = "设备编码")
+    @ExcelProperty("设备编码")
+    private String deviceCode;
+
+    @Schema(description = "油服设备编码")
+    @ExcelProperty("油服设备编码")
+    private String yfDeviceCode;
+
+    @Schema(description = "设备名称", example = "赵六")
+    @ExcelProperty("设备名称")
+    private String deviceName;
+
+    @Schema(description = "zhbd车辆id", example = "23704")
+    @ExcelProperty("zhbd车辆id")
+    private String carId;
+
+    @Schema(description = "zhdb油耗(L)")
+    @ExcelProperty("zhdb油耗(L)")
+    private BigDecimal zhbdFuel;
+
+    @Schema(description = "修正后的油耗(L)")
+    @ExcelProperty("修正后的油耗(L)")
+    private BigDecimal customFuel;
+
+    @Schema(description = "获取油耗时的日期")
+    @ExcelProperty("获取油耗时的日期")
+    private LocalDateTime queryDate;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 49 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportfuel/vo/IotDailyReportFuelSaveReqVO.java

@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 日报-油耗新增/修改 Request VO")
+@Data
+public class IotDailyReportFuelSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23733")
+    private Long id;
+
+    @Schema(description = "瑞恒RH 瑞鹰RY 瑞都RD", example = "1")
+    private String type;
+
+    @Schema(description = "日报id", example = "13065")
+    private Long reportId;
+
+    @Schema(description = "设备(车辆)id", example = "887")
+    private Long deviceId;
+
+    @Schema(description = "设备编码")
+    private String deviceCode;
+
+    @Schema(description = "油服设备编码")
+    private String yfDeviceCode;
+
+    @Schema(description = "设备名称", example = "赵六")
+    private String deviceName;
+
+    @Schema(description = "zhbd车辆id", example = "23704")
+    private String carId;
+
+    @Schema(description = "zhdb油耗(L)")
+    private BigDecimal zhbdFuel;
+
+    @Schema(description = "修正后的油耗(L)")
+    private BigDecimal customFuel;
+
+    @Schema(description = "获取油耗时的日期")
+    private LocalDateTime queryDate;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+}

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

@@ -11,17 +11,20 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 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.iotdailyreportfuel.vo.IotDailyReportFuelPageReqVO;
 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.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.*;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportStatisticsVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
 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.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
+import cn.iocoder.yudao.module.pms.service.iotdailyreportfuel.IotDailyReportFuelService;
 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.iotrddailyreport.IotRdDailyReportService;
@@ -72,6 +75,8 @@ public class IotRhDailyReportController {
     @Resource
     private IotRyDailyReportService iotRyDailyReportService;
     @Resource
+    private IotDailyReportFuelService iotDailyReportFuelService;
+    @Resource
     private DictDataService dictDataService;
 
     @PostMapping("/create")
@@ -108,6 +113,12 @@ public class IotRhDailyReportController {
         BigDecimal capacity = iotRhDailyReportService.queryCapacity(iotRhDailyReport.getDeptId());
         IotRhDailyReportRespVO result = BeanUtils.toBean(iotRhDailyReport, IotRhDailyReportRespVO.class);
         result.setCapacity(capacity);
+        // 查询日报关联油耗记录
+        IotDailyReportFuelPageReqVO reqVO = new IotDailyReportFuelPageReqVO();
+        reqVO.setReportId(result.getId());
+        reqVO.setType("RH");
+        List<IotDailyReportFuelDO> reportFuels = iotDailyReportFuelService.getIotDailyReportFuels(reqVO);
+        result.setReportFuels(reportFuels);
         return success(result);
     }
 
@@ -348,6 +359,7 @@ public class IotRhDailyReportController {
                 BigDecimal dailyGasInjection = report.getDailyGasInjection();
                 BigDecimal dailyWaterInjection = report.getDailyWaterInjection();
                 BigDecimal powerConsumption = report.getDailyPowerUsage();
+                BigDecimal oilConsumption = report.getDailyOilUsage();
                 if (ObjUtil.isNotEmpty(dailyGasInjection)) {
                     totalGasInjection = totalGasInjection.add(dailyGasInjection);
                 }
@@ -357,7 +369,9 @@ public class IotRhDailyReportController {
                 if (ObjUtil.isNotEmpty(powerConsumption)) {
                     totalPowerConsumption = totalPowerConsumption.add(powerConsumption);
                 }
-
+                if (ObjUtil.isNotEmpty(oilConsumption)) {
+                    totalFuelConsumption = totalFuelConsumption.add(oilConsumption);
+                }
             }
             // 汇总 指定搜索时间段内的 累计注气量 累计注水量 累计用电量 累计油耗
             result.put("totalGasInjection", totalGasInjection);

+ 13 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotZHBDController.java

@@ -25,8 +25,6 @@ import okhttp3.Response;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.*;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -79,7 +77,7 @@ public class IotZHBDController {
 
     @GetMapping("/getOil")
     @Operation(summary = "获得车辆油耗")
-    public CommonResult<String> getIotRhDailyReport() {
+    public CommonResult<Map<Integer, Double>> getIotRhDailyReport() {
         String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
         if (StrUtil.isBlank(zhbdtoken)) {
             Map<String, String> map = new HashMap<>();
@@ -95,26 +93,34 @@ public class IotZHBDController {
         // 构建请求JSON
         Map<String, Object> requestMap = new HashMap<>();
         requestMap.put("client_ids", ID);
-        requestMap.put("vehicle_ids", "2109");
+        requestMap.put("vehicle_ids", "2109,14777");
         requestMap.put("begin_time", "2025-11-15 8:00:00");
         requestMap.put("end_time", "2025-11-30 8:00:00");
         requestMap.put("page_num", 1);
         requestMap.put("page_size", 10);
+        // key车辆carId   value油耗值
+        Map<Integer, Double> carOilFuelPair = new HashMap<>();
         if (StrUtil.isNotBlank(zhbdtoken)) {
             try {
                 String jsonResponse = sendPostRequest(requestMap, zhbdtoken);
                 ApiOilResponse response = parseResponse(jsonResponse);
                 if (response != null && response.code == 200) {
-                    List<Map<String,Object>> details = response.data.pageList;
-                    for (Map<String,Object> detail : details) {
+                    List<Map<String, Object>> details = response.data.pageList;
+                    // 组装某辆车 某天的油耗
+
+                    for (Map<String, Object> detail : details) {
                         System.out.println("当前油耗:" + (detail.get("oil")));
+                        Integer carId = Integer.valueOf(detail.get("vehicle_id").toString());
+                        Double oil = Double.valueOf(detail.get("oil").toString());
+                        String vehicleName = String.valueOf(detail.get("vehicle_name"));
+                        carOilFuelPair.put(carId, oil);
                     }
                 }
             } catch (Exception e) {
                 log.info("获取油耗数据失败!");
             }
         }
-        return success(StrUtil.EMPTY);
+        return success(carOilFuelPair);
     }
 
     private String getLoginToken(String id, String secret) {

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo;
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -7,6 +8,7 @@ import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Schema(description = "管理后台 - 瑞恒日报 Response VO")
 @Data
@@ -83,6 +85,10 @@ public class IotRhDailyReportRespVO {
     @ExcelProperty("当日用电量(kWh)")
     private BigDecimal dailyPowerUsage;
 
+    @Schema(description = "当日油耗(L)")
+    @ExcelProperty("当日油耗(L)")
+    private BigDecimal dailyOilUsage;
+
     @Schema(description = "非生产时间(H)")
     @ExcelProperty("非生产时间(H)")
     private BigDecimal nonProductionTime;
@@ -151,4 +157,9 @@ public class IotRhDailyReportRespVO {
     @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "1")
     private Integer auditStatus;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "日报关联的油耗记录")
+    private List<IotDailyReportFuelDO> reportFuels;
 }

+ 50 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcarzhbd/IotCarZhbdDO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd;
+
+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("rq_iot_car_zhbd")
+@KeySequence("rq_iot_car_zhbd_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotCarZhbdDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 组织id
+     */
+    private String deviceCode;
+    /**
+     * 工单名称
+     */
+    private String deviceName;
+    /**
+     * 工单类型
+     */
+    private String carId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+}

+ 77 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotdailyreportfuel/IotDailyReportFuelDO.java

@@ -0,0 +1,77 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel;
+
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 日报-油耗 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_daily_report_fuel")
+@KeySequence("rq_iot_daily_report_fuel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotDailyReportFuelDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 瑞恒RH 瑞鹰RY 瑞都RD
+     */
+    private String type;
+    /**
+     * 日报id
+     */
+    private Long reportId;
+    /**
+     * 设备(车辆)id
+     */
+    private Long deviceId;
+    /**
+     * 设备编码
+     */
+    private String deviceCode;
+    /**
+     * 油服设备编码
+     */
+    private String yfDeviceCode;
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+    /**
+     * zhbd车辆id
+     */
+    private String carId;
+    /**
+     * zhdb油耗(L)
+     */
+    private BigDecimal zhbdFuel;
+    /**
+     * 修正后的油耗(L)
+     */
+    private BigDecimal customFuel;
+    /**
+     * 获取油耗时的日期
+     */
+    private LocalDateTime queryDate;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrhdailyreport/IotRhDailyReportDO.java

@@ -73,6 +73,10 @@ public class IotRhDailyReportDO extends BaseDO {
      * 当日用电量(kWh)
      */
     private BigDecimal dailyPowerUsage;
+    /**
+     * 当日油耗(L)
+     */
+    private BigDecimal dailyOilUsage;
     /**
      * 非生产时间(H)
      */

+ 43 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcarzhbd/IotCarZhbdMapper.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotcarzhbd;
+
+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.iotcarzhbd.vo.IotCarZhbdPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 中航北斗车辆表 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotCarZhbdMapper extends BaseMapperX<IotCarZhbdDO> {
+
+    default PageResult<IotCarZhbdDO> selectPage(IotCarZhbdPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotCarZhbdDO>()
+                .eqIfPresent(IotCarZhbdDO::getDeviceCode, reqVO.getDeviceCode())
+                .likeIfPresent(IotCarZhbdDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotCarZhbdDO::getCarId, reqVO.getCarId())
+                .betweenIfPresent(IotCarZhbdDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(IotCarZhbdDO::getUserName, reqVO.getUserName())
+                .eqIfPresent(IotCarZhbdDO::getUserId, reqVO.getUserId())
+                .orderByDesc(IotCarZhbdDO::getId));
+    }
+
+    default List<IotCarZhbdDO> selectList(IotCarZhbdPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotCarZhbdDO>()
+                .eqIfPresent(IotCarZhbdDO::getDeviceCode, reqVO.getDeviceCode())
+                .likeIfPresent(IotCarZhbdDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotCarZhbdDO::getCarId, reqVO.getCarId())
+                .betweenIfPresent(IotCarZhbdDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(IotCarZhbdDO::getUserName, reqVO.getUserName())
+                .inIfPresent(IotCarZhbdDO::getUserName, reqVO.getCustomDeviceCodes())
+                .eqIfPresent(IotCarZhbdDO::getUserId, reqVO.getUserId())
+                .orderByDesc(IotCarZhbdDO::getId));
+    }
+
+}

+ 54 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdailyreportfuel/IotDailyReportFuelMapper.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotdailyreportfuel;
+
+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.iotdailyreportfuel.vo.IotDailyReportFuelPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 日报-油耗 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotDailyReportFuelMapper extends BaseMapperX<IotDailyReportFuelDO> {
+
+    default PageResult<IotDailyReportFuelDO> selectPage(IotDailyReportFuelPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotDailyReportFuelDO>()
+                .eqIfPresent(IotDailyReportFuelDO::getType, reqVO.getType())
+                .eqIfPresent(IotDailyReportFuelDO::getReportId, reqVO.getReportId())
+                .eqIfPresent(IotDailyReportFuelDO::getDeviceId, reqVO.getDeviceId())
+                .eqIfPresent(IotDailyReportFuelDO::getDeviceCode, reqVO.getDeviceCode())
+                .eqIfPresent(IotDailyReportFuelDO::getYfDeviceCode, reqVO.getYfDeviceCode())
+                .likeIfPresent(IotDailyReportFuelDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotDailyReportFuelDO::getCarId, reqVO.getCarId())
+                .eqIfPresent(IotDailyReportFuelDO::getZhbdFuel, reqVO.getZhbdFuel())
+                .eqIfPresent(IotDailyReportFuelDO::getCustomFuel, reqVO.getCustomFuel())
+                .betweenIfPresent(IotDailyReportFuelDO::getQueryDate, reqVO.getQueryDate())
+                .eqIfPresent(IotDailyReportFuelDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotDailyReportFuelDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotDailyReportFuelDO::getId));
+    }
+
+    default List<IotDailyReportFuelDO> selectList(IotDailyReportFuelPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotDailyReportFuelDO>()
+                .eqIfPresent(IotDailyReportFuelDO::getType, reqVO.getType())
+                .eqIfPresent(IotDailyReportFuelDO::getReportId, reqVO.getReportId())
+                .eqIfPresent(IotDailyReportFuelDO::getDeviceId, reqVO.getDeviceId())
+                .eqIfPresent(IotDailyReportFuelDO::getDeviceCode, reqVO.getDeviceCode())
+                .eqIfPresent(IotDailyReportFuelDO::getYfDeviceCode, reqVO.getYfDeviceCode())
+                .likeIfPresent(IotDailyReportFuelDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotDailyReportFuelDO::getCarId, reqVO.getCarId())
+                .eqIfPresent(IotDailyReportFuelDO::getZhbdFuel, reqVO.getZhbdFuel())
+                .eqIfPresent(IotDailyReportFuelDO::getCustomFuel, reqVO.getCustomFuel())
+                .betweenIfPresent(IotDailyReportFuelDO::getQueryDate, reqVO.getQueryDate())
+                .eqIfPresent(IotDailyReportFuelDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotDailyReportFuelDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotDailyReportFuelDO::getId));
+    }
+
+}

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotDeviceCarFuelVO.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.pms.job;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - zhbd 车辆-油耗 VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotDeviceCarFuelVO {
+
+    @Schema(description = "油耗", example = "10.37 (L)")
+    private Double oil;
+
+    @Schema(description = "行驶里程", example = "43.39km")
+    private Double distance;
+
+    @Schema(description = "百公里油耗", example = "23.9 (L)")
+    private String oilkilmeter;
+
+    @Schema(description = "时间", example = "2025-11-26")
+    private String createtime;
+
+    @Schema(description = "车辆id", example = "8203")
+    private Integer vehicleId;
+
+    @Schema(description = "客户名称", example = "威远")
+    private String clientName;
+
+    @Schema(description = "车牌号", example = "鲁E99659底盘")
+    private String vehicleName;
+
+}

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/httpEntity/ResponseOilData.java

@@ -12,5 +12,5 @@ import java.util.Map;
  */
 public class ResponseOilData {
     public List<Map<String,Object>> pageList;
-    public long time;
+    public long total;
 }

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

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotcarzhbd;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
+
+import javax.validation.Valid;
+
+/**
+ * 中航北斗车辆表 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotCarZhbdService {
+
+    /**
+     * 创建中航北斗车辆表
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotCarZhbd(@Valid IotCarZhbdSaveReqVO createReqVO);
+
+    /**
+     * 更新中航北斗车辆表
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotCarZhbd(@Valid IotCarZhbdSaveReqVO updateReqVO);
+
+    /**
+     * 删除中航北斗车辆表
+     *
+     * @param id 编号
+     */
+    void deleteIotCarZhbd(Long id);
+
+    /**
+     * 获得中航北斗车辆表
+     *
+     * @param id 编号
+     * @return 中航北斗车辆表
+     */
+    IotCarZhbdDO getIotCarZhbd(Long id);
+
+    /**
+     * 获得中航北斗车辆表分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 中航北斗车辆表分页
+     */
+    PageResult<IotCarZhbdDO> getIotCarZhbdPage(IotCarZhbdPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotcarzhbd;
+
+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.iotcarzhbd.vo.IotCarZhbdPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotcarzhbd.IotCarZhbdMapper;
+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_CAR_ZHBD_NOT_EXISTS;
+
+/**
+ * 中航北斗车辆表 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotCarZhbdServiceImpl implements IotCarZhbdService {
+
+    @Resource
+    private IotCarZhbdMapper iotCarZhbdMapper;
+
+    @Override
+    public Long createIotCarZhbd(IotCarZhbdSaveReqVO createReqVO) {
+        // 插入
+        IotCarZhbdDO iotCarZhbd = BeanUtils.toBean(createReqVO, IotCarZhbdDO.class);
+        iotCarZhbdMapper.insert(iotCarZhbd);
+        // 返回
+        return iotCarZhbd.getId();
+    }
+
+    @Override
+    public void updateIotCarZhbd(IotCarZhbdSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotCarZhbdExists(updateReqVO.getId());
+        // 更新
+        IotCarZhbdDO updateObj = BeanUtils.toBean(updateReqVO, IotCarZhbdDO.class);
+        iotCarZhbdMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotCarZhbd(Long id) {
+        // 校验存在
+        validateIotCarZhbdExists(id);
+        // 删除
+        iotCarZhbdMapper.deleteById(id);
+    }
+
+    private void validateIotCarZhbdExists(Long id) {
+        if (iotCarZhbdMapper.selectById(id) == null) {
+            throw exception(IOT_CAR_ZHBD_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotCarZhbdDO getIotCarZhbd(Long id) {
+        return iotCarZhbdMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotCarZhbdDO> getIotCarZhbdPage(IotCarZhbdPageReqVO pageReqVO) {
+        return iotCarZhbdMapper.selectPage(pageReqVO);
+    }
+
+}

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

@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.pms.service.iotdailyreportfuel;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo.IotDailyReportFuelPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo.IotDailyReportFuelSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 日报-油耗 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotDailyReportFuelService {
+
+    /**
+     * 创建日报-油耗
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotDailyReportFuel(@Valid IotDailyReportFuelSaveReqVO createReqVO);
+
+    /**
+     * 更新日报-油耗
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotDailyReportFuel(@Valid IotDailyReportFuelSaveReqVO updateReqVO);
+
+    /**
+     * 删除日报-油耗
+     *
+     * @param id 编号
+     */
+    void deleteIotDailyReportFuel(Long id);
+
+    /**
+     * 获得日报-油耗
+     *
+     * @param id 编号
+     * @return 日报-油耗
+     */
+    IotDailyReportFuelDO getIotDailyReportFuel(Long id);
+
+    /**
+     * 获得日报-油耗分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 日报-油耗分页
+     */
+    PageResult<IotDailyReportFuelDO> getIotDailyReportFuelPage(IotDailyReportFuelPageReqVO pageReqVO);
+
+    /**
+     * 获得日报-油耗列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 日报-油耗列表
+     */
+    List<IotDailyReportFuelDO> getIotDailyReportFuels(IotDailyReportFuelPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.pms.service.iotdailyreportfuel;
+
+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.iotdailyreportfuel.vo.IotDailyReportFuelPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportfuel.vo.IotDailyReportFuelSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdailyreportfuel.IotDailyReportFuelMapper;
+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_DAILY_REPORT_FUEL_NOT_EXISTS;
+
+/**
+ * 日报-油耗 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotDailyReportFuelServiceImpl implements IotDailyReportFuelService {
+
+    @Resource
+    private IotDailyReportFuelMapper iotDailyReportFuelMapper;
+
+    @Override
+    public Long createIotDailyReportFuel(IotDailyReportFuelSaveReqVO createReqVO) {
+        // 插入
+        IotDailyReportFuelDO iotDailyReportFuel = BeanUtils.toBean(createReqVO, IotDailyReportFuelDO.class);
+        iotDailyReportFuelMapper.insert(iotDailyReportFuel);
+        // 返回
+        return iotDailyReportFuel.getId();
+    }
+
+    @Override
+    public void updateIotDailyReportFuel(IotDailyReportFuelSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotDailyReportFuelExists(updateReqVO.getId());
+        // 更新
+        IotDailyReportFuelDO updateObj = BeanUtils.toBean(updateReqVO, IotDailyReportFuelDO.class);
+        iotDailyReportFuelMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotDailyReportFuel(Long id) {
+        // 校验存在
+        validateIotDailyReportFuelExists(id);
+        // 删除
+        iotDailyReportFuelMapper.deleteById(id);
+    }
+
+    private void validateIotDailyReportFuelExists(Long id) {
+        if (iotDailyReportFuelMapper.selectById(id) == null) {
+            throw exception(IOT_DAILY_REPORT_FUEL_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotDailyReportFuelDO getIotDailyReportFuel(Long id) {
+        return iotDailyReportFuelMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotDailyReportFuelDO> getIotDailyReportFuelPage(IotDailyReportFuelPageReqVO pageReqVO) {
+        return iotDailyReportFuelMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<IotDailyReportFuelDO> getIotDailyReportFuels(IotDailyReportFuelPageReqVO pageReqVO) {
+        return iotDailyReportFuelMapper.selectList(pageReqVO);
+    }
+
+}

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

@@ -8,30 +8,37 @@ import cn.hutool.core.util.StrUtil;
 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.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdPageReqVO;
 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.*;
 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.iotcarzhbd.IotCarZhbdDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 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.iotcarzhbd.IotCarZhbdMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdailyreportfuel.IotDailyReportFuelMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicerunlog.IotDeviceRunLogMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 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.pms.enums.common.FailureAuditStatusEnum;
+import cn.iocoder.yudao.module.pms.job.IotDeviceCarFuelVO;
+import cn.iocoder.yudao.module.pms.util.ZHBDUtil;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
-import cn.iocoder.yudao.module.system.service.dict.DictDataService;
 import cn.iocoder.yudao.module.system.service.dict.DictTypeService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import lombok.extern.log4j.Log4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -43,6 +50,7 @@ import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -58,6 +66,7 @@ import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.*;
  */
 @Service
 @Validated
+@Log4j
 public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
 
     @Resource
@@ -67,7 +76,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
     @Resource
     private IotDeviceMapper iotDeviceMapper;
     @Resource
-    private DictDataService dictDataService;
+    private ZHBDUtil zhbdUtil;
     @Resource
     private DictTypeService dictTypeService;
     @Resource
@@ -76,6 +85,11 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
     private IotDeviceRunLogMapper iotDeviceRunLogMapper;
     @Resource
     private DeptService deptService;
+    @Resource
+    private IotCarZhbdMapper iotCarZhbdMapper;
+
+    @Resource
+    private IotDailyReportFuelMapper iotDailyReportFuelMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -97,6 +111,12 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         reqVO.setDeptId(createReqVO.getDeptId());
         // 查询包含当前日报施工队伍的任务
         List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(reqVO);
+        // 日报对应的任务中的设备列表
+        Set<String> carDeviceCodes = new HashSet<>();
+        // 生成 carId 与 IotDeviceDO 的对应关系Map
+        Map<String, IotDeviceDO> carIdDevicePair = new HashMap<>();
+        // 中航北斗车辆id集合
+        Set<String> zhbdCarIds = new HashSet<>();
         if (CollUtil.isNotEmpty(tasks)) {
             IotProjectTaskDO task = tasks.get(0);
             // 暂时只考虑1个施工队伍只属于1个任务
@@ -111,6 +131,52 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             }
             // 查询任务的设备列表
             deviceIds = task.getDeviceIds();
+            IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
+            deviceReqVO.setDeviceIds(new ArrayList<>(deviceIds));
+            List<IotDeviceDO> carDevices = iotDeviceMapper.selectListAlone(deviceReqVO);
+            // key设备编码   value设备对象
+            Map<String, IotDeviceDO> devicePair = new HashMap<>();
+            // key中航北斗carId   value设备编码
+            Map<String, String> carIdDeviceCodePair = new HashMap<>();
+
+            if (CollUtil.isNotEmpty(carDevices)) {
+                carDevices.forEach(device -> {
+                    carDeviceCodes.add(device.getDeviceCode());
+                    if (ObjUtil.isNotEmpty(device.getCarId())) {
+                        zhbdCarIds.add(String.valueOf(device.getCarId()));
+                        carIdDeviceCodePair.put(String.valueOf(device.getCarId()), device.getDeviceCode());
+                    }
+                    devicePair.put(device.getDeviceCode(), device);
+                });
+                // 查询中航北斗表中的设备车辆
+                IotCarZhbdPageReqVO customDeviceReqVO = new IotCarZhbdPageReqVO();
+                // 设备表中存在的设备编码
+                customDeviceReqVO.setCustomDeviceCodes(carDeviceCodes);
+                List<IotCarZhbdDO> deviceCars = iotCarZhbdMapper.selectList(customDeviceReqVO);
+                if (CollUtil.isNotEmpty(deviceCars)) {
+                    deviceCars.forEach(car -> {
+                        zhbdCarIds.add(car.getCarId());
+                        carIdDeviceCodePair.put(car.getCarId(), car.getDeviceCode());
+                    });
+                }
+                // 额外匹配的 RA 与 设备表对应的编码
+                customDeviceReqVO.setCustomDeviceCodes(null);
+                customDeviceReqVO.setDeviceCodes(carDeviceCodes);
+                List<IotCarZhbdDO> raCars = iotCarZhbdMapper.selectList(customDeviceReqVO);
+                if (CollUtil.isNotEmpty(raCars)) {
+                    raCars.forEach(car -> {
+                        zhbdCarIds.add(car.getCarId());
+                        carIdDeviceCodePair.put(car.getCarId(), car.getUserName());
+                    });
+                }
+                // 生成 carId 与 IotDeviceDO 的对应关系Map
+                carIdDevicePair = carIdDeviceCodePair.entrySet().stream()
+                        .filter(entry -> devicePair.containsKey(entry.getValue()))
+                        .collect(Collectors.toMap(
+                                Map.Entry::getKey,
+                                entry -> devicePair.get(entry.getValue())
+                        ));
+            }
         } else {
             // 当前队伍没有关联任务 不生成日报
             // throw exception(IOT_PROJECT_TASK_NOT_RELATED);
@@ -147,66 +213,85 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             iotRhDailyReport.setTransitTime(createReqVO.getDailyGasInjection().divide(capacity, 4, 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("constructionStatus");
-                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());
-                });
-                iotDeviceMapper.updateBatch(devices);
-            }
-        } */
-
         // 当天如果已经有此小队的记录 新增 当天如果没有此小队的日报记录 修改
         // deptId - taskId - createTime(yyyy-MM-dd) 确定唯一一条记录 不能使用 LocalDateTime.now() 来查询,应该使用 运行记录工单的创建日期查询
         IotRhDailyReportDO existReport = iotRhDailyReportMapper.selectExistReport(createReqVO.getDeptId(), null, reportDate);
+        // 查询日报相关的任务关联的设备油耗
+        // 获得昨天的日期
+        String yesterdayDateStr = StrUtil.EMPTY;
+        LocalDateTime yesterday = reportDate.minusDays(1);
+        yesterdayDateStr = LocalDateTimeUtil.format(yesterday, DatePattern.NORM_DATE_PATTERN);
         if (ObjUtil.isEmpty(existReport)) {
             // 今天下午4点
             LocalDateTime today4pm = reportDate.withHour(16).withMinute(0).withSecond(0).withNano(0);
             // 昨天下午4点
             LocalDateTime yesterday4pm = today4pm.minusDays(1);
+
             iotRhDailyReport.setConstructionStartDate(yesterday4pm);
             iotRhDailyReport.setConstructionEndDate(today4pm);
             iotRhDailyReport.setCreateTime(reportDate);
             iotRhDailyReport.setUpdateTime(reportDate);
             iotRhDailyReportMapper.insert(iotRhDailyReport);
+            BigDecimal totalOilUsage = BigDecimal.ZERO;
+            // 生成日报时 查询当前日报关联的任务中的车辆 查询中航北斗指定日报区间范围内的油耗数据 子表 主表
+            List<IotDailyReportFuelDO> reportFuels = new ArrayList<>();
+            if (CollUtil.isNotEmpty(zhbdCarIds)) {
+                if (StrUtil.isNotBlank(yesterdayDateStr)) {
+                    try {
+                        Map<Integer, IotDeviceCarFuelVO> carFuels = zhbdUtil.carFuels(StrUtil.join(",", zhbdCarIds),
+                                StrUtil.join(" ", yesterdayDateStr, "00:00:00"), StrUtil.join(" ", yesterdayDateStr, "23:59:59"));
+                        System.out.println("请求参数:" + zhbdCarIds.size() + " -开始时间: "
+                                + StrUtil.join(" ", yesterdayDateStr, "00:00:00") + " -开始时间: "
+                                + StrUtil.join(" ", yesterdayDateStr, "23:59:59"));
+                        if (CollUtil.isNotEmpty(carFuels)) {
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                            Map<String, IotDeviceDO> finalCarIdDevicePair = carIdDevicePair;
+                            for (Map.Entry<Integer, IotDeviceCarFuelVO> carFuelEntry : carFuels.entrySet()) {
+                                Integer carId = carFuelEntry.getKey();
+                                IotDeviceCarFuelVO carFuel = carFuelEntry.getValue();
+                                // carId中航北斗车辆id   value车辆油耗
+                                IotDailyReportFuelDO reportFuel = new IotDailyReportFuelDO();
+                                reportFuel.setType("RH");
+                                reportFuel.setReportId(iotRhDailyReport.getId());
+                                reportFuel.setCarId(String.valueOf(carId));
+                                // 使用 carIdDeviceMap 获取对应的设备对象并设置deviceId
+                                IotDeviceDO device = finalCarIdDevicePair.get(String.valueOf(carId));
+                                reportFuel.setDeviceId(device.getId());
+                                reportFuel.setDeviceCode(device.getDeviceCode());
+                                reportFuel.setDeviceName(device.getDeviceName());
+                                BigDecimal tempOil = new BigDecimal(carFuel.getOil());
+                                totalOilUsage = totalOilUsage.add(tempOil);
+                                reportFuel.setZhbdFuel(tempOil);
+                                // 将字符串转换为LocalDateTime
+                                try {
+                                    LocalDateTime queryDate = LocalDate.parse(carFuel.getCreatetime(), formatter).atStartOfDay();;
+                                    reportFuel.setQueryDate(queryDate);
+                                } catch (DateTimeParseException e) {
+                                    log.error("瑞恒日报-中航北斗油耗-日期格式解析失败: {}", e);
+                                    // 根据业务需求设置默认值或抛出异常
+                                    reportFuel.setQueryDate(null);
+                                }
+                                reportFuels.add(reportFuel);
+                            }
+                        }
+                    } catch (Exception e) {
+                        log.info("获取油耗数据失败!");
+                    }
+                    if (CollUtil.isNotEmpty(reportFuels)) {
+                        // 生成瑞恒日报时 同步新增日报关联的任务车辆油耗
+                        iotDailyReportFuelMapper.insertBatch(reportFuels);
+                    }
+                }
+            }
+            // 先插入记录再更新 因为需要获取日报id
+            iotRhDailyReport.setDailyOilUsage(totalOilUsage);
+            // 根据日报关联任务车辆油耗 计算总油耗 后保存日报
+            iotRhDailyReportMapper.updateById(iotRhDailyReport);
         } else {
             // 修改现有记录
             iotRhDailyReport.setId(existReport.getId());
             iotRhDailyReportMapper.updateById(iotRhDailyReport);
         }
-        // 返回
         return iotRhDailyReport.getId();
     }
 
@@ -499,6 +584,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         Map<Long, BigDecimal> cumulativeWaterInjectionPair = new HashMap<>();
         // key队伍id/项目部id   value累计用电
         Map<Long, BigDecimal> cumulativePowerConsumptionPair = new HashMap<>();
+        // key队伍id/项目部id   value累计油耗
+        Map<Long, BigDecimal> cumulativeOilConsumptionPair = new HashMap<>();
         // key队伍id/项目部id   value对应项目部的总产能
         Map<Long, BigDecimal> cumulativeCapacityPair = new HashMap<>();
         // key队伍id/项目部id   value累计运行时效   累计注气量/累计产能
@@ -537,6 +624,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                         cumulativeWaterInjectionPair.merge(projectDeptId, report.getDailyWaterInjection(), BigDecimal::add);
                         // 累计用电量
                         cumulativePowerConsumptionPair.merge(projectDeptId, report.getDailyPowerUsage(), BigDecimal::add);
+                        // 累计油耗
+                        cumulativeOilConsumptionPair.merge(projectDeptId, report.getDailyOilUsage(), BigDecimal::add);
                         if (teamCapacityPair.containsKey(report.getDeptId())) {
                             BigDecimal tempCapacity = teamCapacityPair.get(report.getDeptId());
                             cumulativeCapacityPair.merge(projectDeptId, tempCapacity, BigDecimal::add);
@@ -571,6 +660,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             statistics.setCumulativeGasInjection(cumulativeGasInjectionPair.get(deptId));
             statistics.setCumulativeWaterInjection(cumulativeWaterInjectionPair.get(deptId));
             statistics.setCumulativePowerConsumption(cumulativePowerConsumptionPair.get(deptId));
+            statistics.setCumulativeFuelConsumption(cumulativeOilConsumptionPair.get(deptId));
             statistics.setTransitTime(cumulativeTransitTimePair.get(deptId));
             result.add(statistics);
         });
@@ -641,7 +731,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 dateWaterInjectionPair.merge(reportDateStr, report.getDailyWaterInjection(), BigDecimal::add);
                 // 累计用电量
                 datePowerConsumptionPair.merge(reportDateStr, report.getDailyPowerUsage(), BigDecimal::add);
-                // todo 累计油耗
+                // 累计油耗
+                dateFuelConsumptionPair.merge(reportDateStr, report.getDailyOilUsage(), BigDecimal::add);
                 // 累计产能
                 if (teamCapacityPair.containsKey(report.getDeptId())) {
                     BigDecimal tempCapacity = teamCapacityPair.get(report.getDeptId());
@@ -686,6 +777,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 statistics.setCumulativeGasInjection(dateGasInjectionPair.get(date));
                 statistics.setCumulativeWaterInjection(dateWaterInjectionPair.get(date));
                 statistics.setCumulativePowerConsumption(datePowerConsumptionPair.get(date));
+                statistics.setCumulativeFuelConsumption(dateFuelConsumptionPair.get(date));
                 statistics.setTransitTime(dateTransitTimePair.get(date));
                 result.add(statistics);
             });
@@ -716,6 +808,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         Map<Long, BigDecimal> cumulativeWaterInjectionPair = new HashMap<>();
         // key队伍id   value累计用电
         Map<Long, BigDecimal> cumulativePowerConsumptionPair = new HashMap<>();
+        // key队伍id   value累计油耗
+        Map<Long, BigDecimal> cumulativeOilConsumptionPair = new HashMap<>();
         // key队伍id/项目部id   value对应项目部的总产能
         Map<Long, BigDecimal> cumulativeCapacityPair = new HashMap<>();
         // key队伍id/项目部id   value累计运行时效   累计注气量/累计产能
@@ -753,6 +847,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                     cumulativeWaterInjectionPair.merge(report.getDeptId(), report.getDailyWaterInjection(), BigDecimal::add);
                     // 累计用电量
                     cumulativePowerConsumptionPair.merge(report.getDeptId(), report.getDailyPowerUsage(), BigDecimal::add);
+                    // 累计油耗
+                    cumulativeOilConsumptionPair.merge(report.getDeptId(), report.getDailyOilUsage(), BigDecimal::add);
                     if (teamCapacityPair.containsKey(report.getDeptId())) {
                         BigDecimal tempCapacity = teamCapacityPair.get(report.getDeptId());
                         cumulativeCapacityPair.merge(report.getDeptId(), tempCapacity, BigDecimal::add);
@@ -784,6 +880,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             statistics.setCumulativeGasInjection(cumulativeGasInjectionPair.get(teamDeptId));
             statistics.setCumulativeWaterInjection(cumulativeWaterInjectionPair.get(teamDeptId));
             statistics.setCumulativePowerConsumption(cumulativePowerConsumptionPair.get(teamDeptId));
+            statistics.setCumulativeFuelConsumption(cumulativeOilConsumptionPair.get(teamDeptId));
             statistics.setTransitTime(cumulativeTransitTimePair.get(teamDeptId));
             result.add(statistics);
         });
@@ -808,17 +905,6 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         // key部门id   value部门parentId
         Map<Long, Long> teamProjectIdPair = new HashMap<>();
 
-        // key队伍id   value累计注气量
-        Map<Long, BigDecimal> cumulativeGasInjectionPair = new HashMap<>();
-        // key队伍id   value累计注水量
-        Map<Long, BigDecimal> cumulativeWaterInjectionPair = new HashMap<>();
-        // key队伍id   value累计用电
-        Map<Long, BigDecimal> cumulativePowerConsumptionPair = new HashMap<>();
-        // key队伍id/项目部id   value对应项目部的总产能
-        Map<Long, BigDecimal> cumulativeCapacityPair = new HashMap<>();
-        // key队伍id/项目部id   value累计运行时效   累计注气量/累计产能
-        Map<Long, BigDecimal> cumulativeTransitTimePair = new HashMap<>();
-
         // 按照日期维度统计各工作量数据
         // key日期yyyy-MM-dd   value累计注气量
         Map<String, BigDecimal> dateGasInjectionPair = new HashMap<>();
@@ -868,25 +954,13 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 dateWaterInjectionPair.merge(reportDateStr, report.getDailyWaterInjection(), BigDecimal::add);
                 // 累计用电量
                 datePowerConsumptionPair.merge(reportDateStr, report.getDailyPowerUsage(), BigDecimal::add);
-                // todo 累计油耗
+                // 累计油耗
+                dateFuelConsumptionPair.merge(reportDateStr, report.getDailyOilUsage(), BigDecimal::add);
                 // 累计产能
                 if (teamCapacityPair.containsKey(report.getDeptId())) {
                     BigDecimal tempCapacity = teamCapacityPair.get(report.getDeptId());
                     dateCapacityPair.merge(reportDateStr, tempCapacity, BigDecimal::add);
                 }
-
-                if (ObjUtil.isNotEmpty(report.getDeptId())) {
-                    // 累计注气量
-                    cumulativeGasInjectionPair.merge(report.getDeptId(), report.getDailyGasInjection(), BigDecimal::add);
-                    // 累计注水量
-                    cumulativeWaterInjectionPair.merge(report.getDeptId(), report.getDailyWaterInjection(), BigDecimal::add);
-                    // 累计用电量
-                    cumulativePowerConsumptionPair.merge(report.getDeptId(), report.getDailyPowerUsage(), BigDecimal::add);
-                    if (teamCapacityPair.containsKey(report.getDeptId())) {
-                        BigDecimal tempCapacity = teamCapacityPair.get(report.getDeptId());
-                        cumulativeCapacityPair.merge(report.getDeptId(), tempCapacity, BigDecimal::add);
-                    }
-                }
             });
             // 根据 累计注气量 累计产能 计算指定队伍下的平均产能
             if (CollUtil.isNotEmpty(dateGasInjectionPair) && CollUtil.isNotEmpty(dateCapacityPair)) {
@@ -923,6 +997,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 statistics.setCumulativeGasInjection(dateGasInjectionPair.get(date));
                 statistics.setCumulativeWaterInjection(dateWaterInjectionPair.get(date));
                 statistics.setCumulativePowerConsumption(datePowerConsumptionPair.get(date));
+                statistics.setCumulativeFuelConsumption(dateFuelConsumptionPair.get(date));
                 statistics.setTransitTime(dateTransitTimePair.get(date));
                 result.add(statistics);
             });

+ 134 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/ZHBDUtil.java

@@ -0,0 +1,134 @@
+package cn.iocoder.yudao.module.pms.util;
+
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.pms.job.IotDeviceCarFuelVO;
+import cn.iocoder.yudao.module.pms.job.httpEntity.ApiOilResponse;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.log4j.Log4j;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author suiyy
+ * @date 20230602
+ * @desc 钉钉API接口工具类
+ */
+@Service
+@Log4j
+public class ZHBDUtil {
+    private static final Logger logger = LoggerFactory.getLogger(ZHBDUtil.class);
+
+    private static final String ID = "NjI1LjUyNS42ODg";
+    private static final String SECRET = "3897865b70d7bf29fcca5029147f7d0a";
+    private static final String TOKEN_URL = "https://zhbdgps.cn/video/webapi/user/login";
+    private static final String LOCATION_URL="https://zhbdgps.cn/video/webapi/report/fuel/daily/detail";
+    private static final String parameter = "lng,lat,today_distance,distance,todayoil,totaloil,online,oil1,oil2,oil3,oil4,vehicle_name";
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 获取油耗数据
+     * @param carIds 中航北斗 逗号分隔的车辆id
+     * @return
+     * @throws Exception
+     */
+    public Map<Integer, IotDeviceCarFuelVO> carFuels(String carIds, String startDate, String endDate) throws Exception {
+        String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
+        if (StrUtil.isBlank(zhbdtoken)) {
+            Map<String, String> map = new HashMap<>();
+            map.put("id", ID);
+            map.put("secret", SECRET);
+            JSONObject entries = restTemplate.postForObject(TOKEN_URL, map, JSONObject.class);
+            if (Objects.nonNull(entries)&&entries.get("code") != null&&Integer.parseInt(String.valueOf(entries.get("code")))==200) {
+                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(entries.get("data")));
+                zhbdtoken = jsonObject.get("token").toString();
+                redisTemplate.opsForValue().set("zhbdtoken", zhbdtoken, 80000, TimeUnit.SECONDS);
+            }
+        }
+        // 构建请求JSON
+        Map<String, Object> requestMap = new HashMap<>();
+        requestMap.put("client_ids", ID);
+        requestMap.put("vehicle_ids", carIds);
+        requestMap.put("begin_time", startDate);
+        requestMap.put("end_time", endDate);
+        requestMap.put("page_num", 1);
+        requestMap.put("page_size", 10);
+        // key车辆carId   value油耗值
+        Map<Integer, IotDeviceCarFuelVO> carOilFuelPair = new HashMap<>();
+        if (StrUtil.isNotBlank(zhbdtoken)) {
+            try {
+                String jsonResponse = sendPostRequest(requestMap, zhbdtoken);
+                ApiOilResponse response = parseResponse(jsonResponse);
+                if (response != null && response.code == 200) {
+                    List<Map<String, Object>> details = response.data.pageList;
+                    // 组装某辆车 某天的油耗
+                    for (Map<String, Object> detail : details) {
+                        IotDeviceCarFuelVO carFuel = new IotDeviceCarFuelVO();
+                        Integer carId = Integer.valueOf(detail.get("vehicle_id").toString());
+                        Double oil = Double.valueOf(detail.get("oil").toString());
+                        String vehicleName = String.valueOf(detail.get("vehicle_name"));
+                        String createtime = String.valueOf(detail.get("createtime"));
+                        carFuel.setVehicleId(carId);
+                        carFuel.setVehicleName(vehicleName);
+                        carFuel.setOil(oil);
+                        carFuel.setCreatetime(createtime);
+                        carOilFuelPair.put(carId, carFuel);
+                    }
+                }
+            } catch (Exception e) {
+                log.info("获取油耗数据失败!");
+            }
+        }
+        return carOilFuelPair;
+    }
+
+    private String sendPostRequest(Map<String, Object> requestData,String token) throws IOException {
+
+        OkHttpClient client = new OkHttpClient();
+        ObjectMapper objectMapper = new ObjectMapper();
+        String json = objectMapper.writeValueAsString(requestData);
+        okhttp3.RequestBody body = okhttp3.RequestBody.create(json, okhttp3.MediaType.parse("application/json"));
+
+        Request request = new Request.Builder()
+                .url(LOCATION_URL)
+                .post(body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Authorization", "Bearer " + token)// 关键头信息
+                .build();
+        String responseData = "";
+        try (Response response = client.newCall(request).execute()) {
+            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
+            responseData = response.body().string();
+            System.out.println(responseData);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return responseData;
+    }
+
+    private ApiOilResponse parseResponse(String json) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        return mapper.readValue(json, ApiOilResponse.class);
+    }
+
+}