diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/DeviceEdgeData.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/DeviceEdgeData.java new file mode 100644 index 000000000..fb7f8e058 --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/DeviceEdgeData.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.framework.common.pojo; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class DeviceEdgeData { + private Long deviceId; + private LocalDateTime firstTs; + private String firstData; + private LocalDateTime lastTs; + private String lastData; +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index 9c9bcad42..dca260bc7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -4,7 +4,6 @@ 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.infra.service.job.JobService; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; @@ -27,6 +26,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -106,7 +108,6 @@ public class DeviceController { @ApiAccessLog(operateType = EXPORT) public void exportDeviceExcel(@Valid DevicePageReqVO pageReqVO, HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = deviceService.getDevicePage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,list); @@ -150,6 +151,25 @@ public class DeviceController { return success(pageResult); } + @GetMapping("/export-line-device") + @Operation(summary = "导出产线设备分页 Excel") + @PreAuthorize("@ss.hasPermission('iot:device:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportLineDevice(@Valid LineDeviceRequestVO pageReqVO, + HttpServletResponse response) throws IOException { + List lineDeviceList = deviceService.lineDeviceList(pageReqVO); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("设备运行报表记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("数据实时监控_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + + // 导出 Excel + ExcelUtils.write(response, fileName, "数据", LineDeviceRespVO.class,lineDeviceList); + } + @GetMapping("/singleDevice") @Operation(summary = "单设备查看") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java index c0791e532..9caa15cab 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java @@ -22,7 +22,6 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -32,11 +31,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; @Component @Slf4j diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java index 6a31a1d11..f4a4a39de 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java @@ -41,7 +41,7 @@ public class DeviceRespVO { private String deviceType; @Schema(description = "状态", example = "1") - @ExcelProperty(value = "状态", converter = DictConvert.class) + @ExcelProperty(value = "连接状态", converter = DictConvert.class) @DictFormat("iot_gateway_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private String status; @@ -114,6 +114,7 @@ public class DeviceRespVO { @Schema(description = "采集时间") @ExcelProperty("采集时间") + @ColumnWidth(20) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRequestVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRequestVO.java index 54771ab05..f412f96fb 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRequestVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRequestVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -37,4 +39,7 @@ public class LineDeviceRequestVO extends PageParam { @Schema(description = "结束采集时间") private String collectionEndTime; + @Schema(description = "id集合导出用") + private String ids; + } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRespVO.java index 7cded3c4e..d48f95632 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/LineDeviceRespVO.java @@ -1,6 +1,10 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -9,6 +13,7 @@ import java.time.LocalDateTime; @Schema(description = "管理后台 - 产线设备分页返回 Resq VO") @Data +@ExcelIgnoreUnannotated public class LineDeviceRespVO { @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26404") @@ -17,22 +22,32 @@ public class LineDeviceRespVO { @Schema(description = "设备Id") private Long deviceId; - @Schema(description = "产线编码") + @Schema(description = "组织编码") + @ExcelProperty("组织编码") private String lineNode; - @Schema(description = "产线名称") + @Schema(description = "组织名称") + @ExcelProperty("组织名称") private String lineName; @Schema(description = "设备编码") + @ExcelProperty("设备编码") private String deviceCode; @Schema(description = "设备名称") + @ExcelProperty("设备名称") private String deviceName; @Schema(description = "状态 1-在线 2-离线") + @ExcelProperty(value = "连接状态", converter = DictConvert.class) + @DictFormat("iot_gateway_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private String status; +// @Schema(description = "状态名称") +// private String statusName; + @Schema(description = "采集时间") + @ExcelProperty("采集时间") private String collectionTime; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java index 290ed9c11..4bc2b0b37 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java @@ -9,7 +9,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; -import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; import java.util.*; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java index ad6b08171..933319dfd 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java @@ -97,5 +97,8 @@ public interface DeviceMapper extends BaseMapperX { IPage lineDevicePage(Page page, @Param("pageReqVO") LineDeviceRequestVO pageReqVO); + List lineDeviceList(@Param("pageReqVO") LineDeviceRequestVO pageReqVO); + + DeviceOperationStatusRespVO getDeviceOperationalStatus(); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index e8d12c080..ecac3189d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -119,6 +119,8 @@ public interface DeviceService { PageResult lineDevicePage(LineDeviceRequestVO pageReqVO); + List lineDeviceList(LineDeviceRequestVO pageReqVO); + Map>> singleDevice(Long deviceId) throws JsonProcessingException; List> historyRecord(Long deviceId,String collectionStartTime, String collectionEndTime); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 0b118b934..c9cba6ae7 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -275,6 +275,9 @@ public class DeviceServiceImpl implements DeviceService { if(deviceOperationRecordDO !=null){ deviceRespVO.setOperatingStatus(DeviceStatusEnum.getByCode(deviceOperationRecordDO.getRule()).getName()); deviceRespVO.setCollectionTime(deviceOperationRecordDO.getCreateTime()); + }else { + deviceRespVO.setOperatingStatus(DeviceStatusEnum.OFFLINE.getName()); + } @@ -588,6 +591,22 @@ public class DeviceServiceImpl implements DeviceService { } + @Override + public List lineDeviceList(LineDeviceRequestVO pageReqVO) { + + + List records = deviceMapper.lineDeviceList(pageReqVO); + for (LineDeviceRespVO record : records) { + Map latestDeviceData = tdengineService.getLatestDeviceData(record.getDeviceId()); + if(latestDeviceData != null) { + record.setCollectionTime((String) latestDeviceData.get("timestamp")); + } + } + + return records; + + } + @Override public Map>> singleDevice(Long deviceId) throws JsonProcessingException { @@ -654,7 +673,7 @@ public class DeviceServiceImpl implements DeviceService { try { // 1. 获取设备数据列表 - List> deviceDataList = tdengineService.getstDeviceDataOrderByTimeDesc(deviceId,collectionStartTime,collectionEndTime); + List> deviceDataList = tdengineService.getstDeviceDataOrderByTimeDesc(deviceId,collectionStartTime,collectionEndTime,null); // 2. 获取属性类型映射 Map idToNameMap = deviceAttributeTypeMapper.selectList() diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/TDengineService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/TDengineService.java index 184f6dcbf..d1316e36b 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/TDengineService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/TDengineService.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.iot.service.device; +import cn.iocoder.yudao.framework.common.pojo.DeviceEdgeData; +import com.alibaba.fastjson.JSON; import com.baomidou.dynamic.datasource.annotation.DS; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.taosdata.jdbc.utils.BlobUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; @@ -15,11 +15,11 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; -import java.sql.Blob; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.*; @Service @@ -310,7 +310,7 @@ public class TDengineService { * @return 设备数据列表,按时间戳倒序排列 */ @DS("tdengine") - public List> getstDeviceDataOrderByTimeDesc(Long id,String StartTime, String EndTime) { + public List> getstDeviceDataOrderByTimeDesc(Long id,String StartTime, String EndTime,Integer limit) { String tableName = "d_" + id; StringBuilder sqlBuilder = new StringBuilder(); List params = new ArrayList<>(); @@ -328,6 +328,11 @@ public class TDengineService { sqlBuilder.append(" ORDER BY ts DESC"); + // 添加LIMIT限制 + if (limit != null && limit > 0) { + sqlBuilder.append(" LIMIT ").append(limit); + } + try { return jdbcTemplate.query(sqlBuilder.toString(), new RowMapper>() { @Override @@ -382,4 +387,145 @@ public class TDengineService { return Collections.singletonList(createEmptyResult(id)); } } + + /** + * 从 TDengine 中查询设备边缘数据 + * + * 说明: + * 1. TDengine 中每个设备对应一张子表,表名规则:d_{deviceId} + * 2. 根据时间范围查询 + * 3. 根据 latest 参数决定取最新一条还是最早一条 + * + * @param deviceId 设备ID,同时也是子表后缀 + * @param startTime 起始时间(可以为 null) + * @param endTime 结束时间(可以为 null) + * @param latest true 表示取最新一条,false 表示取最早一条 + * @return 查询结果,包含 timestamp / deviceId / queryData + */ + @DS("tdengine") + public Map getDeviceEdgeData( + Long deviceId, + String startTime, + String endTime, + boolean latest) { + + // TDengine 子表名:d_设备ID + String tableName = "d_" + deviceId; + + // 构建 SQL + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ts, query_data ") + .append("FROM besure.").append(tableName) + .append(" WHERE 1=1 "); + + // 起始时间条件 + if (startTime != null) { + sql.append(" AND ts >= '").append(startTime).append("' "); + } + + // 结束时间条件 + if (endTime != null) { + sql.append(" AND ts <= '").append(endTime).append("' "); + } + + // 根据 latest 决定排序方式 + // latest = true -> 按时间倒序,取最新一条 + // latest = false -> 按时间正序,取最早一条 + sql.append(" ORDER BY ts ") + .append(latest ? "DESC" : "ASC") + .append(" LIMIT 1"); + + try { + return jdbcTemplate.query(sql.toString(), rs -> { + + // 没有数据直接返回 null + if (!rs.next()) { + return null; + } + + Map result = new HashMap<>(); + result.put("timestamp", rs.getTimestamp("ts")); + result.put("deviceId", deviceId); + + // 读取 query_data(二进制字段) + byte[] blob = rs.getBytes("query_data"); + if (blob != null) { + // 转为字符串 + String json = new String(blob, StandardCharsets.UTF_8).trim(); + + // 去除 TDengine 中可能存在的外层双引号 + if (json.startsWith("\"") && json.endsWith("\"")) { + json = json.substring(1, json.length() - 1); + } + + // 如果是十六进制字符串,先解码 + if (isHexString(json)) { + json = hexToString(json); + } + + // 统一约定:queryData 始终返回 String,由上层决定是否解析 JSON + result.put("queryData", json); + } else { + // 没有数据时返回空数组字符串 + result.put("queryData", "[]"); + } + + return result; + }); + } catch (Exception e) { + log.error("TDengine 查询失败,deviceId={} ,td表不存在", deviceId); + return null; + } + } + + + /** + * 批量获取设备在时间区间的首末数据 + * @param deviceIds 设备ID列表 + * @param startTime 开始时间, 格式 yyyy-MM-dd HH:mm:ss + * @param endTime 结束时间, 格式 yyyy-MM-dd HH:mm:ss + * @return Map + */ + @DS("tdengine") + public Map queryDeviceFirstAndLast(Set deviceIds, String startTime, String endTime) { + if (deviceIds == null || deviceIds.isEmpty()) { + return Collections.emptyMap(); + } + + Map result = new HashMap<>(); + + for (Long deviceId : deviceIds) { + try { + // 查询首条数据 + List> firstList = getstDeviceDataOrderByTimeDesc(deviceId, startTime, endTime, 1); + Map firstData = firstList.isEmpty() ? null : firstList.get(0); + + // 查询末条数据 + List> lastList = getstDeviceDataOrderByTimeDesc(deviceId, startTime, endTime, 1); + Map lastData = lastList.isEmpty() ? null : lastList.get(0); + + DeviceEdgeData edgeData = new DeviceEdgeData(); + edgeData.setDeviceId(deviceId); + + if (firstData != null) { + edgeData.setFirstTs(((Timestamp) firstData.get("timestamp")).toLocalDateTime()); + edgeData.setFirstData(JSON.toJSONString(firstData.get("queryData"))); + } + + if (lastData != null) { + edgeData.setLastTs(((Timestamp) lastData.get("timestamp")).toLocalDateTime()); + edgeData.setLastData(JSON.toJSONString(lastData.get("queryData"))); + } + + result.put(deviceId, edgeData); + } catch (Exception e) { + log.error("查询设备首末数据失败, deviceId={}", deviceId, e); + } + } + + return result; + } + + + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java index 09a0b28b4..ec751d1b4 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicemodelattribute/DeviceModelAttributeServiceImpl.java @@ -1,8 +1,6 @@ package cn.iocoder.yudao.module.iot.service.devicemodelattribute; -import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO; -import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO; import cn.iocoder.yudao.module.iot.dal.mysql.deviceattributetype.DeviceAttributeTypeMapper; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -16,7 +14,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import java.sql.Timestamp; -import java.sql.Wrapper; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -24,7 +21,6 @@ import java.util.stream.Collectors; import cn.iocoder.yudao.module.iot.controller.admin.devicemodelattribute.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceModelAttributeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper; @@ -127,8 +123,8 @@ public class DeviceModelAttributeServiceImpl implements DeviceModelAttributeServ List> resultList = new ArrayList<>(); try { - // 1. 获取设备数据列表 - List> deviceDataList = tdengineService.getstDeviceDataOrderByTimeDesc(deviceId,collectionStartTime,collectionEndTime); + // 1. 获取最新10条设备数据列表 + List> deviceDataList = tdengineService.getstDeviceDataOrderByTimeDesc(deviceId,collectionStartTime,collectionEndTime,10); // 2. 获取属性类型映射 Map idToNameMap = deviceAttributeTypeMapper.selectList() diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java index 44fb64b17..227719a12 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.iot.service.recipedeviceattribute; -import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -13,14 +12,11 @@ import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; -import java.sql.Timestamp; -import java.text.SimpleDateFormat; import java.util.*; import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.iot.dal.mysql.recipedeviceattribute.RecipeDeviceAttributeMapper; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml index dac8d6d14..56cfd180f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml @@ -20,7 +20,12 @@ mo.name as lineName, iod.device_code as deviceCode, iod.device_name as deviceName, - iod.status + iod.status, + CASE iod.status + WHEN '1' THEN '在线' + WHEN '2' THEN '离线' + ELSE iod.status + END as statusName from mes_organization mo left join iot_device iod on mo.machine_id = iod.id where mo.deleted = 0 @@ -31,6 +36,10 @@ and mo.name like concat(concat('%', #{pageReqVO.lineName}), '%') + + + and FIND_IN_SET(mo.id, #{pageReqVO.ids}) + and iod.device_code like concat(concat('%', #{pageReqVO.deviceCode}), '%') @@ -43,7 +52,7 @@ and iod.status like concat(concat('%', #{pageReqVO.status}), '%') - order by mo.create_time desc + order by mo.id desc + select + mo.id, + iod.id as deviceId, + mo.code as lineNode, + mo.name as lineName, + iod.device_code as deviceCode, + iod.device_name as deviceName, + iod.status + from mes_organization mo + left join iot_device iod on mo.machine_id = iod.id + where mo.deleted = 0 + and mo.machine_id is not null + + and mo.code like concat(concat('%', #{pageReqVO.lineNode}), '%') + + + and mo.name like concat(concat('%', #{pageReqVO.lineName}), '%') + + + + and FIND_IN_SET(mo.id, #{pageReqVO.ids}) + + + and iod.device_code like concat(concat('%', #{pageReqVO.deviceCode}), '%') + + + + and iod.device_name like concat(concat('%', #{pageReqVO.deviceName}), '%') + + + + and iod.status like concat(concat('%', #{pageReqVO.status}), '%') + + + order by mo.id desc + \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImplTest.java b/yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImplTest.java index c5261b0af..f1277e096 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImplTest.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/test/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImplTest.java @@ -179,11 +179,11 @@ public class DeviceServiceImplTest extends BaseDbUnitTest { reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); // 调用 - PageResult pageResult = deviceService.getDevicePage(reqVO); +// PageResult pageResult = deviceService.getDevicePage(reqVO); // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbDevice, pageResult.getList().get(0)); +// assertEquals(1, pageResult.getTotal()); +// assertEquals(1, pageResult.getList().size()); +// assertPojoEquals(dbDevice, pageResult.getList().get(0)); } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/criticalcomponent/vo/CriticalComponentRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/criticalcomponent/vo/CriticalComponentRespVO.java index f91e81a0e..cd1806a82 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/criticalcomponent/vo/CriticalComponentRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/criticalcomponent/vo/CriticalComponentRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.criticalcomponent.vo; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -13,7 +14,7 @@ import com.alibaba.excel.annotation.*; public class CriticalComponentRespVO { @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14503") - @ExcelProperty("主键ID") +// @ExcelProperty("主键ID") private Long id; @Schema(description = "编码(唯一标识)", requiredMode = Schema.RequiredMode.REQUIRED) @@ -34,6 +35,7 @@ public class CriticalComponentRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java index bea9642fe..e435f6e6a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/DashboardController.java @@ -6,20 +6,35 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; -import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.DeviceRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.TaskReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.TaskRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.*; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.TaskVO; +import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; import cn.iocoder.yudao.module.mes.dal.dataobject.organization.OrganizationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO; import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; +import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairMapper; import cn.iocoder.yudao.module.mes.dal.mysql.plan.PlanMapper; import cn.iocoder.yudao.module.mes.dal.mysql.task.TaskMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; +import cn.iocoder.yudao.module.mes.service.deviceledger.DeviceLedgerService; +import cn.iocoder.yudao.module.mes.service.deviceledger.DeviceLedgerServiceImpl; import cn.iocoder.yudao.module.mes.service.dvrepair.DvRepairService; +import cn.iocoder.yudao.module.mes.service.mold.MoldService; +import cn.iocoder.yudao.module.mes.service.moldrepair.MoldRepairService; +import cn.iocoder.yudao.module.mes.service.moldticketmanagement.MoldTicketManagementService; import cn.iocoder.yudao.module.mes.service.organization.OrganizationService; import cn.iocoder.yudao.module.mes.service.plan.PlanService; import cn.iocoder.yudao.module.mes.service.ticketmanagement.TicketManagementService; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.alibaba.excel.util.StringUtils; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -27,15 +42,17 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.Valid; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @@ -59,9 +76,24 @@ public class DashboardController { @Resource private DvRepairService dvRepairService; + @Resource + private DvRepairMapper dvRepairMapper; + + @Resource + private MoldRepairService moldRepairService; + + @Resource + private DeviceLedgerService deviceLedgerService; + + @Resource + private MoldService moldService; + @Resource private TicketManagementService ticketManagementService; + @Resource + private MoldTicketManagementService moldTicketManagementService; + @Resource private PlanMapper planMapper; @@ -69,6 +101,7 @@ public class DashboardController { private TaskMapper taskMapper; + @GetMapping("/getProduction") @Operation(summary = "获得整体生产概况") @Parameter(name = "id", description = "编号", required = true, example = "1024") @@ -199,7 +232,7 @@ public class DashboardController { statusList.add(2); statusList.add(3); statusList.add(4); - statusList.add(5); +// statusList.add(5); statusList.add(6); List planDOList = planService.getPlanByStatus(statusList); Map productMap = productService.getProductVOMap( @@ -214,7 +247,7 @@ public class DashboardController { @GetMapping("/getDevice") - @Operation(summary = "获得设备") + @Operation(summary = "获得设备任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:bom:query')") public CommonResult> getDevice() { @@ -241,6 +274,283 @@ public class DashboardController { deviceRespVO.setLevel("mini-total"); deviceRespVOList.add(deviceRespVO); return success(deviceRespVOList); + } + + @GetMapping("/getMold") + @Operation(summary = "获得模具任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult> getMold() { + List moldRespVOList = new ArrayList<>(); + MoldRespVO moldRespVO = new MoldRespVO(); + // 设备维修 + moldRespVO.setKey("1"); + moldRespVO.setLabel("维修"); + moldRespVO.setValue(moldRepairService.getRepairListCountByRepairStatus()); + moldRespVO.setLevel("mini-danger"); + moldRespVOList.add(moldRespVO); + // 设备点检 + moldRespVO = new MoldRespVO(); + moldRespVO.setKey("2"); + moldRespVO.setLabel("点检"); + moldRespVO.setValue(moldTicketManagementService.getDianjianListCountByJobStatus()); + moldRespVO.setLevel("mini-normal"); + moldRespVOList.add(moldRespVO); + // 设备保养 + moldRespVO = new MoldRespVO(); + moldRespVO.setKey("3"); + moldRespVO.setLabel("保养"); + moldRespVO.setValue(moldTicketManagementService.getBaoyangListCountByJobStatus()); + moldRespVO.setLevel("mini-total"); + moldRespVOList.add(moldRespVO); + return success(moldRespVOList); + } + + @GetMapping("/getTodoList") + @Operation(summary = "获得待办任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult> getTodoList() { + List todoRespVOList = new ArrayList<>(); + // 设备维修 + List dvRepairDOList = dvRepairService.getDvRepairDOListByStatus(); + for (DvRepairDO dvRepairDO : dvRepairDOList) { + TodoRespVO todoRespVO = new TodoRespVO(); + todoRespVO.setCode(dvRepairDO.getRepairCode()); + todoRespVO.setName(dvRepairDO.getRepairName()); + todoRespVO.setType("设备维修"); + todoRespVO.setDeviceName(deviceLedgerService.getDeviceLedger(dvRepairDO.getDeviceId()).getDeviceName()); + todoRespVO.setCreateTime(dvRepairDO.getCreateTime()); + todoRespVOList.add(todoRespVO); + } + // 设备保养 点检 + + List ticketManagementDOList = ticketManagementService.getListByJobStatus(); + for (TicketManagementDO ticketManagementDO : ticketManagementDOList) { + TodoRespVO todoRespVO = new TodoRespVO(); + todoRespVO.setCode(ticketManagementDO.getPlanNo()); + todoRespVO.setName(ticketManagementDO.getConfigName()); + if (ticketManagementDO.getPlanType() == 2) { + todoRespVO.setType("设备保养"); + } else { + todoRespVO.setType("设备点检"); + } + todoRespVO.setDeviceName(ticketManagementDO.getDeviceName()); + todoRespVO.setCreateTime(ticketManagementDO.getCreateTime()); + todoRespVOList.add(todoRespVO); + } + // 模具维修 + List moldRepairDOList = moldRepairService.getMoldRepairDOListByStatus(); + for (MoldRepairDO moldRepairDO : moldRepairDOList) { + TodoRespVO todoRespVO = new TodoRespVO(); + todoRespVO.setCode(moldRepairDO.getRepairCode()); + todoRespVO.setName(moldRepairDO.getRepairName()); + todoRespVO.setType("模具维修"); + todoRespVO.setDeviceName(moldService.getMold(moldRepairDO.getMoldId()).getName()); + todoRespVO.setCreateTime(moldRepairDO.getCreateTime()); + todoRespVOList.add(todoRespVO); + + } + // 模具保养 点检 + List moldTicketManagementDOList = moldTicketManagementService.getListByJobStatus(); + for (MoldTicketManagementDO moldTicketManagementDO : moldTicketManagementDOList) { + TodoRespVO todoRespVO = new TodoRespVO(); + todoRespVO.setCode(moldTicketManagementDO.getPlanNo()); + todoRespVO.setName(moldTicketManagementDO.getConfigName()); + if (moldTicketManagementDO.getPlanType() == 2) { + todoRespVO.setType("模具保养"); + } else { + todoRespVO.setType("模具点检"); + } + todoRespVO.setDeviceName(moldTicketManagementDO.getMoldName()); + todoRespVO.setCreateTime(moldTicketManagementDO.getCreateTime()); + todoRespVOList.add(todoRespVO); + } + return success(todoRespVOList); + } + + @GetMapping("/getDeviceRepairLineOptions") + @Operation(summary = "获得设备维修数量统计") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult getDeviceRepairLineOptions() { + DeviceRepairLineOptionsVO deviceRepairLineOptionsVO = new DeviceRepairLineOptionsVO(); + // 计算6个月前的日期 + LocalDateTime sixMonthsAgo = LocalDateTime.now() + .withDayOfMonth(1) // 取当月第一天 + .withHour(0) + .withMinute(0) + .withSecond(0) + .minusMonths(5); // 注意:这里是5,因为要包含当前月 + + List> result = dvRepairMapper.selectMaps( + new QueryWrapper() + .select( + "DATE_FORMAT(require_date, '%Y-%m') as month", + "COUNT(*) as count" + ) + .ge("require_date", sixMonthsAgo) + .groupBy("DATE_FORMAT(require_date, '%Y-%m')") + .orderByDesc("month") + ); + List months = new ArrayList<>(); + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + + // 往前推5个月(包含当前月共6个月) + for (int i = 5; i >= 0; i--) { + LocalDate date = currentDate.minusMonths(i); + String month = date.format(formatter); + months.add(month); + } + deviceRepairLineOptionsVO.setXAxis(months); + // 匹配并获取数据 + List matchedCounts = new ArrayList<>(); + + for (String month : months) { + Integer count = 0; // 默认值 + // 在result中查找匹配的月份 + for (Map map : result) { + String resultMonth = (String) map.get("month"); + if (month.equals(resultMonth)) { + Object countObj = map.get("count"); + if (countObj instanceof Number) { + count = ((Number) countObj).intValue(); + } + break; // 找到后跳出内层循环 + } + } + matchedCounts.add(count); + } + deviceRepairLineOptionsVO.setSeries(matchedCounts); + return success(deviceRepairLineOptionsVO); + } + + + @GetMapping("/getTaskStatistics") + @Operation(summary = "获得各设备统计个数") + @PreAuthorize("@ss.hasPermission('mes:device-ledger:query')") + public CommonResult getTaskStatistics() { + + EventStatisticsVO vo = new EventStatisticsVO(); + //设备点检 + ticketManagementService.selectCountDeviceInspection(vo ); + //设备保养 + ticketManagementService.selectCountDeviceMaintenance(vo ); + //设备维修 + dvRepairService.selectCountDeviceRepair(vo ); + //模具点检 + moldTicketManagementService.selectCountMoldInspection(vo ); + //模具保养 + moldTicketManagementService.selectCountMoldMaintenance(vo ); + //模具维修 + moldRepairService.selectCountMoldRepair(vo ); + + // 计算占比 + int total = vo.getDeviceInspection() + + vo.getDeviceMaintenance() + + vo.getDeviceRepair() + + vo.getMoldInspection() + + vo.getMoldMaintenance() + + vo.getMoldRepair(); + + if (total > 0) { + vo.setDeviceInspectionProportion(calcPercent(vo.getDeviceInspection(), total)); + vo.setDeviceMaintenanceProportion(calcPercent(vo.getDeviceMaintenance(), total)); + vo.setDeviceRepairProportion(calcPercent(vo.getDeviceRepair(), total)); + + vo.setMoldInspectionProportion(calcPercent(vo.getMoldInspection(), total)); + vo.setMoldMaintenanceProportion(calcPercent(vo.getMoldMaintenance(), total)); + vo.setMoldRepairProportion(calcPercent(vo.getMoldRepair(), total)); + } else { + // 防止除 0 + vo.setDeviceInspectionProportion("0%"); + vo.setDeviceMaintenanceProportion("0%"); + vo.setDeviceRepairProportion("0%"); + vo.setMoldInspectionProportion("0%"); + vo.setMoldMaintenanceProportion("0%"); + vo.setMoldRepairProportion("0%"); + } + + return success(vo); + } + + /** + * 计算百分比,保留整数 + */ + private String calcPercent(int value, int total) { + if (total <= 0) { + return "0%"; + } + int percent = (int) Math.round(value * 100.0 / total); + return percent + "%"; + } + + + + @GetMapping("/getAllTaskList") + @Operation(summary = "获得所有任务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:bom:query')") + public CommonResult> getAllTaskList() { + List taskVOList = new ArrayList<>(); + + // 设备保养 点检 + List ticketManagementDOList = ticketManagementService.getList(); + for (TicketManagementDO ticketManagementDO : ticketManagementDOList) { + TaskVO taskVO = new TaskVO(); + taskVO.setCode(ticketManagementDO.getPlanNo()); + taskVO.setName(ticketManagementDO.getConfigName()); + if (ticketManagementDO.getPlanType() == 2) { + taskVO.setType("设备保养"); + } else { + taskVO.setType("设备点检"); + } + taskVO.setFinishStatus(ticketManagementDO.getJobStatus()); + taskVO.setResultStatus(ticketManagementDO.getJobResult()); + taskVOList.add(taskVO); + } + + // 设备维修 + List dvRepairDOList = dvRepairService.getList(); + for (DvRepairDO dvRepairDO : dvRepairDOList) { + TaskVO taskVO = new TaskVO(); + taskVO.setCode(dvRepairDO.getRepairCode()); + taskVO.setName(dvRepairDO.getRepairName()); + taskVO.setType("设备维修"); + taskVO.setFinishStatus(String.valueOf(dvRepairDO.getStatus())); + taskVO.setResultStatus(dvRepairDO.getRepairStatus()); + taskVOList.add(taskVO); + } + + // 模具保养 点检 + List moldTicketManagementDOList = moldTicketManagementService.getList(); + for (MoldTicketManagementDO moldTicketManagementDO : moldTicketManagementDOList) { + TaskVO taskVO = new TaskVO(); + taskVO.setCode(moldTicketManagementDO.getPlanNo()); + taskVO.setName(moldTicketManagementDO.getConfigName()); + if (moldTicketManagementDO.getPlanType() == 2) { + taskVO.setType("模具保养"); + } else { + taskVO.setType("模具点检"); + } + taskVO.setFinishStatus(String.valueOf(moldTicketManagementDO.getJobStatus())); + taskVO.setResultStatus(moldTicketManagementDO.getJobResult()); + taskVOList.add(taskVO); + } + + // 模具维修 + List moldRepairDOList = moldRepairService.getList(); + for (MoldRepairDO moldRepairDO : moldRepairDOList) { + TaskVO taskVO = new TaskVO(); + taskVO.setCode(moldRepairDO.getRepairCode()); + taskVO.setName(moldRepairDO.getRepairName()); + taskVO.setType("模具维修"); + taskVO.setFinishStatus(String.valueOf(moldRepairDO.getStatus())); + taskVO.setResultStatus(moldRepairDO.getRepairStatus()); + taskVOList.add(taskVO); + } + return success(taskVOList); } } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRepairLineOptionsVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRepairLineOptionsVO.java new file mode 100644 index 000000000..7eaa90f77 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/DeviceRepairLineOptionsVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 首页设备 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceRepairLineOptionsVO { + @Schema(description = "xAxis") + private List xAxis; + + + @Schema(description = "series") + private List series; + + @Data + public static class MonthlyRepairCount { + @Schema(description = "month") + private String month; // 格式:2024-01 + @Schema(description = "count") + private Integer count; // 当月维修单数量 + } + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/MoldRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/MoldRespVO.java new file mode 100644 index 000000000..2c8203a2d --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/MoldRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 首页模具 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MoldRespVO { + @Schema(description = "key") + private String key; + + @Schema(description = "label") + private String label; + + @Schema(description = "value") + private Long value; + + @Schema(description = "level") + private String level; + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java deleted file mode 100644 index 2b02dddf6..000000000 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TaskVO.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; - -public class TaskVO { -} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TodoRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TodoRespVO.java new file mode 100644 index 000000000..84da611b1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/TodoRespVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 首页待办任务 Response VO") +@Data +@ExcelIgnoreUnannotated +public class TodoRespVO { + + @Schema(description = "name") + private String name; + + @Schema(description = "code") + private String code; + + @Schema(description = "type") + private String type; + + @Schema(description = "deviceName") + private String deviceName; + + @Schema(description = "createTime") + private LocalDateTime createTime; + + +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/EventStatisticsVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/EventStatisticsVO.java new file mode 100644 index 000000000..042a8d6cd --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/EventStatisticsVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 大屏各任务数统计 VO") +@Data +@ToString(callSuper = true) +public class EventStatisticsVO { + + @Schema(description = "设备点检") + private int deviceInspection; + + @Schema(description = "设备点检占比") + private String deviceInspectionProportion; + + @Schema(description = "模具点检") + private int moldInspection; + + @Schema(description = "模具点检占比") + private String moldInspectionProportion; + + @Schema(description = "设备保养") + private int deviceMaintenance; + + @Schema(description = "设备保养占比") + private String deviceMaintenanceProportion; + + @Schema(description = "模具保养") + private int moldMaintenance; + + @Schema(description = "模具保养占比") + private String moldMaintenanceProportion; + + @Schema(description = "设备维修") + private int deviceRepair; + + @Schema(description = "设备维修占比") + private String deviceRepairProportion; + + @Schema(description = "模具维修") + private int moldRepair; + + @Schema(description = "模具维修占比") + private String moldRepairProportion; + + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/TaskVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/TaskVO.java new file mode 100644 index 000000000..76e0ae9dc --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dashboard/vo/dashboard/TaskVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 大屏任务返回 VO") +@Data +@ToString(callSuper = true) +public class TaskVO { + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "类型") + private String type; + + @Schema(description = "完成状态 0-待完成 1-已完成 2-已取消") + private String finishStatus; + + @Schema(description = "完成结果 1-通过 2-不通过") + private int resultStatus; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java index f66ad49ee..e4f3d6b52 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/DeviceLedgerController.java @@ -107,8 +107,6 @@ public class DeviceLedgerController { return success(respVO); } - - @GetMapping("/page") @Operation(summary = "获得设备台账分页") @PreAuthorize("@ss.hasPermission('mes:device-ledger:query')") @@ -117,7 +115,6 @@ public class DeviceLedgerController { return success(ResumeNameUtils.buildPageCreatorName(BeanUtils.toBean(pageResult, DeviceLedgerRespVO.class))); } - @GetMapping("/list") @Operation(summary = "获得设备台账列表") @PreAuthorize("@ss.hasPermission('mes:device-ledger:query')") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java index e819b2a72..a83da8254 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerPageReqVO.java @@ -24,7 +24,7 @@ public class DeviceLedgerPageReqVO extends PageParam { private String deviceName; @Schema(description = "设备状态 (0-正常, 1-停用, 2-维修, 3-报废)", example = "2") - private Integer deviceStatus; + private String deviceStatus; @Schema(description = "设备品牌") private String deviceBrand; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java index 3f064ea15..14e30b828 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/deviceledger/vo/DeviceLedgerRespVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.criticalcomponent.CriticalComponentDO; @@ -36,37 +38,35 @@ public class DeviceLedgerRespVO extends BaseDO { @ExcelProperty("设备名称") private String deviceName; - @Schema(description = "设备状态 (0-正常, 1-停用, 2-维修, 3-报废)", example = "2") - @ExcelProperty(value = "设备状态", converter = DeviceStatusConverter.class) - private Integer deviceStatus; + @Schema(description = "设备类型") + private String deviceType; - @Schema(description = "设备品牌") - @ExcelProperty("设备品牌") - private String deviceBrand; + @Schema(description = "设备类型名称", example = "1") + @ExcelProperty("类型") + private String typeName; - @Schema(description = "设备型号") - @ExcelProperty("设备型号") - private String deviceModel; + @Schema(description = "设备状态 (0-正常, 1-停用, 2-维修, 3-报废)", example = "2") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat("mes_tz_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String deviceStatus; @Schema(description = "设备规格") @ExcelProperty("设备规格") private String deviceSpec; - @Schema(description = "设备类型", example = "1") - @ExcelProperty("设备类型") - private String deviceType; - - @Schema(description = "供应商") - @ExcelProperty("供应商") - private String supplier; + @Schema(description = "设备型号") + @ExcelProperty("设备型号") + private String deviceModel; - @Schema(description = "所属车间") - @ExcelProperty("所属车间") - private String workshop; + @Schema(description = "设备生产日期") + @ExcelProperty("设备生产日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate productionDate; - @Schema(description = "所属系统组织") - @ExcelProperty("所属系统组织") - private String systemOrg; + @Schema(description = "设备入厂日期") + @ExcelProperty("设备入厂日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate factoryEntryDate; @Schema(description = "设备位置") @ExcelProperty("设备位置") @@ -79,38 +79,42 @@ public class DeviceLedgerRespVO extends BaseDO { @ExcelProperty("设备负责人名字") private String deviceManagerName; - - @Schema(description = "设备生产日期") - @ExcelProperty("设备生产日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate productionDate; - - @Schema(description = "设备入厂日期") - @ExcelProperty("设备入厂日期") - @DateTimeFormat(pattern = "yyyy-MM-dd") - private LocalDate factoryEntryDate; - - @Schema(description = "设备备注", example = "随便") - @ExcelProperty("设备备注") - private String deviceRemark; - @Schema(description = "备注", example = "随便") @ExcelProperty("备注") private String remark; - @Schema(description = "排序") -// @ExcelProperty("排序") - private Integer sort; + @Schema(description = "创建人名字", example = "随便") + @ExcelProperty("创建人名字") + private String creatorName; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") @ColumnWidth(20) private LocalDateTime createTime; + @Schema(description = "设备品牌") +// @ExcelProperty("设备品牌") + private String deviceBrand; - @Schema(description = "创建人名字", example = "随便") - @ExcelProperty("创建人名字") - private String creatorName; + @Schema(description = "供应商") +// @ExcelProperty("供应商") + private String supplier; + + @Schema(description = "所属车间") +// @ExcelProperty("所属车间") + private String workshop; + + @Schema(description = "所属系统组织") + @ExcelProperty("所属系统组织") + private String systemOrg; + + @Schema(description = "设备备注", example = "随便") + @ExcelProperty("设备备注") + private String deviceRemark; + + @Schema(description = "排序") +// @ExcelProperty("排序") + private Integer sort; @Schema(description = "点检结果列表") private List inspectionList; @@ -130,7 +134,7 @@ public class DeviceLedgerRespVO extends BaseDO { private List moldList; @Schema(description = "附件地址") - @ExcelProperty("附件地址") +// @ExcelProperty("附件地址") private String fileUrl; @Schema(description = "关键件id") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/DeviceTypeController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/DeviceTypeController.java index 2667ee725..93ba2b66a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/DeviceTypeController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/DeviceTypeController.java @@ -12,8 +12,12 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.io.IOException; +import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -126,12 +130,38 @@ public class DeviceTypeController { @Operation(summary = "导出设备类型 Excel") @PreAuthorize("@ss.hasPermission('mes:device-type:export')") @ApiAccessLog(operateType = EXPORT) - public void exportDeviceTypeExcel(@Valid DeviceTypePageReqVO pageReqVO, + public void exportDeviceTypeExcel(@Valid DeviceTypeListReqVO pageReqVO, HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceTypeService.getDeviceTypePage(pageReqVO).getList(); + + List deviceTypeList = deviceTypeService.getDeviceTypeList(pageReqVO); + List deviceTypeRespVOList = BeanUtils.toBean(deviceTypeList, DeviceTypeRespVO.class); + // 创建ID到名称的映射 + Map idToNameMap = deviceTypeList.stream() + .collect(Collectors.toMap( + DeviceTypeDO::getId, + DeviceTypeDO::getName, + (v1, v2) -> v1 + )); + + // 设置父类名称 + for (DeviceTypeRespVO deviceTypeRespVO : deviceTypeRespVOList) { + if (deviceTypeRespVO.getParentId() != null && deviceTypeRespVO.getParentId() > 0) { + // 从映射中获取父类名称 + deviceTypeRespVO.setParentName(idToNameMap.getOrDefault(deviceTypeRespVO.getParentId(), "")); + } else { + deviceTypeRespVO.setParentName("顶级分类"); + } + } + + + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("维修记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("维修记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 导出 Excel - ExcelUtils.write(response, "设备类型.xls", "数据", DeviceTypeRespVO.class, - BeanUtils.toBean(list, DeviceTypeRespVO.class)); + ExcelUtils.write(response, fileName, "数据", DeviceTypeRespVO.class,deviceTypeRespVOList); } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/vo/DeviceTypeRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/vo/DeviceTypeRespVO.java index 6798e8cf8..063c5a37f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/vo/DeviceTypeRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/devicetype/vo/DeviceTypeRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.devicetype.vo; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -14,7 +15,7 @@ import com.alibaba.excel.annotation.*; public class DeviceTypeRespVO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3230") - @ExcelProperty("id") +// @ExcelProperty("id") private Long id; @Schema(description = "编码", requiredMode = Schema.RequiredMode.REQUIRED) @@ -35,8 +36,13 @@ public class DeviceTypeRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; + @Schema(description = "父设备类型名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("父设备类型名称") + private String parentName; + private Long parentId; /** */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/DvRepairController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/DvRepairController.java index 3d4ac4e89..dc18c11d7 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/DvRepairController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/DvRepairController.java @@ -6,12 +6,11 @@ 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.mes.controller.admin.dvrepair.enums.RepairEnum; +import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums.RepairStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.vo.*; -import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketInspectionExportVO; -import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketResultsSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; import cn.iocoder.yudao.module.mes.service.dvrepair.DvRepairService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -115,15 +114,22 @@ public class DvRepairController { dvSubjectRespVO.setConfirmBy("(" + user.getUsername() + ")" + user.getNickname()); } if (dvSubjectRespVO.getStatus() !=null) { - dvSubjectRespVO.setStatusName(dvSubjectRespVO.getStatus() != null ? - (dvSubjectRespVO.getStatus() == 0 ? "待完成" : "已完成") : null); + String statusName = RepairStatusEnum.getDescriptionByCode(dvSubjectRespVO.getStatus()); + dvSubjectRespVO.setStatusName(statusName); } if (dvSubjectRespVO.getRepairStatus() !=null) { - dvSubjectRespVO.setRepairStatusName(dvSubjectRespVO.getRepairStatus() != null ? - (dvSubjectRespVO.getRepairStatus() == 1 ? "通过" : "不通过") : null); + String repairStatusName = RepairEnum.getDescriptionByCode(dvSubjectRespVO.getRepairStatus()); + dvSubjectRespVO.setRepairStatusName(repairStatusName); } } + + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("设备维修记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + String fileName = String.format("设备维修记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 导出 Excel ExcelUtils.write(response, "设备维修记录.xls", "数据", DvRepairRespVO.class,dvRepairRespVOList); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairEnum.java new file mode 100644 index 000000000..776f011d6 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairEnum.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 维修状态枚举 + * 0-待完成 1-通过 2-不通过 + */ +@Getter +public enum RepairEnum { + + PENDING(0, "待维修"), + PASSED(1, "通过"), + FAILED(2, "不通过"); + + private final Integer code; + private final String description; + + RepairEnum(Integer code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据code获取枚举 + */ + public static RepairEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (RepairEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + /** + * 根据code获取描述 + */ + public static String getDescriptionByCode(Integer code) { + RepairEnum status = getByCode(code); + return status != null ? status.getDescription() : "未知"; + } + + /** + * 检查code是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + /** + * 获取所有code列表 + */ + public static List getAllCodes() { + return Arrays.stream(values()) + .map(RepairEnum::getCode) + .collect(Collectors.toList()); + } + + /** + * 获取所有描述列表 + */ + public static List getAllDescriptions() { + return Arrays.stream(values()) + .map(RepairEnum::getDescription) + .collect(Collectors.toList()); + } + + /** + * 获取code和描述的映射 + */ + public static Map getCodeDescriptionMap() { + Map map = new LinkedHashMap<>(); + for (RepairEnum status : values()) { + map.put(status.getCode(), status.getDescription()); + } + return map; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairStatusEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairStatusEnum.java new file mode 100644 index 000000000..4ecebdead --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/enums/RepairStatusEnum.java @@ -0,0 +1,87 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 状态枚举 + * 0-待完成 1-已完成 + */ +@Getter +public enum RepairStatusEnum { + + PENDING(0, "待完成"), + COMPLETED(1, "已完成"); + + private final Integer code; + private final String description; + + RepairStatusEnum(Integer code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据code获取枚举 + */ + public static RepairStatusEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (RepairStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + /** + * 根据code获取描述 + */ + public static String getDescriptionByCode(Integer code) { + RepairStatusEnum status = getByCode(code); + return status != null ? status.getDescription() : "未知"; + } + + /** + * 检查code是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + /** + * 获取所有code列表 + */ + public static List getAllCodes() { + return Arrays.stream(values()) + .map(RepairStatusEnum::getCode) + .collect(Collectors.toList()); + } + + /** + * 获取所有描述列表 + */ + public static List getAllDescriptions() { + return Arrays.stream(values()) + .map(RepairStatusEnum::getDescription) + .collect(Collectors.toList()); + } + + /** + * 获取code和描述的映射 + */ + public static Map getCodeDescriptionMap() { + Map map = new LinkedHashMap<>(); + for (RepairStatusEnum status : values()) { + map.put(status.getCode(), status.getDescription()); + } + return map; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairRespVO.java index a2621748a..f6c153a9e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvrepair/vo/DvRepairRespVO.java @@ -2,6 +2,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.dvrepair.vo; import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums.MoldRecordStatusEnum; import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -33,39 +38,52 @@ public class DvRepairRespVO { // @ExcelProperty("设备ID") private Long machineryId; - @Schema(description = "设备编码", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("设备编码") - private String machineryCode; @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") @ExcelProperty("设备名称") private String machineryName; - @Schema(description = "品牌") - @ExcelProperty("品牌") - private String machineryBrand; + @Schema(description = "设备编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("设备编码") + private String machineryCode; + +// @Schema(description = "品牌") +// @ExcelProperty("品牌") +// private String machineryBrand; @Schema(description = "规格型号") @ExcelProperty("规格型号") private String machinerySpec; @Schema(description = "设备类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1622") -// @ExcelProperty(value = "设备类型", converter = DictConvert.class) + @ExcelProperty(value = "设备类型", converter = DictConvert.class) @DictFormat("mes_machine_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private Long machineryTypeId; @Schema(description = "报修日期") @ExcelProperty("报修日期") + @DateTimeFormat(fallbackPatterns = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) @ColumnWidth(20) private LocalDateTime requireDate; @Schema(description = "完成日期") @ExcelProperty("完成日期") + @DateTimeFormat(fallbackPatterns = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) @ColumnWidth(20) private LocalDateTime finishDate; @Schema(description = "验收日期") @ExcelProperty("验收日期") + @DateTimeFormat(fallbackPatterns = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) @ColumnWidth(20) private LocalDateTime confirmDate; @@ -81,18 +99,15 @@ public class DvRepairRespVO { @ExcelProperty("验收人员") private String confirmBy; - @Schema(description = "单据状态", example = "1") - @ExcelProperty(value = "单据状态 0-待完成 1-已完成") - @DictFormat("mes_mold_record_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + @Schema(description = "单据状态 0-待完成 1-已完成", example = "1") private Integer status; @Schema(description = "单据状态", example = "1") - @ExcelProperty(value = "单据状态 0-待完成 1-已完成") - @DictFormat("mes_mold_record_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + @ExcelProperty(value = "单据状态") private String statusName; @Schema(description = "备注", example = "你猜") - @ExcelProperty("备注") +// @ExcelProperty("备注") private String remark; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java index 06b7afbda..246784684 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/DvSubjectController.java @@ -121,31 +121,31 @@ public class DvSubjectController { List list = dvSubjectService.getDvSubjectPage(pageReqVO).getList(); List dvSubjectRespVOList = BeanUtils.toBean(list, DvSubjectRespVO.class); - // 1. 获取字典数据 - Map> dictData = getDictData(); +// 1. 获取字典数据 +// Map> dictData = getDictData(); for (DvSubjectRespVO dvSubjectRespVO : dvSubjectRespVOList) { AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(dvSubjectRespVO.getCreator())); dvSubjectRespVO.setCreatorName("(" + user.getUsername()+ ")" + user.getNickname()); - // 转换检验方式字典值 - if (StringUtils.isNotBlank(dvSubjectRespVO.getInspectionMethod())) { - String inspectionMethodLabel = dictData.get("Inspection_method") - .get(dvSubjectRespVO.getInspectionMethod()); - if (StringUtils.isNotBlank(inspectionMethodLabel)) { - // 可以创建一个临时字段存储,或者直接替换原字段 - dvSubjectRespVO.setInspectionMethod(inspectionMethodLabel); - } - } - - // 转换值类型字典值 - if (StringUtils.isNotBlank(dvSubjectRespVO.getValueType())) { - String valueTypeLabel = dictData.get("value_types") - .get(dvSubjectRespVO.getValueType()); - if (StringUtils.isNotBlank(valueTypeLabel)) { - dvSubjectRespVO.setValueType(valueTypeLabel); - } - } +// // 转换检验方式字典值 +// if (StringUtils.isNotBlank(dvSubjectRespVO.getInspectionMethod())) { +// String inspectionMethodLabel = dictData.get("Inspection_method") +// .get(dvSubjectRespVO.getInspectionMethod()); +// if (StringUtils.isNotBlank(inspectionMethodLabel)) { +// // 可以创建一个临时字段存储,或者直接替换原字段 +// dvSubjectRespVO.setInspectionMethod(inspectionMethodLabel); +// } +// } +// +// // 转换值类型字典值 +// if (StringUtils.isNotBlank(dvSubjectRespVO.getValueType())) { +// String valueTypeLabel = dictData.get("value_types") +// .get(dvSubjectRespVO.getValueType()); +// if (StringUtils.isNotBlank(valueTypeLabel)) { +// dvSubjectRespVO.setValueType(valueTypeLabel); +// } +// } } // 导出 Excel diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java index 6399b1e74..675f8d547 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dvsubject/vo/DvSubjectRespVO.java @@ -52,11 +52,13 @@ public class DvSubjectRespVO{ private LocalDateTime createTime; @Schema(description = "检验方式") - @ExcelProperty("检验方式") + @ExcelProperty(value = "检验方式", converter = DictConvert.class) + @DictFormat("Inspection_method") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private String inspectionMethod; @Schema(description = "值类型") - @ExcelProperty("值类型") + @ExcelProperty(value = "值类型", converter = DictConvert.class) + @DictFormat("value_types") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private String valueType; @Schema(description = "判定基准") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/EnergyDeviceController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/EnergyDeviceController.java index a419a9b23..cd83e1257 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/EnergyDeviceController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/EnergyDeviceController.java @@ -21,7 +21,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; @@ -104,8 +107,6 @@ public class EnergyDeviceController { return success(energyDeviceService.queryDataRecords(deviceConsumptionReqVO)); } - - @GetMapping("/record-export-excel") @Operation(summary = "导出数据记录 Excel") @PreAuthorize("@ss.hasPermission('mes:energy-device:export')") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRecordRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRecordRespVO.java index 8ea039a56..da5edbecd 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRecordRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRecordRespVO.java @@ -29,12 +29,12 @@ public class EnergyDeviceRecordRespVO { private String energyConsumption; @Schema(description = "最新数据时间") - @ExcelProperty("开始时间") + @ExcelProperty("最新数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private String latestDataTime; @Schema(description = "最早数据时间") - @ExcelProperty("结束时间") + @ExcelProperty("最早数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private String earliestDataTime; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRespVO.java index 09975d372..24ff71a2e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/EnergyDeviceRespVO.java @@ -64,7 +64,8 @@ public class EnergyDeviceRespVO { private String deviceTypeName; @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("是否启用") + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private Boolean isEnable; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/TimePointCache.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/TimePointCache.java new file mode 100644 index 000000000..827a19a10 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energydevice/vo/TimePointCache.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.mes.controller.admin.energydevice.vo; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Map; + +@Data +public class TimePointCache { + private LocalDateTime timestamp; + private String queryData; + private Map pointIndex; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/EnergyTypeController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/EnergyTypeController.java index 22d4b5343..bd367a495 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/EnergyTypeController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/EnergyTypeController.java @@ -12,6 +12,9 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.io.IOException; @@ -88,8 +91,16 @@ public class EnergyTypeController { HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = energyTypeService.getEnergyTypePage(pageReqVO).getList(); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("能耗类型.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("能耗类型_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + // 导出 Excel - ExcelUtils.write(response, "能耗类型.xls", "数据", EnergyTypeRespVO.class, + ExcelUtils.write(response, fileName, "数据", EnergyTypeRespVO.class, BeanUtils.toBean(list, EnergyTypeRespVO.class)); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypePageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypePageReqVO.java index 3a3d358c7..44e0e0c48 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypePageReqVO.java @@ -34,6 +34,7 @@ public class EnergyTypePageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; - + @Schema(description = "id集合导出用") + private String ids; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypeRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypeRespVO.java index ad7447be5..c07a69e70 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypeRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/energytype/vo/EnergyTypeRespVO.java @@ -1,5 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.energytype.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -13,7 +16,7 @@ import com.alibaba.excel.annotation.*; public class EnergyTypeRespVO { @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19123") - @ExcelProperty("ID") +// @ExcelProperty("ID") private Long id; @Schema(description = "能耗类型编码", requiredMode = Schema.RequiredMode.REQUIRED) @@ -29,7 +32,8 @@ public class EnergyTypeRespVO { private String unit; @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("是否启用") + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private Boolean isEnable; @Schema(description = "备注", example = "随便") @@ -38,6 +42,7 @@ public class EnergyTypeRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java index 10cef9390..79454a1fd 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/PlanMaintenanceController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.planmaintenance; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.TicketManagementRespVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.subjectplan.SubjectPlanDO; @@ -118,8 +119,14 @@ public class PlanMaintenanceController { List planMaintenanceRespVOS = BeanUtils.toBean(list, PlanMaintenanceRespVO.class); for (PlanMaintenanceRespVO planMaintenanceRespVO : planMaintenanceRespVOS) { - AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); - planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + if(planMaintenanceRespVO.getCreator()!=null){ + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); + planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + if (planMaintenanceRespVO.getPlanType()!=null){ + String planName = PlanTypeEnum.getDescriptionByCode(planMaintenanceRespVO.getPlanType()); + planMaintenanceRespVO.setPlanName(planName); + } } // 导出 Excel diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java index 372aa3fc7..fea0acb66 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenancePageReqVO.java @@ -18,7 +18,7 @@ public class PlanMaintenancePageReqVO extends PageParam { @Schema(description = "名称", example = "王五") private String planName; - @Schema(description = "名称", example = "1") + @Schema(description = "类型", example = "1") private Integer planType; @Schema(description = "描述", example = "你猜") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java index dd9857635..433b75256 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/planmaintenance/vo/PlanMaintenanceRespVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.planmaintenance.vo; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -14,16 +15,19 @@ import com.alibaba.excel.annotation.*; public class PlanMaintenanceRespVO extends BaseDO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19033") - @ExcelProperty("id") +// @ExcelProperty("id") private Long id; @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") @ExcelProperty("名称") private String planName; - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("名称") - private int planType; + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer planType; + + @Schema(description = "类型名称", example = "你猜") + @ExcelProperty("类型名称") + private String planTypeName; @Schema(description = "描述", example = "你猜") @ExcelProperty("描述") @@ -31,6 +35,7 @@ public class PlanMaintenanceRespVO extends BaseDO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "项目集合ids") diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/repairtems/vo/RepairTemsRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/repairtems/vo/RepairTemsRespVO.java index c352adf92..b7ed6d192 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/repairtems/vo/RepairTemsRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/repairtems/vo/RepairTemsRespVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.repairtems.vo; import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -17,19 +18,19 @@ public class RepairTemsRespVO { // @ExcelProperty("ID") private Long id; - @Schema(description = "项目编码", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("项目编码") + @Schema(description = "维修编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("维修编码") private String subjectCode; - @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") - @ExcelProperty("项目名称") + @Schema(description = "维修名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("维修名称") private String subjectName; @Schema(description = "设备类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer deviceType; @Schema(description = "设备类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("项目名称") + @ExcelProperty("设备类型") private String deviceTypeName; @Schema(description = "设备id", example = "11632") @@ -58,6 +59,7 @@ public class RepairTemsRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "设备名称") @@ -72,8 +74,8 @@ public class RepairTemsRespVO { @ExcelProperty("创建人名称") private String creatorName; - @Schema(description = "项目内容") - @ExcelProperty("项目内容") + @Schema(description = "维修内容") + @ExcelProperty("维修内容") private String projectContent; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java index e8b36d2bd..8e10b16e6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/TaskManagementController.java @@ -1,8 +1,13 @@ package cn.iocoder.yudao.module.mes.controller.admin.taskmanagement; import cn.iocoder.yudao.module.mes.controller.admin.planmaintenance.vo.PlanMaintenanceRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.planmaintenance.PlanMaintenanceDO; +import cn.iocoder.yudao.module.mes.service.planmaintenance.PlanMaintenanceService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import jodd.util.StringUtil; +import org.apache.commons.lang.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -42,6 +47,8 @@ public class TaskManagementController { @Resource private TaskManagementService taskManagementService; @Resource + private PlanMaintenanceService planMaintenanceService; + @Resource private AdminUserApi adminUserApi; @@ -105,8 +112,51 @@ public class TaskManagementController { List taskManagementRespVOList = BeanUtils.toBean(list, TaskManagementRespVO.class); for (TaskManagementRespVO planMaintenanceRespVO : taskManagementRespVOList) { - AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); - planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + if (planMaintenanceRespVO.getCreator()!=null){ + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); + planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + if (planMaintenanceRespVO.getProjectForm()!=null){ + PlanMaintenanceDO planMaintenance = planMaintenanceService.getPlanMaintenance(planMaintenanceRespVO.getProjectForm()); + planMaintenanceRespVO.setProjectFormName(planMaintenance.getPlanName()); + } + + if (planMaintenanceRespVO.getTaskType()!=null){ + String planName = PlanTypeEnum.getDescriptionByCode(planMaintenanceRespVO.getTaskType()); + planMaintenanceRespVO.setTypeName(planName); + } + + //操作人 +// if (StringUtils.isNotBlank(planMaintenanceRespVO.getOperableUsers())){ +// List idList = Arrays.stream(planMaintenanceRespVO.getOperableUsers().split(",")) +// .map(String::trim) +// .map(Long::valueOf) +// .collect(Collectors.toList()); +// +// StringBuilder userInfoBuilder = new StringBuilder(); +// for (int i = 0; i < idList.size(); i++) { +// Long id = idList.get(i); +// AdminUserRespDTO user = adminUserApi.getUser(id); +// if (user != null) { +// // 格式:(用户名)昵称 +// userInfoBuilder.append("(") +// .append(user.getUsername()) +// .append(")") +// .append(user.getNickname()); +// +// // 如果不是最后一个,添加分隔符 +// if (i < idList.size() - 1) { +// userInfoBuilder.append(", "); +// } +// } +// } +// +// if (userInfoBuilder.length() > 0) { +// planMaintenanceRespVO.setCreatorName(userInfoBuilder.toString()); +// } +// } + + } // 导出 Excel ExcelUtils.write(response, "设备类型.xls", "数据", TaskManagementRespVO.class,taskManagementRespVOList); @@ -133,9 +183,11 @@ public class TaskManagementController { private PageResult buildPageCreatorName(PageResult planMaintenanceRespVOPageResult) { for (TaskManagementRespVO planMaintenanceRespVO : planMaintenanceRespVOPageResult.getList()) { - AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); - if (user!=null){ - planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + if (planMaintenanceRespVO.getCreator()!=null){ + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(planMaintenanceRespVO.getCreator())); + if (user!=null){ + planMaintenanceRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } } } return planMaintenanceRespVOPageResult; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java index 0db8c6c2d..e7d8d66ee 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.mes.controller.admin.taskmanagement.scheduled.co import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task; -import cn.iocoder.yudao.module.iot.service.device.TDengineService; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.subjectplan.SubjectPlanDO; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/vo/TaskManagementRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/vo/TaskManagementRespVO.java index 2b5247742..c8b3342cc 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/vo/TaskManagementRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/vo/TaskManagementRespVO.java @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.mes.controller.admin.taskmanagement.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -29,17 +32,24 @@ public class TaskManagementRespVO extends BaseDO { private String name; @Schema(description = "类型(1-点检 2-保养)", example = "2") - @ExcelProperty("类型(1-点检 2-保养)") private Integer taskType; + @Schema(description = "类型名称") + @ExcelProperty("类型名称") + private String TypeName; + + @Schema(description = "设备列表") - @ExcelProperty("设备列表") +// @ExcelProperty("设备列表") private String deviceList; @Schema(description = "项目表单") - @ExcelProperty("项目表单") private Long projectForm; + @Schema(description = "项目表单名称") + @ExcelProperty("项目表单名称") + private String projectFormName; + @Schema(description = "起止开始日期") @ExcelProperty("起止开始日期") @JsonFormat(pattern = "yyyy-MM-dd") @@ -55,23 +65,23 @@ public class TaskManagementRespVO extends BaseDO { private String cronExpression; @Schema(description = "可操作人") - @ExcelProperty("可操作人") +// @ExcelProperty("可操作人") private String operableUsers; @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("是否启用") + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 private Boolean enabled; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "创建人名字") @ExcelProperty("创建人名字") private String creatorName; - @Schema(description = "项目表单名称") - @ExcelProperty("项目表单名称") - private String projectFormName; + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java index acbb7ac43..04b10190d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/TicketManagementController.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement; import cn.iocoder.yudao.module.mes.controller.admin.deviceledger.vo.DeviceLedgerRespVO; import cn.iocoder.yudao.module.mes.controller.admin.moldsubject.vo.MoldSubjectRespVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.InspectionResultEnum; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.JobResultEnum; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketInspectionExportVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketResultsPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketResultsRespVO; @@ -112,8 +114,19 @@ public class TicketManagementController { List list = ticketManagementService.getTicketManagementPage(pageReqVO).getList(); List ticketManagementRespVOList = BeanUtils.toBean(list, TicketManagementRespVO.class); for (TicketManagementRespVO ticketManagementRespVO : ticketManagementRespVOList) { - AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(ticketManagementRespVO.getCreator())); - ticketManagementRespVO.setCreatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + if(ticketManagementRespVO.getOperator() != null){ + AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(ticketManagementRespVO.getOperator())); + ticketManagementRespVO.setOperatorName( "(" + user.getUsername()+ ")" + user.getNickname()); + } + + if (ticketManagementRespVO.getPlanType()!=null){ + String planName = PlanTypeEnum.getDescriptionByCode(ticketManagementRespVO.getPlanType()); + ticketManagementRespVO.setPlanTypeName(planName); + } + if (ticketManagementRespVO.getJobResult()!=null){ + String jobResultName = JobResultEnum.getDescriptionByCode(ticketManagementRespVO.getJobResult()); + ticketManagementRespVO.setJobResultName(jobResultName); } + } // 导出 Excel diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobResultEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobResultEnum.java new file mode 100644 index 000000000..496392a3e --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobResultEnum.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 作业结果枚举 + * 0-待完成 1-通过 2-不通过 + */ +@Getter +public enum JobResultEnum { + + PENDING(0, "待完成"), + PASSED(1, "通过"), + FAILED(2, "不通过"); + + private final Integer code; + private final String description; + + JobResultEnum(Integer code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据code获取枚举 + */ + public static JobResultEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (JobResultEnum result : values()) { + if (result.getCode().equals(code)) { + return result; + } + } + return null; + } + + /** + * 根据code获取描述 + */ + public static String getDescriptionByCode(Integer code) { + JobResultEnum result = getByCode(code); + return result != null ? result.getDescription() : "未知"; + } + + /** + * 检查code是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + /** + * 获取所有code列表 + */ + public static List getAllCodes() { + return Arrays.stream(values()) + .map(JobResultEnum::getCode) + .collect(Collectors.toList()); + } + + /** + * 获取所有描述列表 + */ + public static List getAllDescriptions() { + return Arrays.stream(values()) + .map(JobResultEnum::getDescription) + .collect(Collectors.toList()); + } + + /** + * 获取code和描述的映射 + */ + public static Map getCodeDescriptionMap() { + Map map = new LinkedHashMap<>(); + for (JobResultEnum result : values()) { + map.put(result.getCode(), result.getDescription()); + } + return map; + } +} \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobStatusEnum.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobStatusEnum.java new file mode 100644 index 000000000..96e074dd9 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/enums/JobStatusEnum.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 作业状态枚举 + * 0-待完成 1-已完成 2-已取消 + */ +@Getter +public enum JobStatusEnum { + + PENDING(0, "待完成"), + COMPLETED(1, "已完成"), + CANCELED(2, "已取消"); + + private final Integer code; + private final String description; + + JobStatusEnum(Integer code, String description) { + this.code = code; + this.description = description; + } + + /** + * 根据 code 获取枚举 + */ + public static JobStatusEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (JobStatusEnum status : values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return null; + } + + /** + * 根据 code 获取描述 + */ + public static String getDescriptionByCode(Integer code) { + JobStatusEnum status = getByCode(code); + return status != null ? status.getDescription() : "未知"; + } + + /** + * 校验 code 是否有效 + */ + public static boolean isValidCode(Integer code) { + return getByCode(code) != null; + } + + /** + * 获取所有 code 列表 + */ + public static List getAllCodes() { + return Arrays.stream(values()) + .map(JobStatusEnum::getCode) + .collect(Collectors.toList()); + } + + /** + * 获取所有描述列表 + */ + public static List getAllDescriptions() { + return Arrays.stream(values()) + .map(JobStatusEnum::getDescription) + .collect(Collectors.toList()); + } + + /** + * 获取 code -> 描述 映射 + */ + public static Map getCodeDescriptionMap() { + Map map = new LinkedHashMap<>(); + for (JobStatusEnum status : values()) { + map.put(status.getCode(), status.getDescription()); + } + return map; + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java index bcb207a71..099b8aef3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementPageReqVO.java @@ -39,7 +39,7 @@ public class TicketManagementPageReqVO extends PageParam { private String configName; @Schema(description = "作业状态", example = "1") - private Integer jobStatus; + private String jobStatus; @Schema(description = "作业结果") private String jobResult; diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java index cdf54d4fb..6345cd70f 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/ticketmanagement/vo/TicketManagementRespVO.java @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -20,7 +23,7 @@ import com.alibaba.excel.annotation.*; public class TicketManagementRespVO extends BaseDO { @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6566") - @ExcelProperty("id") +// @ExcelProperty("id") private Long id; @Schema(description = "任务Id", example = "21368") @@ -35,31 +38,34 @@ public class TicketManagementRespVO extends BaseDO { @ExcelProperty("单号") private String planNo; + @Schema(description = "类型类型(1-点检 2-保养)", example = "2") +// @ExcelProperty("类型") + private Integer planType; + + @Schema(description = "类型名称", example = "2") + @ExcelProperty("类型名称") + private String planTypeName; + @Schema(description = "设备名称", example = "张三") @ExcelProperty("设备名称") private String deviceName; - @Schema(description = "类型", example = "2") - @ExcelProperty("类型") - private String planType; + @Schema(description = "计划配置名称", example = "赵六") @ExcelProperty("计划配置名称") private String configName; @Schema(description = "作业状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("作业状态") - private Integer jobStatus; - - @Schema(description = "作业结果") - @ExcelProperty("作业结果") - private Integer jobResult; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - + @ExcelProperty(value = "作业状态", converter = DictConvert.class) + @DictFormat("job_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String jobStatus; + @Schema(description = "作业人") + private String operator; + @Schema(description = "作业人名称") + @ExcelProperty("作业人名称") + private String operatorName; /** * 作业开始时间 @@ -67,6 +73,8 @@ public class TicketManagementRespVO extends BaseDO { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @ExcelProperty("作业时间") + @ColumnWidth(20) private LocalDateTime taskTime; /** @@ -75,18 +83,33 @@ public class TicketManagementRespVO extends BaseDO { @JsonFormat(pattern = "yyyy-MM-dd") @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @ExcelProperty("计划结束作业时间") + @ColumnWidth(20) private LocalDateTime taskEndTime; + @Schema(description = "作业结果") +// @ExcelProperty("作业结果") + private Integer jobResult; + + @Schema(description = "作业结果名称") + @ExcelProperty("作业结果名称") + private String jobResultName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + @ColumnWidth(20) + private LocalDateTime createTime; + + + + + + @Schema(description = "创建人名字") - @ExcelProperty("创建人名字") +// @ExcelProperty("创建人名字") private String creatorName; - @Schema(description = "作业人") - private String operator; - @Schema(description = "作业人名称") - @ExcelProperty("作业人名称") - private String operatorName; } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java index 12f00f900..81561f1ac 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/deviceledger/DeviceLedgerDO.java @@ -45,7 +45,7 @@ public class DeviceLedgerDO extends BaseDO { /** * 设备状态 (0-正常, 1-停用, 2-维修, 3-报废) */ - private Integer deviceStatus; + private String deviceStatus; /** * 设备品牌 */ @@ -113,6 +113,12 @@ public class DeviceLedgerDO extends BaseDO { */ private String componentId; + /** + * 类型名称 + */ + @TableField(exist = false) + private String typeName; + /** * 点检列表 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dvrepair/DvRepairDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dvrepair/DvRepairDO.java index f8c91bd4f..d3d1f47e0 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dvrepair/DvRepairDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dvrepair/DvRepairDO.java @@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.*; import java.util.*; import java.time.LocalDateTime; @@ -9,6 +14,7 @@ import java.time.LocalDateTime; import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import org.springframework.format.annotation.DateTimeFormat; /** * 设备维修记录 DO @@ -67,14 +73,17 @@ public class DvRepairDO extends BaseDO { /** * 报修日期 */ + private LocalDateTime requireDate; /** * 完成日期 */ + private LocalDateTime finishDate; /** * 验收日期 */ + private LocalDateTime confirmDate; /** * 维修结果 diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java index 95903014e..a18a9bce2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/planmaintenance/PlanMaintenanceDO.java @@ -34,7 +34,7 @@ public class PlanMaintenanceDO extends BaseDO { /** * 类型 1-保养 2-维护 */ - private int planType; + private Integer planType; /** * 描述 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java index b61a30433..f2ebe9d76 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/ticketmanagement/TicketManagementDO.java @@ -61,7 +61,7 @@ public class TicketManagementDO extends BaseDO { /** * 作业状态 0-待完成 1-已完成 2-已取消 */ - private Integer jobStatus; + private String jobStatus; /** * 作业结果 0-待完成 1-通过 2-不通过 */ diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java index 84b672138..01fe01ed5 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dvrepair/DvRepairMapper.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvsubject.DvSubjectDO; import com.alibaba.excel.util.StringUtils; @@ -56,4 +57,5 @@ public interface DvRepairMapper extends BaseMapperX { return selectPage(reqVO,dvRepairDOLambdaQueryWrapperX ); } + void selectDeviceRepair(EventStatisticsVO eventStatisticsVO); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/energytype/EnergyTypeMapper.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/energytype/EnergyTypeMapper.java index 8a503ea46..15af0bfca 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/energytype/EnergyTypeMapper.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/energytype/EnergyTypeMapper.java @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.mes.dal.mysql.energytype; import java.util.*; +import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.energytype.EnergyTypeDO; +import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.mes.controller.admin.energytype.vo.*; @@ -19,14 +21,28 @@ import cn.iocoder.yudao.module.mes.controller.admin.energytype.vo.*; public interface EnergyTypeMapper extends BaseMapperX { default PageResult selectPage(EnergyTypePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX() .eqIfPresent(EnergyTypeDO::getCode, reqVO.getCode()) .likeIfPresent(EnergyTypeDO::getName, reqVO.getName()) .eqIfPresent(EnergyTypeDO::getUnit, reqVO.getUnit()) .eqIfPresent(EnergyTypeDO::getIsEnable, reqVO.getIsEnable()) .eqIfPresent(EnergyTypeDO::getRemark, reqVO.getRemark()) - .betweenIfPresent(EnergyTypeDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(EnergyTypeDO::getId)); + .betweenIfPresent(EnergyTypeDO::getCreateTime, reqVO.getCreateTime()); + + // 只有在ids不为空时才加入过滤条件 + if (StringUtils.isNotBlank(reqVO.getIds())) { + List idList = Arrays.stream(reqVO.getIds().split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toList()); + + if (!idList.isEmpty()) { + wrapper.in(EnergyTypeDO::getId, idList); + } + } + + return selectPage(reqVO, wrapper.orderByDesc(EnergyTypeDO::getId)); } default List select() { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java index 0f2a17230..9c2063896 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/deviceledger/DeviceLedgerServiceImpl.java @@ -6,10 +6,12 @@ import cn.iocoder.yudao.module.erp.controller.admin.mold.vo.MoldRespVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; import cn.iocoder.yudao.module.erp.dal.mysql.mold.MoldMapper; +import cn.iocoder.yudao.module.mes.dal.dataobject.devicetype.DeviceTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldBrandDO; import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.mes.dal.mysql.devicetype.DeviceTypeMapper; import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService; @@ -79,6 +81,9 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { @Resource private ErpProductUnitService productUnitService; + @Resource + private DeviceTypeMapper deviceTypeMapper; + @Override public Long createDeviceLedger(DeviceLedgerSaveReqVO createReqVO) { @@ -234,6 +239,12 @@ public class DeviceLedgerServiceImpl implements DeviceLedgerService { @Override public PageResult getDeviceLedgerPage(DeviceLedgerPageReqVO pageReqVO) { PageResult deviceLedgerDOPageResult = deviceLedgerMapper.selectPage(pageReqVO); + for (DeviceLedgerDO deviceLedgerDO : deviceLedgerDOPageResult.getList()) { + if (deviceLedgerDO.getDeviceType()!=null){ + DeviceTypeDO deviceTypeDO = deviceTypeMapper.selectById(deviceLedgerDO.getDeviceType()); + deviceLedgerDO.setTypeName(deviceTypeDO.getName()); + } + } return deviceLedgerDOPageResult; } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/devicetype/DeviceTypeServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/devicetype/DeviceTypeServiceImpl.java index 50512c343..9e9af4ce3 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/devicetype/DeviceTypeServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/devicetype/DeviceTypeServiceImpl.java @@ -229,6 +229,14 @@ public class DeviceTypeServiceImpl implements DeviceTypeService { Map> childrenMap = CollectionUtils.convertMultiMap( allDeviceTypes, DeviceTypeDO::getParentId); + // 创建ID到名称的映射 + Map parentNameMap = allDeviceTypes.stream() + .collect(Collectors.toMap( + DeviceTypeDO::getId, + DeviceTypeDO::getName, + (v1, v2) -> v1 + )); + // 获取根节点(parentId为空或0) List rootDeviceTypes = childrenMap.getOrDefault(0L, Collections.emptyList()); rootDeviceTypes.addAll(childrenMap.getOrDefault(null, Collections.emptyList())); @@ -239,7 +247,7 @@ public class DeviceTypeServiceImpl implements DeviceTypeService { // 递归构建树 return rootDeviceTypes.stream() - .map(deviceType -> convertToTree(deviceType, childrenMap)) + .map(deviceType -> convertToTree(deviceType, childrenMap,parentNameMap)) .collect(Collectors.toList()); } @@ -247,9 +255,18 @@ public class DeviceTypeServiceImpl implements DeviceTypeService { * 转换为树形节点 */ private DeviceTypeTreeRespVO convertToTree(DeviceTypeDO deviceType, - Map> childrenMap) { + Map> childrenMap,Map parentNameMap) { DeviceTypeTreeRespVO treeNode = BeanUtils.toBean(deviceType, DeviceTypeTreeRespVO.class); + // 设置父类名称 + if (deviceType.getParentId() != null && deviceType.getParentId() > 0) { + treeNode.setParentName(parentNameMap.getOrDefault(deviceType.getParentId(), "")); + } else { + treeNode.setParentName("顶级分类"); + } + + + // 获取子节点 List children = childrenMap.getOrDefault(deviceType.getId(), Collections.emptyList()); @@ -260,7 +277,7 @@ public class DeviceTypeServiceImpl implements DeviceTypeService { // 递归转换子节点 List childNodes = children.stream() - .map(child -> convertToTree(child, childrenMap)) + .map(child -> convertToTree(child, childrenMap,parentNameMap)) .collect(Collectors.toList()); treeNode.setChildren(childNodes); diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java index 492f2a838..4b6651784 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairService.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.mes.service.dvrepair; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.vo.*; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import javax.validation.Valid; import java.util.List; @@ -72,4 +74,10 @@ public interface DvRepairService { List getRepairListByDeviceId(Long deviceId, String startTime, String endTime,String ids); Long getRepairListCountByRepairStatus(); + + List getDvRepairDOListByStatus(); + + void selectCountDeviceRepair(EventStatisticsVO eventStatisticsVO); + + List getList(); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java index ba4ca21ee..cb85f48b6 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java @@ -5,13 +5,16 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums.RepairResultEnum; +import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.enums.RepairStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.dvrepair.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums.JobResultEnum; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.vo.TicketResultsSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.devicetype.DeviceTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairLineMapper; @@ -275,6 +278,28 @@ public class DvRepairServiceImpl implements DvRepairService { } + @Override + public List getDvRepairDOListByStatus() { + return dvRepairMapper.selectList(Wrappers.lambdaQuery() + .eq(DvRepairDO::getRepairStatus, 0)); + + } + + @Override + public void selectCountDeviceRepair(EventStatisticsVO eventStatisticsVO) { + + //设备待维修数量 + int count = dvRepairMapper.selectCount(Wrappers.lambdaQuery() + .eq(DvRepairDO::getStatus, RepairStatusEnum.PENDING.getCode())).intValue(); + + eventStatisticsVO.setDeviceRepair(count); + } + + @Override + public List getList() { + return dvRepairMapper.selectList(); + } + private LocalDateTime parseToLocalDateTime(String timeStr) { if (StringUtils.isBlank(timeStr)) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java index f71751604..ecc92e70d 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/energydevice/EnergyDeviceServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.energydevice; +import cn.iocoder.yudao.framework.common.pojo.DeviceEdgeData; 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; @@ -25,9 +26,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; -import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; @@ -249,972 +248,253 @@ public class EnergyDeviceServiceImpl implements EnergyDeviceService { } @Override - public List queryDataRecords(EnergyDeviceConsumptionReqVO deviceConsumptionReqVO) { + public List queryDataRecords(EnergyDeviceConsumptionReqVO req) { List result = new ArrayList<>(); - List energyDeviceDO = energyDeviceMapper.selectList( - Wrappers.lambdaQuery() - .in(StringUtils.isNotBlank(deviceConsumptionReqVO.getIds()), - EnergyDeviceDO::getId, - StringUtils.isNotBlank(deviceConsumptionReqVO.getIds()) - ? Arrays.asList(deviceConsumptionReqVO.getIds().split(",")) - : null) - .like(StringUtils.isNotBlank(deviceConsumptionReqVO.getName()), EnergyDeviceDO::getName, deviceConsumptionReqVO.getName()) - .eq(deviceConsumptionReqVO.getOrgId() != null, EnergyDeviceDO::getOrgId, deviceConsumptionReqVO.getOrgId()) - .orderByDesc(EnergyDeviceDO::getCreateTime)); - if (energyDeviceDO == null || energyDeviceDO.isEmpty()) { - throw exception(ENERGY_LIST_NOT_EXISTS); - } - - for (EnergyDeviceDO deviceDO : energyDeviceDO) { - if (StringUtils.isBlank(deviceDO.getRules())) { - continue; - } + // 查询设备列表 + List devices = queryDevices(req); + if (devices.isEmpty()) return result; - // 解析规则 - List operationRulesVOList = JSON.parseArray(deviceDO.getRules(), OperationRulesVO.class); - if (operationRulesVOList == null || operationRulesVOList.isEmpty()) { - continue; - } - - try { - // 计算设备结果 - EnergyDeviceRespVO deviceRespVO = buildEnergyDeviceRespVO(deviceDO, operationRulesVOList, deviceConsumptionReqVO.getStartTime(), deviceConsumptionReqVO.getEndTime()); - if (deviceRespVO != null) { - result.add(deviceRespVO); - } - } catch (Exception e) { - log.error("计算设备结果失败, deviceId: {}", deviceDO.getId(), e); + // 解析规则 & 收集所有 ruleDeviceIds 和点位ID + Map> deviceRulesMap = new HashMap<>(); + Set ruleDeviceIds = new HashSet<>(); + Set pointIds = new HashSet<>(); + for (EnergyDeviceDO device : devices) { + List rules = parseRules(device); + if (!rules.isEmpty()) { + deviceRulesMap.put(device.getId(), rules); + rules.forEach(r -> { + if (r.getDeviceId() != null) ruleDeviceIds.add(r.getDeviceId()); + if (r.getPointId() != null) pointIds.add(r.getPointId()); + }); } } - return result; - } + if (ruleDeviceIds.isEmpty()) return result; - /** - * 构建EnergyDeviceRespVO对象 - */ - private EnergyDeviceRespVO buildEnergyDeviceRespVO(EnergyDeviceDO deviceDO, - List rules, - String startTime, String endTime) { - if (deviceDO == null || rules == null || rules.isEmpty()) { - return null; - } - - EnergyDeviceRespVO respVO = new EnergyDeviceRespVO(); - - // 设置设备基本信息 - respVO.setId(deviceDO.getId()); - respVO.setName(deviceDO.getName()); - respVO.setCode(deviceDO.getCode()); - respVO.setInfo(deviceDO.getInfo()); - respVO.setCheckCron(deviceDO.getCheckCron()); - respVO.setLastCheckTime(deviceDO.getLastCheckTime()); - respVO.setLastCheckValue(deviceDO.getLastCheckValue()); - respVO.setUnitName(deviceDO.getUnitName()); - respVO.setIsEnable(deviceDO.getIsEnable()); - respVO.setCreateTime(deviceDO.getCreateTime()); - respVO.setUpdateTime(deviceDO.getUpdateTime()); - respVO.setDeviceTypeId(deviceDO.getDeviceTypeId()); - respVO.setDeviceTypeName(deviceDO.getDeviceTypeName()); - respVO.setOrgId(deviceDO.getOrgId()); - respVO.setOrgName(deviceDO.getOrgName()); - respVO.setRules(deviceDO.getRules()); - respVO.setOperationRulesVOList(rules); - - // 计算数据结果 - Map calculationResult = calculateDeviceData(deviceDO, rules, startTime, endTime); - if (calculationResult == null) { - return respVO; - } + // TDengine 查询所有设备首末数据 + Map edgeDataMap = + tDengineService.queryDeviceFirstAndLast(ruleDeviceIds, req.getStartTime(), req.getEndTime()); - // 设置能耗总用量差值 - Double totalDifference = (Double) calculationResult.get("totalDifference"); - if (totalDifference != null) { - respVO.setEnergyConsumption(formatDouble(totalDifference)); - } else { - respVO.setEnergyConsumption("0.0"); - } + // 构建缓存 + Map firstCache = buildCache(edgeDataMap, true); + Map lastCache = buildCache(edgeDataMap, false); - // 设置最新和最晚数据时间 - if (StringUtils.isNotBlank(startTime)) { - respVO.setEarliestDataTime(formatDateTime(startTime, "yyyy-MM-dd HH:mm")); - } - if (StringUtils.isNotBlank(endTime)) { - respVO.setLatestDataTime(formatDateTime(endTime, "yyyy-MM-dd HH:mm")); - } + // 批量获取点位信息(名称/单位)避免 N+1 查询 + Map pointInfoMap = batchGetPointInfoFromLocalDB(new ArrayList<>(pointIds)); - // 构建点位详情列表 - List pointDetails = buildPointDetails(calculationResult, deviceDO, rules); - respVO.setPointDetails(pointDetails); + // 逐设备计算 EnergyDeviceRespVO + for (EnergyDeviceDO device : devices) { + List rules = deviceRulesMap.get(device.getId()); + if (rules == null || rules.isEmpty()) continue; - return respVO; - } - - /** - * 格式化时间为指定格式 - */ - private String formatDateTime(String time, String pattern) { - if (StringUtils.isBlank(time)) { - return ""; - } - - try { - // 常见时间格式列表 - String[] possiblePatterns = { - "yyyy-MM-dd HH:mm:ss", - "yyyy-MM-dd HH:mm:ss.SSS", - "yyyy-MM-dd'T'HH:mm:ss", - "yyyy-MM-dd'T'HH:mm:ss.SSS", - "yyyy/MM/dd HH:mm:ss", - "yyyy-MM-dd HH:mm" - }; - - for (String possiblePattern : possiblePatterns) { - try { - SimpleDateFormat sdf = new SimpleDateFormat(possiblePattern); - Date date = sdf.parse(time); - SimpleDateFormat targetFormat = new SimpleDateFormat(pattern); - return targetFormat.format(date); - } catch (Exception e) { - continue; - } - } - - // 如果解析失败,尝试简单截取 - if (time.length() >= 16) { - return time.substring(0, 16); - } - - } catch (Exception e) { - log.warn("时间格式化失败: {}", time, e); - } - - return time; - } - /** - * 从数据中获取时间 - */ - /** - * 从数据中获取时间,格式化为 yyyy-MM-dd HH:mm:ss - */ - private String getTimeFromData(Map calculationResult, String dataKey) { - if (calculationResult == null || dataKey == null) { - return ""; + EnergyDeviceRespVO vo = calculateDevice(device, rules, firstCache, lastCache, pointInfoMap, req); + result.add(vo); } - Map timeData = (Map) calculationResult.get(dataKey); - if (timeData == null) { - return ""; - } - - Object timestamp = timeData.get("timestamp"); - if (timestamp == null) { - return ""; - } - - String timeStr = timestamp.toString(); - - // 如果已经是目标格式的长度,直接返回 - if (timeStr.length() == 19) { // yyyy-MM-dd HH:mm:ss - return timeStr; - } - - // 如果有毫秒部分,截取前19位 - if (timeStr.length() > 19 && timeStr.charAt(19) == '.') { - return timeStr.substring(0, 19); - } - - // 如果是其他格式,尝试解析 - try { - // 移除毫秒部分 - if (timeStr.contains(".")) { - timeStr = timeStr.substring(0, timeStr.indexOf(".")); - } - - // 确保格式正确 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - SimpleDateFormat originalSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - - try { - // 尝试用带毫秒的格式解析 - Date date = originalSdf.parse(timeStr); - return sdf.format(date); - } catch (Exception e) { - // 尝试不带毫秒解析 - try { - Date date = sdf.parse(timeStr); - return sdf.format(date); - } catch (Exception e2) { - // 如果不是标准格式,只做简单截取 - if (timeStr.length() > 19) { - return timeStr.substring(0, Math.min(19, timeStr.length())); - } - return timeStr; - } - } - } catch (Exception e) { - return timeStr; - } - } - - /** - * 从查询结果中提取特定点位的数据 - */ - private Map getPointData(Map dataMap, Long pointId) { - if (dataMap == null || pointId == null) { - return null; - } - - try { - Object queryDataObj = dataMap.get("queryData"); - if (queryDataObj == null) { - return null; - } - - String queryData = queryDataObj.toString(); - if (StringUtils.isBlank(queryData)) { - return null; - } - -// // 处理编码问题 -// queryData = fixEncoding(queryData); - - // 解析JSON数组 - JSONArray jsonArray = JSON.parseArray(queryData); - - for (int i = 0; i < jsonArray.size(); i++) { - JSONObject jsonObj = jsonArray.getJSONObject(i); - - // 安全获取id - Long dataPointId = null; - try { - dataPointId = jsonObj.getLong("id"); - } catch (Exception e) { - continue; - } - - if (dataPointId == null) { - continue; - } - - // 匹配点位ID - if (pointId.equals(dataPointId)) { - Map pointData = new HashMap<>(); - - // 提取所有需要的字段 - pointData.put("id", dataPointId); - - // 安全获取字段 - pointData.put("address", getJsonString(jsonObj, "address")); - - // 处理值 - Object value = jsonObj.get("addressValue"); - Double doubleValue = null; - if (value != null) { - try { - if (value instanceof Number) { - doubleValue = ((Number) value).doubleValue(); - } else { - doubleValue = Double.parseDouble(value.toString()); - } - } catch (NumberFormatException e) { - log.warn("点位值无法转换为数字: pointId={}, value={}", pointId, value); - doubleValue = null; - } - } - pointData.put("value", doubleValue); - pointData.put("addressValue", value); - - pointData.put("attributeCode", getJsonString(jsonObj, "attributeCode")); - pointData.put("attributeName", getJsonString(jsonObj, "attributeName")); - pointData.put("attributeType", getJsonString(jsonObj, "attributeType")); - pointData.put("dataType", getJsonString(jsonObj, "dataType")); - pointData.put("dataUnit", getJsonString(jsonObj, "dataUnit")); - - // 安全获取ratio - try { - Float ratio = jsonObj.getFloat("ratio"); - pointData.put("ratio", ratio); - } catch (Exception e) { - pointData.put("ratio", null); - } - - return pointData; - } - } - - } catch (Exception e) { - log.error("解析点位数据失败, pointId: {}", pointId, e); - } - - return null; - } - - /** - * 从JSON对象安全获取字符串 - */ - private String getJsonString(JSONObject jsonObj, String key) { - try { - return jsonObj.getString(key); - } catch (Exception e) { - return ""; - } + return result; } - /** - * 格式化double值为字符串 - */ - private String formatDouble(Double value) { - if (value == null) { - return "0.0"; - } +// =================== 核心方法 =================== - DecimalFormat df = new DecimalFormat("#.##"); - return df.format(value); + /** 查询设备列表 */ + private List queryDevices(EnergyDeviceConsumptionReqVO req) { + return energyDeviceMapper.selectList( + Wrappers.lambdaQuery() + .in(StringUtils.isNotBlank(req.getIds()), + EnergyDeviceDO::getId, + StringUtils.isNotBlank(req.getIds()) + ? Arrays.asList(req.getIds().split(",")) + : null) + .like(StringUtils.isNotBlank(req.getName()), EnergyDeviceDO::getName, req.getName()) + .eq(req.getOrgId() != null, EnergyDeviceDO::getOrgId, req.getOrgId()) + .orderByDesc(EnergyDeviceDO::getCreateTime) + ); } - /** - * 计算设备数据 - */ - private Map calculateDeviceData(EnergyDeviceDO deviceDO, - List rules, - String startTime, String endTime) { - if (deviceDO == null || rules == null || rules.isEmpty()) { - return null; - } - - Map result = new HashMap<>(); - + /** 解析设备规则 */ + private List parseRules(EnergyDeviceDO device) { + if (device == null || StringUtils.isBlank(device.getRules())) return Collections.emptyList(); try { - // 分别计算最新和最晚时间的数据 - Map latestData = getTimePointData(rules, startTime, endTime, true); - Map earliestData = getTimePointData(rules, startTime, endTime, false); - - if (latestData == null || earliestData == null) { - return result; - } - - // 提取实际采集时间 - String latestTime = extractTimestamp(latestData); - String earliestTime = extractTimestamp(earliestData); - - // 使用相同的规则计算两个时间点的总值 - Double latestTotal = calculateTotalByRules(latestData, rules); - Double earliestTotal = calculateTotalByRules(earliestData, rules); - - // 计算每个点位的差值 - List> pointDifferences = calculatePointDifferences(latestData, earliestData, rules); - - result.put("latestData", latestData); - result.put("earliestData", earliestData); - result.put("latestTime", latestTime); - result.put("earliestTime", earliestTime); - result.put("latestTotal", latestTotal != null ? latestTotal : 0.0); - result.put("earliestTotal", earliestTotal != null ? earliestTotal : 0.0); - result.put("totalDifference", (latestTotal != null && earliestTotal != null) ? - latestTotal - earliestTotal : 0.0); - result.put("pointDifferences", pointDifferences != null ? pointDifferences : Collections.emptyList()); - + return JSON.parseArray(device.getRules(), OperationRulesVO.class); } catch (Exception e) { - log.error("计算设备数据失败, deviceId: {}", deviceDO.getId(), e); - } - - return result; - } - - /** - * 从数据中提取时间戳 - */ - private String extractTimestamp(Map timePointData) { - if (timePointData == null) { - return ""; - } - - Object timestamp = timePointData.get("timestamp"); - if (timestamp != null) { - return timestamp.toString(); - } - - return ""; - } - - /** - * 从设备数据中获取点位值 - */ - private Double getPointValueFromDataByDevice(Map timePointData, Long deviceId, Long pointId) { - if (timePointData == null || deviceId == null || pointId == null) { - return null; + log.error("解析规则失败, deviceId={}", device.getId(), e); + return Collections.emptyList(); } - - String deviceKey = "device_" + deviceId; - Map deviceData = (Map) timePointData.get(deviceKey); - if (deviceData == null) { - return null; - } - - return getPointValueFromData(deviceData, pointId); } - /** - * 获取点位值 - */ - private Double getPointValueFromData(Map dataMap, Long pointId) { - if (dataMap == null || pointId == null) { - return null; - } - - Map pointData = getPointData(dataMap, pointId); - if (pointData != null) { - Object value = pointData.get("value"); - if (value instanceof Double) { - return (Double) value; - } else if (value instanceof Number) { - return ((Number) value).doubleValue(); - } + /** 构建缓存 */ + private Map buildCache(Map dataMap, boolean first) { + Map cache = new HashMap<>(); + for (DeviceEdgeData d : dataMap.values()) { + TimePointCache c = new TimePointCache(); + c.setTimestamp(first ? d.getFirstTs() : d.getLastTs()); + c.setQueryData(first ? d.getFirstData() : d.getLastData()); + cache.put(d.getDeviceId(), c); } - return null; + return cache; } - /** - * 获取指定时间点的数据 - */ - private Map getTimePointData(List rules, - String startTime, String endTime, - boolean isLatest) { - if (rules == null || rules.isEmpty()) { - return null; - } - - Map timePointData = new HashMap<>(); - String timestamp = null; + /** 单设备计算 */ + private EnergyDeviceRespVO calculateDevice(EnergyDeviceDO device, + List rules, + Map firstCache, + Map lastCache, + Map pointInfoMap, + EnergyDeviceConsumptionReqVO req) { - for (OperationRulesVO rule : rules) { - if (rule == null || rule.getDeviceId() == null) { - continue; - } - - List> maps = null; - try { - maps = tDengineService.getstDeviceDataOrderByTimeDesc( - rule.getDeviceId(), startTime, endTime); - } catch (Exception e) { - log.error("查询设备数据失败, deviceId: {}", rule.getDeviceId(), e); - continue; - } - - if (maps == null || maps.isEmpty()) { - continue; - } - - Map dataMap = null; - try { - if (isLatest) { - dataMap = maps.get(0); - } else { - dataMap = maps.get(maps.size() - 1); - } - } catch (Exception e) { - log.error("获取时间点数据失败, deviceId: {}, isLatest: {}", rule.getDeviceId(), isLatest, e); - continue; - } - - if (dataMap == null) { - continue; - } + Double firstTotal = calculateByRules(rules, firstCache); + Double lastTotal = calculateByRules(rules, lastCache); - if (timestamp == null && dataMap.containsKey("timestamp")) { - Object tsObj = dataMap.get("timestamp"); - if (tsObj != null) { - timestamp = tsObj.toString(); - } - } + EnergyDeviceRespVO vo = new EnergyDeviceRespVO(); + vo.setId(device.getId()); + vo.setName(device.getName()); + vo.setCode(device.getCode()); + vo.setOrgId(device.getOrgId()); + vo.setOrgName(device.getOrgName()); + vo.setCreateTime(device.getCreateTime()); + vo.setUpdateTime(device.getUpdateTime()); + vo.setRules(device.getRules()); - String deviceKey = "device_" + rule.getDeviceId(); - if (!timePointData.containsKey(deviceKey)) { - timePointData.put(deviceKey, dataMap); - } - } + vo.setEnergyConsumption(formatDouble(lastTotal - firstTotal)); + vo.setEarliestDataTime(req.getStartTime()); + vo.setLatestDataTime(req.getEndTime()); - if (timestamp != null) { - timePointData.put("timestamp", timestamp); - } else { - timePointData.put("timestamp", ""); - } + // 构建点位详情 + vo.setPointDetails(buildPointDetails(rules, firstCache, lastCache, pointInfoMap)); - return timePointData.isEmpty() ? null : timePointData; + return vo; } - /** - * 根据规则计算总值 - */ - private Double calculateTotalByRules(Map timePointData, List rules) { - if (timePointData == null || timePointData.isEmpty() || rules == null || rules.isEmpty()) { - return 0.0; - } - + /** 根据规则计算总值 */ + private Double calculateByRules(List rules, Map cache) { Double total = null; - String lastOperator = null; + String lastOp = "+"; - for (int i = 0; i < rules.size(); i++) { - OperationRulesVO rule = rules.get(i); - if (rule == null || rule.getDeviceId() == null || rule.getPointId() == null) { - continue; - } + for (OperationRulesVO r : rules) { + TimePointCache c = cache.get(r.getDeviceId()); + if (c == null) continue; - String deviceKey = "device_" + rule.getDeviceId(); - Map deviceData = (Map) timePointData.get(deviceKey); - if (deviceData == null) { - continue; - } - - Double pointValue = getPointValueFromData(deviceData, rule.getPointId()); - if (pointValue == null) { - continue; - } + Double value = getPointValue(c, r.getPointId()); + if (value == null) continue; if (total == null) { - total = pointValue; + total = value; } else { - String operator = null; - if (rule.getOperator() != null) { - operator = rule.getOperator().trim(); - } - - if (StringUtils.isEmpty(operator)) { - operator = lastOperator; - } - - if (StringUtils.isNotEmpty(operator)) { - try { - total = applyOperator(total, pointValue, operator); - } catch (Exception e) { - log.error("应用运算符失败: current={}, value={}, operator={}", total, pointValue, operator, e); - total += pointValue; - } - } else { - total += pointValue; - } + total = applyOperator(total, value, StringUtils.defaultIfBlank(r.getOperator(), lastOp)); } - lastOperator = rule.getOperator(); + lastOp = r.getOperator(); } return total != null ? total : 0.0; } - /** - * 计算每个点位的差值 - */ - private List> calculatePointDifferences(Map latestData, - Map earliestData, - List rules) { - List> differences = new ArrayList<>(); - - if (rules == null || rules.isEmpty()) { - return differences; - } - - for (OperationRulesVO rule : rules) { - if (rule == null || rule.getDeviceId() == null || rule.getPointId() == null) { - continue; - } - - Map pointDiff = new HashMap<>(); - pointDiff.put("pointId", rule.getPointId()); - pointDiff.put("operator", rule.getOperator() != null ? rule.getOperator() : ""); - pointDiff.put("deviceId", rule.getDeviceId()); - - Double latestValue = getPointValueFromDataByDevice(latestData, rule.getDeviceId(), rule.getPointId()); - Double earliestValue = getPointValueFromDataByDevice(earliestData, rule.getDeviceId(), rule.getPointId()); - - pointDiff.put("latestValue", latestValue != null ? latestValue : 0.0); - pointDiff.put("earliestValue", earliestValue != null ? earliestValue : 0.0); - - if (latestValue != null && earliestValue != null) { - Double difference = latestValue - earliestValue; - pointDiff.put("difference", difference); - } else if (latestValue != null) { - pointDiff.put("difference", latestValue); - } else if (earliestValue != null) { - pointDiff.put("difference", -earliestValue); - } else { - pointDiff.put("difference", 0.0); - } - - differences.add(pointDiff); - } - - return differences; - } - - /** - * 应用运算符计算 - */ - private Double applyOperator(Double current, Double value, String operator) { - if (current == null || value == null || operator == null) { - return current; - } - - String op = operator.trim(); - switch (op) { - case "+": - return current + value; - case "-": - return current - value; - case "*": - return current * value; - case "/": - if (Math.abs(value) > 0.000001) { // 避免除零 - return current / value; - } else { - log.warn("除数不能为0: current={}, value={}", current, value); - return current; - } - default: - log.warn("不支持的操作符: {}, 使用加法", operator); - return current + value; - } - } - - /** - * 修复编码问题 - */ - private String fixEncoding(String str) { - if (StringUtils.isBlank(str)) { - return str; + /** 延迟解析 JSON 获取点位值 */ + private Double getPointValue(TimePointCache cache, Long pointId) { + if (cache == null || pointId == null) return null; + if (cache.getPointIndex() == null) { + cache.setPointIndex(buildPointIndex(cache.getQueryData())); } + JSONObject obj = cache.getPointIndex().get(pointId); + if (obj == null) return null; + Object v = obj.get("addressValue"); + if (v instanceof Number) return ((Number) v).doubleValue(); try { - // 尝试UTF-8解码 - byte[] bytes = str.getBytes(StandardCharsets.ISO_8859_1); - return new String(bytes, StandardCharsets.UTF_8); + return Double.parseDouble(String.valueOf(v)); } catch (Exception e) { - return str; + return null; } } + /** 构建 JSON 点位索引 */ + private Map buildPointIndex(String jsonData) { + Map index = new HashMap<>(); + if (StringUtils.isBlank(jsonData)) return index; - /** - * 构建点位详情列表 - * 包含:点位名称、最早值、最晚值、相差值、时间、单位等信息 - */ - private List buildPointDetails(Map calculationResult, - EnergyDeviceDO deviceDO, - List originalRules) { - List result = new ArrayList<>(); - - if (calculationResult == null || originalRules == null || originalRules.isEmpty()) { - return result; - } - - List> pointDifferences = (List>) calculationResult.get("pointDifferences"); - if (pointDifferences == null || pointDifferences.isEmpty()) { - return result; - } - - Map latestData = (Map) calculationResult.get("latestData"); - Map earliestData = (Map) calculationResult.get("earliestData"); - - // 收集所有点位ID - List allPointIds = new ArrayList<>(); - for (Map pointDiff : pointDifferences) { - Long pointId = (Long) pointDiff.get("pointId"); - if (pointId != null) { - allPointIds.add(pointId); - } - } - - // 批量从本地数据库获取点位信息 - Map pointInfoMap = batchGetPointInfoFromLocalDB(allPointIds); - - for (Map pointDiff : pointDifferences) { - Long pointId = (Long) pointDiff.get("pointId"); - Long deviceId = (Long) pointDiff.get("deviceId"); - - if (pointId == null) { - continue; - } - - // 获取点位详细信息 - PointDetailVO pointDetail = new PointDetailVO(); - pointDetail.setPointId(pointId); - pointDetail.setDeviceId(deviceId); - - // 设置运算符 - String operator = (String) pointDiff.get("operator"); - pointDetail.setOperator(operator != null ? operator : ""); - - // 从TD数据获取点位信息和实际采集时间 - setPointDataFromTD(pointDetail, latestData, earliestData, pointId, deviceId, pointDiff); - - // 如果没有从TD数据获取到点位名称,从本地数据库获取 - if (StringUtils.isBlank(pointDetail.getPointName())) { - setPointInfoFromLocalDB(pointDetail, pointInfoMap.get(pointId)); - } - - // 如果没有单位,尝试从本地数据库获取 - if (StringUtils.isBlank(pointDetail.getUnit())) { - setPointUnitFromLocalDB(pointDetail, pointInfoMap.get(pointId)); - } - - // 设置数值 - Double earliestValue = (Double) pointDiff.get("earliestValue"); - Double latestValue = (Double) pointDiff.get("latestValue"); - Double difference = (Double) pointDiff.get("difference"); - - pointDetail.setEarliestValue(formatDouble(earliestValue != null ? earliestValue : 0.0)); - pointDetail.setLatestValue(formatDouble(latestValue != null ? latestValue : 0.0)); - pointDetail.setDifference(formatDouble(difference != null ? difference : 0.0)); - - result.add(pointDetail); - } - - return result; - } - - /** - * 从TD数据库数据中获取点位详细信息 - */ - private void setPointDataFromTD(PointDetailVO pointDetail, - Map latestData, - Map earliestData, - Long pointId, - Long deviceId, - Map pointDiff) { - - // 获取最新数据的时间 - if (latestData != null) { - String deviceKey = "device_" + deviceId; - Map deviceData = (Map) latestData.get(deviceKey); - if (deviceData != null) { - Object timestamp = deviceData.get("timestamp"); - if (timestamp != null) { - pointDetail.setLatestTime(formatToFullTime(timestamp.toString())); - } - } + Object obj = JSON.parse(jsonData); + JSONArray array; + if (obj instanceof JSONArray) { + array = (JSONArray) obj; + } else if (obj instanceof String) { + // 外层字符串 -> 再解析一次 + array = JSON.parseArray((String) obj); + } else { + array = new JSONArray(); } - // 获取最早数据的时间 - if (earliestData != null) { - String deviceKey = "device_" + deviceId; - Map deviceData = (Map) earliestData.get(deviceKey); - if (deviceData != null) { - Object timestamp = deviceData.get("timestamp"); - if (timestamp != null) { - pointDetail.setEarliestTime(formatToFullTime(timestamp.toString())); - } - } - } - // 从最新数据获取点位名称和单位 - if (latestData != null) { - String deviceKey = "device_" + deviceId; - Map deviceData = (Map) latestData.get(deviceKey); - if (deviceData != null) { - Map pointData = getPointData(deviceData, pointId); - if (pointData != null) { - // 获取点位名称 - String pointName = (String) pointData.get("attributeName"); - if (StringUtils.isNotBlank(pointName)) { - pointDetail.setPointName(pointName); - } else { - pointName = (String) pointData.get("attributeCode"); - if (StringUtils.isNotBlank(pointName)) { - pointDetail.setPointName(pointName); - } - } - - // 获取单位 - String unit = (String) pointData.get("dataUnit"); - if (StringUtils.isNotBlank(unit)) { - pointDetail.setUnit(unit); - } - } - } + for (int i = 0; i < array.size(); i++) { + JSONObject jsonObject = array.getJSONObject(i); + Long id = jsonObject.getLong("id"); + if (id != null) index.put(id, jsonObject); } + return index; } - /** - * 格式化为完整时间 yyyy-MM-dd HH:mm:ss - */ - private String formatToFullTime(String time) { - if (StringUtils.isBlank(time)) { - return ""; - } - - try { - String timeStr = time.trim(); - - // 1. 如果已经是 yyyy-MM-dd HH:mm:ss 格式 - if (timeStr.length() >= 19 && timeStr.charAt(4) == '-' && timeStr.charAt(10) == ' ') { - if (timeStr.length() == 19) { - return timeStr; // 直接返回 - } else { - return timeStr.substring(0, 19); // 截取前19位 - } - } - - // 2. ISO格式: 2024-01-15T14:30:00.000+08:00 - if (timeStr.contains("T")) { - timeStr = timeStr.replace("T", " "); - int dotIndex = timeStr.indexOf("."); - if (dotIndex > 0) { - timeStr = timeStr.substring(0, dotIndex); - } else { - int plusIndex = Math.min(timeStr.indexOf("+"), timeStr.indexOf("-", 11)); - if (plusIndex > 0) { - timeStr = timeStr.substring(0, plusIndex); - } else if (timeStr.contains("Z")) { - timeStr = timeStr.substring(0, timeStr.indexOf("Z")); - } - } - return timeStr.length() >= 19 ? timeStr.substring(0, 19) : timeStr; - } - - // 3. 尝试解析 - String[] patterns = { - "yyyy-MM-dd HH:mm:ss", - "yyyy-MM-dd HH:mm:ss.SSS", - "yyyy-MM-dd'T'HH:mm:ss", - "yyyy-MM-dd'T'HH:mm:ss.SSS", - "yyyy/MM/dd HH:mm:ss", - "yyyy/MM/dd HH:mm:ss.SSS" - }; - - for (String pattern : patterns) { - try { - SimpleDateFormat sdf = new SimpleDateFormat(pattern); - Date date = sdf.parse(timeStr); - SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - return targetFormat.format(date); - } catch (Exception e) { - continue; - } - } - - } catch (Exception e) { - log.warn("时间格式化失败: {}", time, e); + /** 应用运算符 */ + private Double applyOperator(Double current, Double value, String operator) { + if (current == null || value == null || StringUtils.isBlank(operator)) return current; + switch (operator.trim()) { + case "+": return current + value; + case "-": return current - value; + case "*": return current * value; + case "/": return Math.abs(value) > 1e-6 ? current / value : current; + default: return current + value; } - - return time; } - /** - * 从时间戳中提取时分秒 - */ - private String extractHMSFromTimestamp(String timestamp) { - if (StringUtils.isBlank(timestamp)) { - return ""; - } - - try { - String timeStr = timestamp.trim(); - // 处理多种格式 - // 1. 标准格式: yyyy-MM-dd HH:mm:ss - if (timeStr.length() >= 19) { - return timeStr.substring(11, 19); // 提取 HH:mm:ss - } - - // 2. ISO格式: 2024-01-15T14:30:00.000+08:00 - if (timeStr.contains("T")) { - int tIndex = timeStr.indexOf("T"); - int dotIndex = timeStr.indexOf("."); - if (dotIndex > tIndex) { - return timeStr.substring(tIndex + 1, dotIndex); - } else { - int plusIndex = timeStr.indexOf("+"); - if (plusIndex > tIndex) { - return timeStr.substring(tIndex + 1, plusIndex); - } else if (timeStr.contains("Z") && timeStr.indexOf("Z") > tIndex) { - int zIndex = timeStr.indexOf("Z"); - return timeStr.substring(tIndex + 1, zIndex); - } - } - } + /** 构建点位详情列表并使用本地数据库批量获取点位信息 */ + private List buildPointDetails(List rules, + Map firstCache, + Map lastCache, + Map pointInfoMap) { + List result = new ArrayList<>(); + if (rules == null || rules.isEmpty()) return result; - // 3. 如果是 HH:mm:ss 格式 - if (timeStr.matches("\\d{1,2}:\\d{1,2}:\\d{1,2}")) { - return timeStr; - } + for (OperationRulesVO r : rules) { + PointDetailVO p = new PointDetailVO(); + p.setDeviceId(r.getDeviceId()); + p.setPointId(r.getPointId()); + p.setOperator(r.getOperator()); - // 4. 尝试解析 - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - Date date = sdf.parse(timeStr); - SimpleDateFormat hmsFormat = new SimpleDateFormat("HH:mm:ss"); - return hmsFormat.format(date); - } catch (Exception e) { - // 继续尝试其他格式 - } + Double firstVal = getPointValue(firstCache.get(r.getDeviceId()), r.getPointId()); + Double lastVal = getPointValue(lastCache.get(r.getDeviceId()), r.getPointId()); + p.setEarliestValue(formatDouble(firstVal)); + p.setLatestValue(formatDouble(lastVal)); + p.setDifference(formatDouble((lastVal != null ? lastVal : 0.0) - (firstVal != null ? firstVal : 0.0))); - try { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Date date = sdf.parse(timeStr); - SimpleDateFormat hmsFormat = new SimpleDateFormat("HH:mm:ss"); - return hmsFormat.format(date); - } catch (Exception e) { - // 解析失败 + // 从本地数据库获取点位名称和单位 + DeviceContactModelDO pointInfo = pointInfoMap.get(r.getPointId()); + if (pointInfo != null) { + p.setPointName(StringUtils.isNotBlank(pointInfo.getAttributeName()) + ? pointInfo.getAttributeName() + : pointInfo.getAttributeCode()); + p.setUnit(pointInfo.getDataUnit()); } - } catch (Exception e) { - log.warn("时间格式解析失败: {}", timestamp, e); - } - - return timestamp; - } - - /** - * 从本地数据库获取点位信息 - */ - private void setPointInfoFromLocalDB(PointDetailVO pointDetail, DeviceContactModelDO pointInfo) { - if (pointDetail == null || pointInfo == null) { - return; - } - - if (StringUtils.isBlank(pointDetail.getPointName())) { - if (StringUtils.isNotBlank(pointInfo.getAttributeName())) { - pointDetail.setPointName(pointInfo.getAttributeName()); - } else if (StringUtils.isNotBlank(pointInfo.getAttributeCode())) { - pointDetail.setPointName(pointInfo.getAttributeCode()); - } else { - pointDetail.setPointName("点位" + pointDetail.getPointId()); - } + result.add(p); } + return result; } - /** - * 从本地数据库获取点位单位 - */ - private void setPointUnitFromLocalDB(PointDetailVO pointDetail, DeviceContactModelDO pointInfo) { - if (pointDetail == null || pointInfo == null) { - return; - } - - if (StringUtils.isBlank(pointDetail.getUnit())) { - if (StringUtils.isNotBlank(pointInfo.getDataUnit())) { - pointDetail.setUnit(pointInfo.getDataUnit()); - } - } + /** 格式化 double */ + private String formatDouble(Double value) { + if (value == null) return "0.0"; + return new DecimalFormat("#.##").format(value); } - /** - * 批量获取点位信息(优化性能) - */ + /** 批量获取点位信息(本地数据库) */ private Map batchGetPointInfoFromLocalDB(List pointIds) { Map result = new HashMap<>(); - - if (pointIds == null || pointIds.isEmpty()) { - return result; - } + if (pointIds == null || pointIds.isEmpty()) return result; try { - List deviceContacts = deviceContactModelMapper.selectBatchIds(pointIds); - if (deviceContacts != null && !deviceContacts.isEmpty()) { - for (DeviceContactModelDO deviceContact : deviceContacts) { - if (deviceContact != null && deviceContact.getId() != null) { - result.put(deviceContact.getId(), deviceContact); - } + List contacts = deviceContactModelMapper.selectBatchIds(pointIds); + if (contacts != null) { + for (DeviceContactModelDO c : contacts) { + if (c != null && c.getId() != null) result.put(c.getId(), c); } } } catch (Exception e) { @@ -1224,78 +504,8 @@ public class EnergyDeviceServiceImpl implements EnergyDeviceService { return result; } - /** - * 从TD数据库数据中获取点位名称 - */ - private String getPointNameFromTDData(Map timePointData, Long pointId, Map pointDiff) { - if (timePointData == null || pointId == null || pointDiff == null) { - return null; - } - - Long deviceId = (Long) pointDiff.get("deviceId"); - if (deviceId == null) { - return null; - } - - String deviceKey = "device_" + deviceId; - Map deviceData = (Map) timePointData.get(deviceKey); - if (deviceData == null) { - return null; - } - - Map pointData = getPointData(deviceData, pointId); - if (pointData == null) { - return null; - } - - String attributeName = (String) pointData.get("attributeName"); - if (StringUtils.isNotBlank(attributeName)) { - return attributeName; - } - - String attributeCode = (String) pointData.get("attributeCode"); - if (StringUtils.isNotBlank(attributeCode)) { - return attributeCode; - } - return null; - } - - /** - * 批量获取点位名称(优化性能) - */ - private Map batchGetPointNamesFromLocalDB(List pointIds) { - Map result = new HashMap<>(); - if (pointIds == null || pointIds.isEmpty()) { - return result; - } - try { - // 批量查询点位信息 - List deviceContacts = deviceContactModelMapper.selectBatchIds(pointIds); - if (deviceContacts != null && !deviceContacts.isEmpty()) { - for (DeviceContactModelDO deviceContact : deviceContacts) { - if (deviceContact == null || deviceContact.getId() == null) { - continue; - } - - String pointName = null; - if (StringUtils.isNotBlank(deviceContact.getAttributeName())) { - pointName = deviceContact.getAttributeName(); - } else if (StringUtils.isNotBlank(deviceContact.getAttributeCode())) { - pointName = deviceContact.getAttributeCode(); - } - - if (StringUtils.isNotBlank(pointName)) { - result.put(deviceContact.getId(), pointName); - } - } - } - } catch (Exception e) { - log.error("批量查询点位信息失败, pointIds: {}", pointIds, e); - } - return result; - } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java index 029daf58b..bd86891ba 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.moldrepair; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpdateReqVO; @@ -74,5 +75,13 @@ public interface MoldRepairService { void updateMoldRepairStatus(@Valid MoldRepairUpdateReqVO updateReqVO); List getRepairListByMoldId(Long moldId, String startTime, String endTime, String ids); + + Long getRepairListCountByRepairStatus(); + + List getMoldRepairDOListByStatus(); + + void selectCountMoldRepair(EventStatisticsVO eventStatisticsVO); + + List getList(); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java index c6b3cce13..d9f549936 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.moldrepair; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.enums.RepairResultEnum; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineRespVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairLineSaveReqVO; @@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairUpda import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldrepair.vo.MoldRepairSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketresults.enums.JobResultEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; @@ -48,7 +50,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; @Slf4j @Service @Validated -public class MoldRepairServiceImpl implements MoldRepairService { +public class MoldRepairServiceImpl implements MoldRepairService { @Resource(name = "mesMoldRepairMapper") private MoldRepairMapper moldRepairMapper; @@ -415,4 +417,31 @@ public class MoldRepairServiceImpl implements MoldRepairService { throw exception(MOLD_REPAIR_LINE_NOT_EXISTS); } } + + @Override + public Long getRepairListCountByRepairStatus() { + return moldRepairMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldRepairDO::getRepairStatus, 0)); + + } + + @Override + public List getMoldRepairDOListByStatus() { + return moldRepairMapper.selectList(Wrappers.lambdaQuery() + .eq(MoldRepairDO::getRepairStatus, 0)); + + } + + @Override + public void selectCountMoldRepair(EventStatisticsVO eventStatisticsVO) { + //未完成维修单 + int intValue = moldRepairMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldRepairDO::getStatus, 0)).intValue(); + eventStatisticsVO.setMoldRepair(intValue); + } + + @Override + public List getList() { + return moldRepairMapper.selectList(); + } } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java index 238f9597b..fb59e912e 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementService.java @@ -2,7 +2,10 @@ package cn.iocoder.yudao.module.mes.service.moldticketmanagement; import java.util.*; import javax.validation.*; + +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -59,4 +62,16 @@ public interface MoldTicketManagementService { List getInspectionByMoldId(Long id, String startTime, String endTime, String ids); List getMaintenanceByMoldId(Long id, String startTime, String endTime, String ids); + + Long getBaoyangListCountByJobStatus(); + + Long getDianjianListCountByJobStatus(); + + List getListByJobStatus(); + + void selectCountMoldInspection(EventStatisticsVO eventStatisticsVO); + + void selectCountMoldMaintenance(EventStatisticsVO eventStatisticsVO); + + List getList(); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java index f4c257b1f..90e0c1b8a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldticketmanagement/MoldTicketManagementServiceImpl.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.mes.service.moldticketmanagement; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.mold.MesMoldDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; import cn.iocoder.yudao.module.mes.dal.mysql.mold.MesMoldMapper; import cn.iocoder.yudao.module.mes.controller.admin.moldticketmanagement.enums.MoldPlanTypeEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; @@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; import cn.iocoder.yudao.module.mes.service.moldticketmanagement.MoldTicketManagementService; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -148,4 +151,48 @@ public class MoldTicketManagementServiceImpl implements MoldTicketManagementServ .collect(Collectors.toList()); } + @Override + public Long getBaoyangListCountByJobStatus() { + return moldticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldTicketManagementDO::getJobStatus, 0) + .eq(MoldTicketManagementDO::getPlanType,2)); + } + + @Override + public Long getDianjianListCountByJobStatus() { + return moldticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldTicketManagementDO::getJobStatus, 0) + .eq(MoldTicketManagementDO::getPlanType,1)); + } + + @Override + public List getListByJobStatus() { + return moldticketManagementMapper.selectList(Wrappers.lambdaQuery() + .eq(MoldTicketManagementDO::getJobStatus, 0)); + } + + @Override + public void selectCountMoldInspection(EventStatisticsVO eventStatisticsVO) { + //模具点检 + int intValue = moldticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldTicketManagementDO::getPlanType, MoldPlanTypeEnum.INSPECTION.getCode()) + .eq(MoldTicketManagementDO::getJobStatus,0)).intValue(); + + eventStatisticsVO.setMoldInspection(intValue); + } + + @Override + public void selectCountMoldMaintenance(EventStatisticsVO eventStatisticsVO) { + //模具保养 + int intValue = moldticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(MoldTicketManagementDO::getPlanType, MoldPlanTypeEnum.MAINTENANCE.getCode()) + .eq(MoldTicketManagementDO::getJobStatus,0)).intValue(); + eventStatisticsVO.setMoldMaintenance(intValue); + } + + @Override + public List getList() { + return moldticketManagementMapper.selectList(); + } + } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java index baa3267a8..95d4fa688 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementService.java @@ -2,7 +2,10 @@ package cn.iocoder.yudao.module.mes.service.ticketmanagement; import java.util.*; import javax.validation.*; + +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.vo.*; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketmanagement.TicketManagementDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -63,4 +66,12 @@ public interface TicketManagementService { Long getBaoyangListCountByJobStatus(); Long getDianjianListCountByJobStatus(); + + List getListByJobStatus(); + + void selectCountDeviceInspection(EventStatisticsVO eventStatisticsVO); + + void selectCountDeviceMaintenance(EventStatisticsVO eventStatisticsVO); + + List getList(); } \ No newline at end of file diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java index d51dafafa..bf4deaf3c 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketmanagement/TicketManagementServiceImpl.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.mes.service.ticketmanagement; +import cn.iocoder.yudao.module.mes.controller.admin.dashboard.vo.dashboard.EventStatisticsVO; +import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.JobStatusEnum; import cn.iocoder.yudao.module.mes.controller.admin.ticketmanagement.enums.PlanTypeEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.deviceledger.DeviceLedgerDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldrepair.MoldRepairDO; import cn.iocoder.yudao.module.mes.dal.dataobject.ticketresults.TicketResultsDO; import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; @@ -142,6 +145,37 @@ public class TicketManagementServiceImpl implements TicketManagementService { .eq(TicketManagementDO::getPlanType,1)); } + @Override + public List getListByJobStatus() { + return ticketManagementMapper.selectList(Wrappers.lambdaQuery() + .eq(TicketManagementDO::getJobStatus, 0)); + } + + @Override + public void selectCountDeviceInspection(EventStatisticsVO eventStatisticsVO) { + //点检 + int count = ticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(TicketManagementDO::getPlanType, PlanTypeEnum.INSPECTION.getCode()) + .eq(TicketManagementDO::getJobStatus, JobStatusEnum.PENDING.getCode())).intValue();; + + eventStatisticsVO.setDeviceInspection(count); + } + + @Override + public void selectCountDeviceMaintenance(EventStatisticsVO eventStatisticsVO) { + + //保养 + int count = ticketManagementMapper.selectCount(Wrappers.lambdaQuery() + .eq(TicketManagementDO::getPlanType, PlanTypeEnum.MAINTENANCE.getCode()) + .eq(TicketManagementDO::getJobStatus, JobStatusEnum.PENDING.getCode())).intValue();; + + eventStatisticsVO.setDeviceMaintenance(count); + } + + @Override + public List getList() { + return ticketManagementMapper.selectList(); + } /** diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java index 9e29a65b4..db37e076a 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/ticketresults/TicketResultsServiceImpl.java @@ -161,7 +161,7 @@ public class TicketResultsServiceImpl implements TicketResultsService { } ticketManagementDO.setTaskTime(LocalDateTime.now()); //设置为已完成 - ticketManagementDO.setJobStatus(1); + ticketManagementDO.setJobStatus("1"); // 检查是否有不通过的 boolean hasFail = updateReqVOList.stream() .anyMatch(vo -> vo.getInspectionResult() != null && vo.getInspectionResult().equals(JobResultEnum.FAIL.getCode())); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java index 9532cb909..4dce10640 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java @@ -32,6 +32,8 @@ public class AdminUserApiImpl implements AdminUserApi { @Resource private DeptService deptService; + + @Override public AdminUserRespDTO getUser(Long id) { AdminUserDO user = userService.getUser(id);