Browse Source

Merge remote-tracking branch 'origin/master'

lipenghui 3 tháng trước cách đây
mục cha
commit
91179dee0f
13 tập tin đã thay đổi với 528 bổ sung4 xóa
  1. 1 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 1 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java
  3. 2 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/vo/IotDevicePersonRelationSaveReqVO.java
  4. 131 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/IotDeviceStatusLogController.java
  5. 39 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogPageReqVO.java
  6. 58 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogRespVO.java
  7. 31 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogSaveReqVO.java
  8. 50 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotdevicestatuslog/IotDeviceStatusLogDO.java
  9. 29 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicestatuslog/IotDeviceStatusLogMapper.java
  10. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonService.java
  11. 52 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonServiceImpl.java
  12. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicestatuslog/IotDeviceStatusLogService.java
  13. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicestatuslog/IotDeviceStatusLogServiceImpl.java

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

@@ -59,4 +59,5 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_MAINTAIN_BOMS_NOT_EXISTS = new ErrorCode(147, "请选择维修工单对应BOM");
     ErrorCode IOT_SAP_PICKING_LIST_NOT_EXISTS = new ErrorCode(147, "PMS SAP 领料单不存在");
     ErrorCode IOT_DEVICE_PERSON_NOT_EXISTS = new ErrorCode(148, "设备负责人分配不存在");
+    ErrorCode IOT_DEVICE_STATUS_LOG_NOT_EXISTS = new ErrorCode(149, "设备状态调整日志不存在");
 }

+ 1 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java

