From 626604a6dcb35eec50fdabd03c912ce509369953 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 24 Jul 2026 17:33:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E4=BA=A7=E8=83=BD?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yudao-module-iot/yudao-module-iot-biz/pom.xml | 6 + .../admin/device/DeviceController.java | 21 + ...iceProductionDailyReportGenerateReqVO.java | 30 ++ .../DeviceProductionDailyReportPageReqVO.java | 29 ++ .../vo/DeviceProductionDailyReportRespVO.java | 69 ++++ .../DeviceProductionDailyReportService.java | 13 + ...eviceProductionDailyReportServiceImpl.java | 365 ++++++++++++++++++ ...ding-production-daily-report-template.xlsx | Bin 0 -> 8600 bytes .../module/mes/api/workteam/WorkTeamApi.java | 9 + .../mes/api/workteam/dto/WorkTeamRespDTO.java | 19 + .../mes/api/workteam/WorkTeamApiImpl.java | 22 ++ .../admin/workteam/WorkTeamController.java | 10 +- 12 files changed, 592 insertions(+), 1 deletion(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportGenerateReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportPageReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportRespVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportService.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportServiceImpl.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/resources/excel/templates/fully-automatic-molding-production-daily-report-template.xlsx create mode 100644 yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApi.java create mode 100644 yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/dto/WorkTeamRespDTO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApiImpl.java diff --git a/yudao-module-iot/yudao-module-iot-biz/pom.xml b/yudao-module-iot/yudao-module-iot-biz/pom.xml index 3284ebf3e..b9cad06f0 100644 --- a/yudao-module-iot/yudao-module-iot-biz/pom.xml +++ b/yudao-module-iot/yudao-module-iot-biz/pom.xml @@ -29,6 +29,12 @@ ${revision} + + cn.iocoder.boot + yudao-module-mes-api + ${revision} + + cn.iocoder.boot 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 e8da0afd6..d02bc0e3d 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 @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; import cn.iocoder.yudao.module.iot.framework.mqtt.consumer.IMqttservice; import cn.iocoder.yudao.module.iot.service.device.DeviceService; +import cn.iocoder.yudao.module.iot.service.device.DeviceProductionDailyReportService; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.v3.oas.annotations.Operation; @@ -55,6 +56,8 @@ public class DeviceController { @Resource private TDengineService tDengineService; @Resource + private DeviceProductionDailyReportService deviceProductionDailyReportService; + @Resource private JobService jobService; // @Resource @@ -140,6 +143,24 @@ public class DeviceController { // 导出 Excel ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,list); } + + @PostMapping("/production-daily-report/generate") + @Operation(summary = "生成设备生产日报 Excel") + @PreAuthorize("@ss.hasPermission('iot:device:export')") + @ApiAccessLog(operateType = EXPORT) + public CommonResult generateProductionDailyReport( + @Valid @RequestBody DeviceProductionDailyReportGenerateReqVO reqVO) { + return success(deviceProductionDailyReportService.generateReport(reqVO)); + } + + @GetMapping("/production-daily-report/page") + @Operation(summary = "获得设备生产日报 Excel 分页") + @PreAuthorize("@ss.hasPermission('iot:device:query')") + public CommonResult> getProductionDailyReportPage( + @Valid DeviceProductionDailyReportPageReqVO reqVO) { + return success(deviceProductionDailyReportService.getReportPage(reqVO)); + } + @GetMapping("/deviceList") // @PreAuthorize("@ss.hasPermission('iot:device:query')") public CommonResult> deviceList(@Valid DevicePageReqVO pageReqVO) { diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportGenerateReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportGenerateReqVO.java new file mode 100644 index 000000000..ed84e3194 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportGenerateReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - 设备生产日报生成 Request VO") +@Data +public class DeviceProductionDailyReportGenerateReqVO { + + @Schema(description = "设备 ID 列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2]") + @NotEmpty(message = "设备 ID 不能为空") + private List deviceIds; + + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-07-23") + @NotNull(message = "日期不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate reportDate; + + @Schema(description = "班次 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "班次 ID 不能为空") + private Long workTeamId; +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportPageReqVO.java new file mode 100644 index 000000000..8cc315517 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportPageReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Schema(description = "管理后台 - 设备生产日报分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceProductionDailyReportPageReqVO extends PageParam { + + @Schema(description = "日期", example = "2026-07-23") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate reportDate; + + @Schema(description = "班次 ID", example = "1") + private Long workTeamId; + + @Schema(description = "设备 ID,按生成时的设备集合筛选", example = "1") + private Long deviceId; +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportRespVO.java new file mode 100644 index 000000000..aec4e084e --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceProductionDailyReportRespVO.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 设备生产日报 Response VO") +@Data +public class DeviceProductionDailyReportRespVO { + + @Schema(description = "文件名") + private String fileName; + + @Schema(description = "文件访问地址") + private String fileUrl; + + @Schema(description = "文件路径") + private String filePath; + + @Schema(description = "日期") + private LocalDate reportDate; + + @Schema(description = "班次 ID") + private Long workTeamId; + + @Schema(description = "班次名称") + private String workTeamName; + + @Schema(description = "查询开始时间") + private LocalDateTime startTime; + + @Schema(description = "查询结束时间") + private LocalDateTime endTime; + + @Schema(description = "设备 ID 列表") + private List deviceIds; + + @Schema(description = "设备产能明细") + private List devices; + + @Schema(description = "生成时间") + private LocalDateTime createTime; + + @Data + public static class DeviceCapacityItem { + + @Schema(description = "设备 ID") + private Long deviceId; + @Schema(description = "设备编码") + private String deviceCode; + @Schema(description = "设备名称") + private String deviceName; + @Schema(description = "产能点位编码") + private String capacityCode; + @Schema(description = "产能点位名称") + private String capacityName; + @Schema(description = "开始值") + private Double startValue; + @Schema(description = "结束值") + private Double endValue; + @Schema(description = "差值") + private Double capacityDiff; + @Schema(description = "单位") + private String unit; + } +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportService.java new file mode 100644 index 000000000..3ad8f2cb2 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportService.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.iot.service.device; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportGenerateReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportRespVO; + +public interface DeviceProductionDailyReportService { + + DeviceProductionDailyReportRespVO generateReport(DeviceProductionDailyReportGenerateReqVO reqVO); + + PageResult getReportPage(DeviceProductionDailyReportPageReqVO reqVO); +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportServiceImpl.java new file mode 100644 index 000000000..6d82107bd --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceProductionDailyReportServiceImpl.java @@ -0,0 +1,365 @@ +package cn.iocoder.yudao.module.iot.service.device; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; +import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; +import cn.iocoder.yudao.module.infra.service.file.FileService; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportGenerateReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportPageReqVO; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceProductionDailyReportRespVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; +import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactModelMapper; +import cn.iocoder.yudao.module.mes.api.workteam.WorkTeamApi; +import cn.iocoder.yudao.module.mes.api.workteam.dto.WorkTeamRespDTO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_NOT_EXISTS; + +@Service +@Validated +@Slf4j +public class DeviceProductionDailyReportServiceImpl implements DeviceProductionDailyReportService { + + private static final String TEMPLATE_PATH = "excel/templates/fully-automatic-molding-production-daily-report-template.xlsx"; + private static final String REPORT_PATH_PREFIX = "iot/device/production-daily-report"; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Resource + private DeviceMapper deviceMapper; + @Resource + private DeviceContactModelMapper deviceContactModelMapper; + @Resource + private TDengineService tDengineService; + @Resource + private WorkTeamApi workTeamApi; + @Resource + private FileService fileService; + @Resource + private FileMapper fileMapper; + + @Override + public DeviceProductionDailyReportRespVO generateReport(DeviceProductionDailyReportGenerateReqVO reqVO) { + List deviceIds = reqVO.getDeviceIds().stream().filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(deviceIds)) { + throw exception(DEVICE_NOT_EXISTS); + } + + Map deviceMap = deviceMapper.selectBatchIds(deviceIds).stream() + .collect(Collectors.toMap(DeviceDO::getId, item -> item)); + if (deviceMap.size() != deviceIds.size()) { + throw exception(DEVICE_NOT_EXISTS); + } + + WorkTeamRespDTO workTeam = workTeamApi.getWorkTeam(reqVO.getWorkTeamId()); + if (workTeam == null || workTeam.getStartTime() == null || workTeam.getEndTime() == null) { + throw new IllegalArgumentException("Work team does not exist or start/end time is not configured"); + } + + LocalDateTime startTime = combineShiftTime(reqVO.getReportDate(), workTeam.getStartTime()); + LocalDateTime endTime = combineShiftTime(reqVO.getReportDate(), workTeam.getEndTime()); + if (!endTime.isAfter(startTime)) { + endTime = endTime.plusDays(1); + } + + List items = buildCapacityItems(deviceIds, deviceMap, startTime, endTime); + byte[] excelContent = buildExcel(reqVO, workTeam, startTime, endTime, items); + + String fileName = String.format("全自动成型机生产日报表_%s_%s_%s.xlsx", + reqVO.getReportDate().format(DateTimeFormatter.BASIC_ISO_DATE), reqVO.getWorkTeamId(), System.currentTimeMillis()); + String filePath = String.format("%s/date=%s/workTeamId=%s/deviceIds=%s/deviceTags=%s/%s", + REPORT_PATH_PREFIX, reqVO.getReportDate(), reqVO.getWorkTeamId(), joinDeviceIds(deviceIds), buildDeviceTags(deviceIds), fileName); + Map file = fileService.createFile(fileName, filePath, excelContent); + + DeviceProductionDailyReportRespVO respVO = buildBaseResp(reqVO.getReportDate(), workTeam, startTime, endTime, deviceIds); + respVO.setFileName(file.get("fileName")); + respVO.setFileUrl(file.get("fileUrl")); + respVO.setFilePath(filePath); + respVO.setDevices(items); + respVO.setCreateTime(LocalDateTime.now()); + return respVO; + } + + @Override + public PageResult getReportPage(DeviceProductionDailyReportPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX<>(); + queryWrapper.like(FileDO::getPath, REPORT_PATH_PREFIX); + queryWrapper.orderByDesc(FileDO::getId); + if (reqVO.getReportDate() != null) { + queryWrapper.like(FileDO::getPath, "/date=" + reqVO.getReportDate() + "/"); + } + if (reqVO.getWorkTeamId() != null) { + queryWrapper.like(FileDO::getPath, "/workTeamId=" + reqVO.getWorkTeamId() + "/"); + } + if (reqVO.getDeviceId() != null) { + queryWrapper.like(FileDO::getPath, buildDeviceTag(reqVO.getDeviceId())); + } + + PageResult pageResult = fileMapper.selectPage(reqVO, queryWrapper); + List list = pageResult.getList().stream() + .map(this::convertFileToReport) + .collect(Collectors.toList()); + return new PageResult<>(list, pageResult.getTotal()); + } + + private List buildCapacityItems(List deviceIds, + Map deviceMap, + LocalDateTime startTime, + LocalDateTime endTime) { + Map> capacityPointMap = queryCapacityPoints(deviceIds); + Map> firstRows = tDengineService.queryDevicesEarliestRow(deviceIds, + startTime.format(DATE_TIME_FORMATTER), endTime.format(DATE_TIME_FORMATTER)); + Map> lastRows = tDengineService.queryDevicesLatestRow(deviceIds, + startTime.format(DATE_TIME_FORMATTER), endTime.format(DATE_TIME_FORMATTER)); + + List items = new ArrayList<>(); + for (Long deviceId : deviceIds) { + DeviceDO device = deviceMap.get(deviceId); + List points = capacityPointMap.getOrDefault(deviceId, Collections.emptyList()); + if (CollUtil.isEmpty(points)) { + items.add(buildEmptyCapacityItem(device)); + continue; + } + Map firstRow = firstRows.get(deviceId); + Map lastRow = lastRows.get(deviceId); + for (DeviceContactModelDO point : points) { + items.add(buildCapacityItem(device, point, firstRow, lastRow)); + } + } + return items; + } + + private Map> queryCapacityPoints(List deviceIds) { + List points = deviceContactModelMapper.selectList( + Wrappers.lambdaQuery() + .in(DeviceContactModelDO::getDeviceId, deviceIds) + .and(wrapper -> wrapper.like(DeviceContactModelDO::getTypeName, "产能") + .or().like(DeviceContactModelDO::getAttributeType, "产能") + .or().like(DeviceContactModelDO::getAttributeName, "产能")) + .orderByAsc(DeviceContactModelDO::getDeviceId) + .orderByAsc(DeviceContactModelDO::getSort) + .orderByAsc(DeviceContactModelDO::getId)); + return points.stream().collect(Collectors.groupingBy(DeviceContactModelDO::getDeviceId, LinkedHashMap::new, Collectors.toList())); + } + + private DeviceProductionDailyReportRespVO.DeviceCapacityItem buildEmptyCapacityItem(DeviceDO device) { + DeviceProductionDailyReportRespVO.DeviceCapacityItem item = new DeviceProductionDailyReportRespVO.DeviceCapacityItem(); + item.setDeviceId(device.getId()); + item.setDeviceCode(device.getDeviceCode()); + item.setDeviceName(device.getDeviceName()); + item.setCapacityDiff(0D); + return item; + } + + private DeviceProductionDailyReportRespVO.DeviceCapacityItem buildCapacityItem(DeviceDO device, DeviceContactModelDO point, + Map firstRow, Map lastRow) { + DeviceProductionDailyReportRespVO.DeviceCapacityItem item = new DeviceProductionDailyReportRespVO.DeviceCapacityItem(); + item.setDeviceId(device.getId()); + item.setDeviceCode(device.getDeviceCode()); + item.setDeviceName(device.getDeviceName()); + item.setCapacityCode(point.getAttributeCode()); + item.setCapacityName(point.getAttributeName()); + item.setUnit(point.getDataUnit()); + + Double firstValue = getNumberValue(firstRow, point.getAttributeCode()); + Double lastValue = getNumberValue(lastRow, point.getAttributeCode()); + item.setStartValue(firstValue); + item.setEndValue(lastValue); + if (firstValue != null && lastValue != null) { + item.setCapacityDiff(BigDecimal.valueOf(lastValue).subtract(BigDecimal.valueOf(firstValue)) + .setScale(3, RoundingMode.HALF_UP).doubleValue()); + } else { + item.setCapacityDiff(0D); + } + return item; + } + + @SneakyThrows + private byte[] buildExcel(DeviceProductionDailyReportGenerateReqVO reqVO, WorkTeamRespDTO workTeam, + LocalDateTime startTime, LocalDateTime endTime, + List items) { + try (InputStream inputStream = new ClassPathResource(TEMPLATE_PATH).getInputStream(); + Workbook workbook = WorkbookFactory.create(inputStream); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + Sheet sheet = workbook.getSheetAt(0); + setCellValue(sheet, 2, 0, "日期:" + LocalDate.now().format(DATE_FORMATTER)); + setCellValue(sheet, 2, 4, "班次:" + StrUtil.blankToDefault(workTeam.getTeamName(), "")); + setCellValue(sheet, 19, 9, "审核:"); + + int rowIndex = 5; + for (int index = 0; index < items.size(); index++) { + if (rowIndex + index > 9) { + sheet.shiftRows(10, sheet.getLastRowNum(), 1, true, false); + } + Row row = sheet.getRow(rowIndex + index); + if (row == null) { + row = sheet.createRow(rowIndex + index); + } + DeviceProductionDailyReportRespVO.DeviceCapacityItem item = items.get(index); + setCellValue(row, 0, index + 1); + setCellValue(row, 1, StrUtil.blankToDefault(item.getDeviceCode(), item.getDeviceName())); + setCellValue(row, 4, item.getCapacityName()); + setCellValue(row, 20, item.getCapacityDiff()); + setCellValue(row, 21, toHour(startTime, endTime)); + setCellValue(row, 22, startTime.toLocalTime() + "-" + endTime.toLocalTime()); + setCellValue(row, 24, workTeam.getTeamName()); + } + workbook.write(outputStream); + return outputStream.toByteArray(); + } + } + + private DeviceProductionDailyReportRespVO convertFileToReport(FileDO file) { + DeviceProductionDailyReportRespVO respVO = new DeviceProductionDailyReportRespVO(); + respVO.setFileName(file.getName()); + respVO.setFileUrl(file.getUrl()); + respVO.setFilePath(file.getPath()); + respVO.setCreateTime(file.getCreateTime()); + parsePathMetadata(file.getPath(), respVO); + if (respVO.getWorkTeamId() != null) { + WorkTeamRespDTO workTeam = workTeamApi.getWorkTeam(respVO.getWorkTeamId()); + if (workTeam != null) { + respVO.setWorkTeamName(workTeam.getTeamName()); + } + } + return respVO; + } + + private void parsePathMetadata(String path, DeviceProductionDailyReportRespVO respVO) { + if (StringUtils.isBlank(path)) { + return; + } + for (String segment : path.split("/")) { + if (segment.startsWith("date=")) { + respVO.setReportDate(LocalDate.parse(segment.substring("date=".length()))); + } else if (segment.startsWith("workTeamId=")) { + respVO.setWorkTeamId(Long.valueOf(segment.substring("workTeamId=".length()))); + } else if (segment.startsWith("deviceIds=")) { + List deviceIds = new ArrayList<>(); + for (String id : segment.substring("deviceIds=".length()).split("_")) { + if (StringUtils.isNumeric(id)) { + deviceIds.add(Long.valueOf(id)); + } + } + respVO.setDeviceIds(deviceIds); + } + } + } + + private DeviceProductionDailyReportRespVO buildBaseResp(LocalDate reportDate, WorkTeamRespDTO workTeam, + LocalDateTime startTime, LocalDateTime endTime, List deviceIds) { + DeviceProductionDailyReportRespVO respVO = new DeviceProductionDailyReportRespVO(); + respVO.setReportDate(reportDate); + respVO.setWorkTeamId(workTeam.getId()); + respVO.setWorkTeamName(workTeam.getTeamName()); + respVO.setStartTime(startTime); + respVO.setEndTime(endTime); + respVO.setDeviceIds(deviceIds); + return respVO; + } + + private LocalDateTime combineShiftTime(LocalDate date, LocalDateTime workTeamTime) { + return LocalDateTime.of(date, LocalTime.from(workTeamTime)); + } + + private Double getNumberValue(Map row, String code) { + if (row == null || StringUtils.isBlank(code)) { + return null; + } + Object value = row.get(code); + if (value == null) { + value = row.get(code.toLowerCase()); + } + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + if (value != null && StringUtils.isNotBlank(value.toString())) { + try { + return Double.valueOf(value.toString()); + } catch (NumberFormatException e) { + log.warn("capacity point value is not numeric: code={}, value={}", code, value); + } + } + return null; + } + + private String buildShiftText(WorkTeamRespDTO workTeam) { + if (StringUtils.isNotBlank(workTeam.getGroupType())) { + return workTeam.getGroupType(); + } + return StrUtil.blankToDefault(workTeam.getTeamName(), "Shift:"); + } + + private Double toHour(LocalDateTime startTime, LocalDateTime endTime) { + return BigDecimal.valueOf(java.time.Duration.between(startTime, endTime).toMinutes()) + .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP).doubleValue(); + } + + private String joinDeviceIds(List deviceIds) { + return deviceIds.stream().sorted(Comparator.naturalOrder()).map(String::valueOf).collect(Collectors.joining("_")); + } + + private String buildDeviceTags(List deviceIds) { + return deviceIds.stream().sorted(Comparator.naturalOrder()).map(this::buildDeviceTag).collect(Collectors.joining("")); + } + + private String buildDeviceTag(Long deviceId) { + return "_" + deviceId + "_"; + } + + private void setCellValue(Sheet sheet, int rowIndex, int columnIndex, Object value) { + Row row = sheet.getRow(rowIndex); + if (row == null) { + row = sheet.createRow(rowIndex); + } + setCellValue(row, columnIndex, value); + } + + private void setCellValue(Row row, int columnIndex, Object value) { + Cell cell = row.getCell(columnIndex); + if (cell == null) { + cell = row.createCell(columnIndex); + } + if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else { + cell.setCellValue(value == null ? "" : value.toString()); + } + } +} + diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/excel/templates/fully-automatic-molding-production-daily-report-template.xlsx b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/excel/templates/fully-automatic-molding-production-daily-report-template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ab81f204d592b48d5a8ee08582f9b6ac7de9f380 GIT binary patch literal 8600 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 literal 0 HcmV?d00001 diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApi.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApi.java new file mode 100644 index 000000000..e1c0921aa --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApi.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.module.mes.api.workteam; + +import cn.iocoder.yudao.module.mes.api.workteam.dto.WorkTeamRespDTO; + +public interface WorkTeamApi { + + WorkTeamRespDTO getWorkTeam(Long id); + +} diff --git a/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/dto/WorkTeamRespDTO.java b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/dto/WorkTeamRespDTO.java new file mode 100644 index 000000000..8155af3fd --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/dto/WorkTeamRespDTO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.mes.api.workteam.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class WorkTeamRespDTO { + + private Long id; + + private String teamName; + + private String groupType; + + private LocalDateTime startTime; + + private LocalDateTime endTime; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApiImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApiImpl.java new file mode 100644 index 000000000..19de3958c --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/api/workteam/WorkTeamApiImpl.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.mes.api.workteam; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.api.workteam.dto.WorkTeamRespDTO; +import cn.iocoder.yudao.module.mes.dal.dataobject.workteam.WorkTeamDO; +import cn.iocoder.yudao.module.mes.service.workteam.WorkTeamService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class WorkTeamApiImpl implements WorkTeamApi { + + @Resource + private WorkTeamService workTeamService; + + @Override + public WorkTeamRespDTO getWorkTeam(Long id) { + WorkTeamDO workTeam = workTeamService.getWorkTeam(id); + return BeanUtils.toBean(workTeam, WorkTeamRespDTO.class); + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/workteam/WorkTeamController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/workteam/WorkTeamController.java index c0b9d81a6..359d428a9 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/workteam/WorkTeamController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/workteam/WorkTeamController.java @@ -80,6 +80,14 @@ public class WorkTeamController { return success(pageResult); } + @GetMapping("/list") + @Operation(summary = "获得生产班组列表") + @PreAuthorize("@ss.hasPermission('mes:work-team:query')") + public CommonResult> getWorkTeamList(@Valid WorkTeamPageReqVO pageReqVO) { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + return success(workTeamService.getWorkTeamPage(pageReqVO).getList()); + } + @GetMapping("/export-excel") @Operation(summary = "导出生产班组 Excel") @PreAuthorize("@ss.hasPermission('mes:work-team:export')") @@ -148,4 +156,4 @@ public class WorkTeamController { public CommonResult> getUserList2(@RequestParam("orgId") Long orgId,String groupType) { return success(workTeamService.getUserList2(orgId,groupType)); } -} \ No newline at end of file +}