Explorar o código

Merge remote-tracking branch 'origin/master'

zhangcl hai 19 horas
pai
achega
54ada88eea

+ 71 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/IotMeasureBookController.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.qhse.measure;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
@@ -11,12 +12,15 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo.IotMeasureBookPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo.IotMeasureBookRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo.IotMeasureBookSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo.QhseMeasureExportVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.DeptUtil;
 import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.measure.IotMeasureBookDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.measure.IotMeasureDetectDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.qhse.measure.IotMeasureBookMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.qhse.measure.IotMeasureDetectMapper;
 import cn.iocoder.yudao.module.pms.service.qhse.ChineseLetterUtil;
 import cn.iocoder.yudao.module.pms.service.qhse.measure.IotMeasureBookService;
+import cn.iocoder.yudao.module.pms.service.qhse.measure.IotMeasureDetectService;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
@@ -41,6 +45,7 @@ import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -70,6 +75,8 @@ public class IotMeasureBookController {
     private DeptUtil deptUtil;
     @Autowired
     private IotMeasureDetectMapper iotMeasureDetectMapper;
+    @Autowired
+    private IotMeasureDetectService iotMeasureDetectService;
 
     @PostMapping("/create")
     @Operation(summary = "创建计量器具台账")
@@ -145,13 +152,73 @@ public class IotMeasureBookController {
     @Operation(summary = "导出计量器具台账 Excel")
     @PreAuthorize("@ss.hasPermission('rq:iot-measure-book:export')")
     @ApiAccessLog(operateType = EXPORT)
-    public void exportIotMeasureBookExcel(@Valid IotMeasureBookPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
+    public void exportIotMeasureBookExcel(@Valid IotMeasureBookPageReqVO pageReqVO, HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<IotMeasureBookDO> list = iotMeasureBookService.getIotMeasureBookPage(pageReqVO).getList();
+        // 转换VO
+        List<QhseMeasureExportVO> results = BeanUtils.toBean(list, QhseMeasureExportVO.class);
+        // 一次性查询所有检测记录
+        List<IotMeasureDetectDO> allDetectList = iotMeasureDetectMapper.selectList();
+        List<DictDataDO> dictType = dictDataService.getDictDataListByDictType("measure_type");
+        // 优化:按 measureId 分组,避免循环反复filter
+        Map<Long, List<IotMeasureDetectDO>> detectGroupMap = allDetectList.stream()
+                .collect(Collectors.groupingBy(IotMeasureDetectDO::getMeasureId));
+
+        // 统一日期格式化器(提取到循环外)
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        List<DeptRespDTO> deptList = deptApi.getDeptList();
+
+        results.forEach(e -> {
+            dictType.stream().filter(g -> g.getValue().equals(e.getClassify())).findAny().ifPresent(g->{
+                e.setClassify(g.getLabel());
+            });
+            deptList.stream().filter(g ->g.getId().equals(e.getDeptId())).findAny().ifPresent(g->{
+                e.setDeptName(g.getName());
+            });
+            String buyDateStr = null;
+            String buyDate = e.getBuyDate();
+            if (StringUtils.isNotBlank(buyDate)) {
+                try {
+                    long timeStamp = Long.parseLong(buyDate);
+                    Date date = new Date(timeStamp);
+                    buyDate = sdf.format(date);
+                } catch (NumberFormatException ex) {
+                    // 时间戳格式非法,忽略
+                }
+            }
+            e.setBuyDate(buyDate);
+            // 根据id获取对应检测记录
+            List<IotMeasureDetectDO> detectDOS = detectGroupMap.get(e.getId());
+            if (CollUtil.isEmpty(detectDOS)) {
+                return;
+            }
+            // 取创建时间最新一条
+            detectDOS.stream()
+                    .max(Comparator.comparing(IotMeasureDetectDO::getCreateTime))
+                    .ifPresent(latestDetect -> {
+                        String detectDateStr = null;
+                        String detectDate = latestDetect.getDetectDate();
+                        if (StringUtils.isNotBlank(detectDate)) {
+                            try {
+                                long timeStamp = Long.parseLong(detectDate);
+                                Date date = new Date(timeStamp);
+                                detectDateStr = sdf.format(date);
+                            } catch (NumberFormatException ex) {
+                                // 时间戳格式非法,忽略
+                            }
+                        }
+                        e.setDetectDate(detectDateStr);
+                        e.setDetectOrg(latestDetect.getDetectOrg());
+                        e.setDetectContent(latestDetect.getDetectContent());
+                        e.setValidityPeriod(latestDetect.getValidityPeriod());
+                        e.setDetectAmount(latestDetect.getDetectAmount());
+                        e.setMeasureCertNo(latestDetect.getMeasureCertNo());
+                        e.setDetectStandard(latestDetect.getDetectStandard());
+                    });
+            // 删掉原来的 results.add(e); 这一行是报错根源
+        });
         // 导出 Excel
-        ExcelUtils.write(response, "计量器具台账.xls", "数据", IotMeasureBookRespVO.class,
-                        BeanUtils.toBean(list, IotMeasureBookRespVO.class));
+        ExcelUtils.write(response, "计量器具台账.xls", "数据", QhseMeasureExportVO.class, results);
     }
 
 

+ 91 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/qhse/measure/vo/QhseMeasureExportVO.java

@@ -0,0 +1,91 @@
+package cn.iocoder.yudao.module.pms.controller.admin.qhse.measure.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 计量器具台账 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QhseMeasureExportVO {
+    private Long id;
+
+    @Schema(description = "序列号")
+    @ExcelProperty("序列号")
+    private String serialNo;
+
+    @Schema(description = "计量器具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty(value = "计量器具名称")
+    //@ColumnWidth(10)
+    private String measureName;
+
+    @Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty(value = "分类")
+    private String classify;
+
+    @Schema(description = "责任人", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("责任人")
+    private String dutyPerson;
+
+    @Schema(description = "采购日期")
+    @ExcelProperty("采购日期")
+    private String buyDate;
+
+    @Schema(description = "品牌")
+    @ExcelProperty("品牌")
+    //@ColumnWidth(25)
+    private String brand;
+
+    @Schema(description = "规格型号", example = "芋艿")
+    @ExcelProperty("规格型号")
+    private String modelName;
+
+    @Schema(description = "单位")
+    @ExcelProperty("单位")
+    //@ColumnWidth(5)
+    private String measureUnit;
+
+    @Schema(description = "价格", example = "7760")
+    @ExcelProperty("价格")
+    private Double measurePrice;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "证书编码")
+    @ExcelProperty("证书编码")
+    private String measureCertNo;
+    @Schema(description = "检测/校准日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("检测/校准日期")
+    private String detectDate;
+
+    @Schema(description = "检测/校准机构", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("检测/校准机构")
+    private String detectOrg;
+
+    @Schema(description = "检测/校准内容", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("检测/校准内容")
+    private String detectContent;
+
+
+    @Schema(description = "检测/检验标准")
+    @ExcelProperty("检测/检验标准")
+    private String detectStandard;
+    @Schema(description = "检测/校准有效期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("检测/校准有效期")
+    private LocalDateTime validityPeriod;
+
+    @Schema(description = "校准金额")
+    @ExcelProperty("校准金额")
+    private Double detectAmount;
+
+    private Long deptId;
+}