@@ -89,7 +89,7 @@ public class IotDeviceController {
     @Operation(summary = "批量调整设备状态")
     @PreAuthorize("@ss.hasPermission('pms:iot-device-person:create')")
     public CommonResult<Long> saveDeviceStatuses(@Valid @RequestBody List<IotDevicePersonRelationSaveReqVO> reqVOS) {
-        return success(null/*iotDevicePersonService.saveDeviceStatuses(reqVOS)*/);
+        return success(iotDevicePersonService.saveDeviceStatuses(reqVOS));
     }
 
     @PutMapping("/update")
@@ -188,7 +188,6 @@ public class IotDeviceController {
     @Operation(summary = "获得设备动态 分页")
     @PreAuthorize("@ss.hasPermission('rq:iot-device:query')")
     public CommonResult<PageResult<IotDeviceRespVO>> responsiblePagedeviceDynamicsPage(@Valid IotDevicePageReqVO pageReqVO) {
-        // 只显示已经设置关联了责任人的设备
         PageResult<IotDeviceDO> pageResult = iotDeviceService.getIotDevicePage(pageReqVO);
         if (CollUtil.isEmpty(pageResult.getList())) {
             return success(new PageResult<>(pageResult.getTotal()));

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/vo/IotDevicePersonRelationSaveReqVO.java

@@ -20,8 +20,8 @@ public class IotDevicePersonRelationSaveReqVO {
     @Schema(description = "负责人id 集合", example = "4801")
     private List<Long> userIds;
 
-    @Schema(description = "开启状态 0启用  1停用", example = "1")
-    private Integer status;
+    @Schema(description = "设备状态", example = "sg")
+    private String status;
 
     @Schema(description = "原因", example = "随便")
     private String reason;

+ 131 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/IotDeviceStatusLogController.java

@@ -0,0 +1,131 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog;
+
+import cn.hutool.core.collection.CollUtil;
+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.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+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.iotdevicestatuslog.vo.IotDeviceStatusLogPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo.IotDeviceStatusLogRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo.IotDeviceStatusLogSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog.IotDeviceStatusLogDO;
+import cn.iocoder.yudao.module.pms.service.IotDeviceService;
+import cn.iocoder.yudao.module.pms.service.iotdevicestatuslog.IotDeviceStatusLogService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+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.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+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.convertListByFlatMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
+
+@Tag(name = "管理后台 - 设备状态调整日志")
+@RestController
+@RequestMapping("/pms/iot-device-status-log")
+@Validated
+public class IotDeviceStatusLogController {
+
+    @Resource
+    private IotDeviceStatusLogService iotDeviceStatusLogService;
+    @Resource
+    private IotDeviceService iotDeviceService;
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建设备状态调整日志")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:create')")
+    public CommonResult<Long> createIotDeviceStatusLog(@Valid @RequestBody IotDeviceStatusLogSaveReqVO createReqVO) {
+        return success(iotDeviceStatusLogService.createIotDeviceStatusLog(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新设备状态调整日志")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:update')")
+    public CommonResult<Boolean> updateIotDeviceStatusLog(@Valid @RequestBody IotDeviceStatusLogSaveReqVO updateReqVO) {
+        iotDeviceStatusLogService.updateIotDeviceStatusLog(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除设备状态调整日志")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:delete')")
+    public CommonResult<Boolean> deleteIotDeviceStatusLog(@RequestParam("id") Long id) {
+        iotDeviceStatusLogService.deleteIotDeviceStatusLog(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得设备状态调整日志")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:query')")
+    public CommonResult<IotDeviceStatusLogRespVO> getIotDeviceStatusLog(@RequestParam("id") Long id) {
+        IotDeviceStatusLogDO iotDeviceStatusLog = iotDeviceStatusLogService.getIotDeviceStatusLog(id);
+        return success(BeanUtils.toBean(iotDeviceStatusLog, IotDeviceStatusLogRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得设备状态调整日志分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:query')")
+    public CommonResult<PageResult<IotDeviceStatusLogRespVO>> getIotDeviceStatusLogPage(@Valid IotDeviceStatusLogPageReqVO pageReqVO) {
+        PageResult<IotDeviceStatusLogDO> pageResult = iotDeviceStatusLogService.getIotDeviceStatusLogPage(pageReqVO);
+        // 组装关联的 设备 信息
+        return success(new PageResult<>(buildDeviceStatusList(pageResult.getList()), pageResult.getTotal()));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出设备状态调整日志 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-status-log:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotDeviceStatusLogExcel(@Valid IotDeviceStatusLogPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotDeviceStatusLogDO> list = iotDeviceStatusLogService.getIotDeviceStatusLogPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "设备状态调整日志.xls", "数据", IotDeviceStatusLogRespVO.class,
+                        BeanUtils.toBean(list, IotDeviceStatusLogRespVO.class));
+    }
+
+    private List<IotDeviceStatusLogRespVO> buildDeviceStatusList(List<IotDeviceStatusLogDO> deviceStatuses) {
+        if (CollUtil.isEmpty(deviceStatuses)) {
+            return Collections.emptyList();
+        }
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(deviceStatuses,
+                status -> Stream.of(NumberUtils.parseLong(status.getCreator()))));
+        // 组装bom关联的设备信息
+        Map<Long, IotDeviceRespVO> deviceMap = iotDeviceService.getDeviceMap(convertListByFlatMap(deviceStatuses,
+                status -> Stream.of(status.getDeviceId())));
+        // 2. 转换成 VO
+        return BeanUtils.toBean(deviceStatuses, IotDeviceStatusLogRespVO.class, statusVO -> {
+            // 设置设备相关信息
+            MapUtils.findAndThen(deviceMap, statusVO.getDeviceId(),
+                    device -> statusVO.setDeviceName(device.getDeviceName()));
+            MapUtils.findAndThen(deviceMap, statusVO.getDeviceId(),
+                    device -> statusVO.setDeviceCode(device.getDeviceCode()));
+            MapUtils.findAndThen(userMap, NumberUtils.parseLong(statusVO.getCreator()),
+                    user -> statusVO.setCreatorName(user.getNickname()));
+        });
+    }
+
+}

+ 39 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogPageReqVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 设备状态调整日志分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotDeviceStatusLogPageReqVO extends PageParam {
+
+    @Schema(description = "设备id", example = "23664")
+    private Long deviceId;
+
+    @Schema(description = "设备修改前状态", example = "2")
+    private String oldStatus;
+
+    @Schema(description = "设备修改后状态", example = "1")
+    private String newStatus;
+
+    @Schema(description = "设备状态调整原因", example = "不对")
+    private String reason;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 58 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogRespVO.java

@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.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 IotDeviceStatusLogRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8781")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "设备id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23664")
+    @ExcelProperty("设备id")
+    private Long deviceId;
+
+    @Schema(description = "设备修改前状态", example = "2")
+    @ExcelProperty("设备修改前状态")
+    private String oldStatus;
+
+    @Schema(description = "设备修改后状态", example = "1")
+    @ExcelProperty("设备修改后状态")
+    private String newStatus;
+
+    @Schema(description = "设备状态调整原因", example = "不对")
+    @ExcelProperty("设备状态调整原因")
+    private String reason;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 扩展属性
+     */
+    @Schema(description = "设备编码", example = "YF001")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", example = "钻机")
+    private String deviceName;
+
+    @Schema(description = "创建人姓名", example = "张三")
+    private String creatorName;
+
+    @Schema(description = "创建人id", example = "101")
+    private String creator;
+
+}

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicestatuslog/vo/IotDeviceStatusLogSaveReqVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 设备状态调整日志新增/修改 Request VO")
+@Data
+public class IotDeviceStatusLogSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8781")
+    private Long id;
+
+    @Schema(description = "设备id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23664")
+    @NotNull(message = "设备id不能为空")
+    private Long deviceId;
+
+    @Schema(description = "设备修改前状态", example = "2")
+    private String oldStatus;
+
+    @Schema(description = "设备修改后状态", example = "1")
+    private String newStatus;
+
+    @Schema(description = "设备状态调整原因", example = "不对")
+    private String reason;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

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

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog;
+
+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_device_status_log")
+@KeySequence("rq_iot_device_status_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotDeviceStatusLogDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 设备id
+     */
+    private Long deviceId;
+    /**
+     * 设备修改前状态
+     */
+    private String oldStatus;
+    /**
+     * 设备修改后状态
+     */
+    private String newStatus;
+    /**
+     * 设备状态调整原因
+     */
+    private String reason;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 29 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicestatuslog/IotDeviceStatusLogMapper.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotdevicestatuslog;
+
+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.iotdevicestatuslog.vo.IotDeviceStatusLogPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog.IotDeviceStatusLogDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备状态调整日志 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotDeviceStatusLogMapper extends BaseMapperX<IotDeviceStatusLogDO> {
+
+    default PageResult<IotDeviceStatusLogDO> selectPage(IotDeviceStatusLogPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotDeviceStatusLogDO>()
+                .eqIfPresent(IotDeviceStatusLogDO::getDeviceId, reqVO.getDeviceId())
+                .eqIfPresent(IotDeviceStatusLogDO::getOldStatus, reqVO.getOldStatus())
+                .eqIfPresent(IotDeviceStatusLogDO::getNewStatus, reqVO.getNewStatus())
+                .eqIfPresent(IotDeviceStatusLogDO::getReason, reqVO.getReason())
+                .eqIfPresent(IotDeviceStatusLogDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotDeviceStatusLogDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotDeviceStatusLogDO::getId));
+    }
+
+}

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonService.java

@@ -71,4 +71,12 @@ public interface IotDevicePersonService {
      * @return 设备负责人 姓名拼接
      */
     Long saveDevicePersons(List<IotDevicePersonRelationSaveReqVO> reqVOS);
+
+    /**
+     * 批量修改保存设备状态
+     *
+     * @param reqVOS 设备-状态关联 集合
+     * @return
+     */
+    Long saveDeviceStatuses(List<IotDevicePersonRelationSaveReqVO> reqVOS);
 }

+ 52 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonServiceImpl.java

@@ -6,8 +6,12 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonRelationSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdeviceperson.IotDevicePersonDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog.IotDeviceStatusLogDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdeviceperson.IotDevicePersonMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicestatuslog.IotDeviceStatusLogMapper;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.apache.commons.lang3.StringUtils;
@@ -17,9 +21,11 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_PERSON_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_STATUS_LOG_NOT_EXISTS;
 
 /**
  * 设备负责人分配 Service 实现类
@@ -34,6 +40,10 @@ public class IotDevicePersonServiceImpl implements IotDevicePersonService {
     private IotDevicePersonMapper iotDevicePersonMapper;
     @Resource
     private AdminUserApi adminUserApi;
+    @Resource
+    private IotDeviceStatusLogMapper iotDeviceStatusLogMapper;
+    @Resource
+    private IotDeviceMapper iotDeviceMapper;
 
     @Override
     public Long createIotDevicePerson(IotDevicePersonSaveReqVO createReqVO) {
@@ -134,4 +144,46 @@ public class IotDevicePersonServiceImpl implements IotDevicePersonService {
         return 0l;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long saveDeviceStatuses(List<IotDevicePersonRelationSaveReqVO> reqVOS) {
+        // 批量保存设备的状态
+        if (CollUtil.isEmpty(reqVOS)) {
+            throw exception(IOT_DEVICE_STATUS_LOG_NOT_EXISTS);
+        }
+        // 查询出所有要保存设备的id
+        List<Long> deviceIds = new ArrayList<>();
+        reqVOS.forEach(req -> {
+            deviceIds.add(req.getDeviceId());
+        });
+        List<IotDeviceDO> devices = iotDeviceMapper.selectList("id", deviceIds);
+        Map<Long, IotDeviceDO> deviceMap = devices.stream()
+                .collect(Collectors.toMap(IotDeviceDO::getId, device -> device));
+        // 如果调整前后 设备状态一样,则不向日志表中插入值
+        List<IotDeviceStatusLogDO> deviceStatusLogs = new ArrayList<>();
+        List<IotDeviceDO> tobeUpdatedDevices = new ArrayList<>();
+        reqVOS.forEach(req -> {
+            if (deviceMap.containsKey(req.getDeviceId()) && !req.getStatus().equals(deviceMap.get(req.getDeviceId()).getDeviceStatus())) {
+                IotDeviceStatusLogDO tempDeviceStatus = new IotDeviceStatusLogDO();
+                tempDeviceStatus.setDeviceId(req.getDeviceId());
+                tempDeviceStatus.setOldStatus(deviceMap.get(req.getDeviceId()).getDeviceStatus());
+                tempDeviceStatus.setNewStatus(req.getStatus());
+                tempDeviceStatus.setReason(req.getReason());
+                deviceStatusLogs.add(tempDeviceStatus);
+                IotDeviceDO device = deviceMap.get(req.getDeviceId());
+                device.setDeviceStatus(req.getStatus());
+                tobeUpdatedDevices.add(device);
+            }
+        });
+        // 批量插入设备状态 调整关联关系
+        if (CollUtil.isNotEmpty(deviceStatusLogs)) {
+            iotDeviceStatusLogMapper.insertBatch(deviceStatusLogs);
+        }
+        // 批量修改 设备的状态
+        if (CollUtil.isNotEmpty(tobeUpdatedDevices)) {
+            iotDeviceMapper.updateBatch(tobeUpdatedDevices);
+        }
+        return 0l;
+    }
+
 }

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

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotdevicestatuslog;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo.IotDeviceStatusLogPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo.IotDeviceStatusLogSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog.IotDeviceStatusLogDO;
+
+import javax.validation.Valid;
+
+/**
+ * 设备状态调整日志 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotDeviceStatusLogService {
+
+    /**
+     * 创建设备状态调整日志
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotDeviceStatusLog(@Valid IotDeviceStatusLogSaveReqVO createReqVO);
+
+    /**
+     * 更新设备状态调整日志
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotDeviceStatusLog(@Valid IotDeviceStatusLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除设备状态调整日志
+     *
+     * @param id 编号
+     */
+    void deleteIotDeviceStatusLog(Long id);
+
+    /**
+     * 获得设备状态调整日志
+     *
+     * @param id 编号
+     * @return 设备状态调整日志
+     */
+    IotDeviceStatusLogDO getIotDeviceStatusLog(Long id);
+
+    /**
+     * 获得设备状态调整日志分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 设备状态调整日志分页
+     */
+    PageResult<IotDeviceStatusLogDO> getIotDeviceStatusLogPage(IotDeviceStatusLogPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotdevicestatuslog;
+
+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.iotdevicestatuslog.vo.IotDeviceStatusLogPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicestatuslog.vo.IotDeviceStatusLogSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicestatuslog.IotDeviceStatusLogDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicestatuslog.IotDeviceStatusLogMapper;
+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_DEVICE_STATUS_LOG_NOT_EXISTS;
+
+/**
+ * 设备状态调整日志 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotDeviceStatusLogServiceImpl implements IotDeviceStatusLogService {
+
+    @Resource
+    private IotDeviceStatusLogMapper iotDeviceStatusLogMapper;
+
+    @Override
+    public Long createIotDeviceStatusLog(IotDeviceStatusLogSaveReqVO createReqVO) {
+        // 插入
+        IotDeviceStatusLogDO iotDeviceStatusLog = BeanUtils.toBean(createReqVO, IotDeviceStatusLogDO.class);
+        iotDeviceStatusLogMapper.insert(iotDeviceStatusLog);
+        // 返回
+        return iotDeviceStatusLog.getId();
+    }
+
+    @Override
+    public void updateIotDeviceStatusLog(IotDeviceStatusLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotDeviceStatusLogExists(updateReqVO.getId());
+        // 更新
+        IotDeviceStatusLogDO updateObj = BeanUtils.toBean(updateReqVO, IotDeviceStatusLogDO.class);
+        iotDeviceStatusLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotDeviceStatusLog(Long id) {
+        // 校验存在
+        validateIotDeviceStatusLogExists(id);
+        // 删除
+        iotDeviceStatusLogMapper.deleteById(id);
+    }
+
+    private void validateIotDeviceStatusLogExists(Long id) {
+        if (iotDeviceStatusLogMapper.selectById(id) == null) {
+            throw exception(IOT_DEVICE_STATUS_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotDeviceStatusLogDO getIotDeviceStatusLog(Long id) {
+        return iotDeviceStatusLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotDeviceStatusLogDO> getIotDeviceStatusLogPage(IotDeviceStatusLogPageReqVO pageReqVO) {
+        return iotDeviceStatusLogMapper.selectPage(pageReqVO);
+    }
+
+}