From 341ad6f3d4f8dd85db45380a8349eada915eb924 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期五, 21 二月 2025 13:26:55 +0800
Subject: [PATCH] 设备校准计划移植
---
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java | 89 ++++
cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java | 16
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java | 4
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java | 37 +
inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java | 119 +++++
basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java | 12
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java | 2
inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java | 90 ++++
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java | 173 ++++++++
cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java | 36 +
ruoyi-admin/src/main/resources/application.yml | 2
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java | 21 +
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java | 29 +
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml | 17
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java | 67 +++
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java | 27 +
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java | 20
cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml | 20
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java | 31 +
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java | 74 +++
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java | 353 ++++++++++++++++
21 files changed, 1,230 insertions(+), 9 deletions(-)
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
index f83bd97..4b436aa 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
@@ -100,12 +100,14 @@
List<Product> products = productMapper.selectList(Wrappers.<Product>lambdaQuery()
.eq(Product::getObjectId, id));
List<Integer> productIds = products.stream().map(Product::getId).collect(Collectors.toList());
- productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
- .in(ProductPart::getProductId, productIds));
+ if (CollectionUtils.isNotEmpty(productIds)) {
+ productPartMapper.delete(Wrappers.<ProductPart>lambdaQuery()
+ .in(ProductPart::getProductId, productIds));
- // 鍒犻櫎浜у搧缁存姢
- productMapper.delete(Wrappers.<Product>lambdaQuery()
- .in(Product::getId, productIds));
+ // 鍒犻櫎浜у搧缁存姢
+ productMapper.delete(Wrappers.<Product>lambdaQuery()
+ .in(Product::getId, productIds));
+ }
return structureTestObjectMapper.deleteById(id);
}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java
new file mode 100644
index 0000000..37aed61
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java
@@ -0,0 +1,173 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
+import com.ruoyi.device.service.DeviceCalibrationPlanService;
+import com.ruoyi.framework.exception.ErrorException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Api(tags = "璁惧鏍″噯璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceCalibrationPlan")
+public class DeviceCalibrationPlanController {
+
+ private DeviceCalibrationPlanService deviceCalibrationPlanService;
+
+ private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
+
+ /**
+ * 鏂板璁惧鏍″噯璁″垝
+ * @return
+ */
+ @ApiOperation(value = "鏂板璁惧鏍″噯璁″垝")
+ @PostMapping("/addDeviceCalibrationPlan")
+ public Result addDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto){
+ return Result.success(deviceCalibrationPlanService.addDeviceCalibrationPlan(calibrationPlanDto));
+ }
+
+ /**
+ * 淇敼璁惧鏍″噯璁″垝
+ * @param calibrationPlanDto 璁惧鏍″噯璁″垝
+ */
+ @ApiOperation("鎵归噺淇敼璁惧鏍″噯璁″垝")
+ @PostMapping("/updateDeviceCalibrationPlan")
+ public Result updateDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto) {
+ return Result.success(deviceCalibrationPlanService.updateDeviceCalibrationPlan(calibrationPlanDto));
+ }
+
+ /**
+ * 鏌ヨ璁惧鏍″噯璁″垝璇︽儏
+ */
+ @ApiOperation("鏌ヨ璁惧鏍″噯璁″垝璇︽儏")
+ @GetMapping("/getDeviceCalibrationPlan")
+ public Result<DeviceCalibrationPlanDto> getDeviceCalibrationPlan(Integer planId) {
+ return Result.success(deviceCalibrationPlanService.getDeviceCalibrationPlan(planId));
+ }
+
+ /**
+ * 瀵煎叆璁惧鏍″噯璁″垝
+ * @return
+ */
+ @ApiOperation(value = "瀵煎叆璁惧鏍″噯璁″垝")
+ @PostMapping("/importDeviceCalibrationPlan")
+ public Result importDeviceCalibrationPlan(MultipartFile file, String planYear){
+ return Result.success(deviceCalibrationPlanService.importDeviceCalibrationPlan(file, planYear));
+ }
+
+
+ /**
+ * 璁惧鏍″噯璁″垝鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "璁惧鏍″噯璁″垝鍒犻櫎")
+ @DeleteMapping("/delQualitySupervise")
+ public Result delQualitySupervise(Integer planId){
+ return Result.success(deviceCalibrationPlanService.removeById(planId));
+ }
+
+ /**
+ * 鎻愪氦鎵瑰噯
+ * @return
+ */
+ @ApiOperation(value = "鎻愪氦鎵瑰噯")
+ @PostMapping("/submiatRatifyDeviceCalibrationPlan")
+ public Result submiatRatifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
+ return Result.success(deviceCalibrationPlanService.submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan));
+ }
+
+ /**
+ * 璁惧鏍″噯璁″垝鎵瑰噯
+ * @return
+ */
+ @ApiOperation(value = "璁惧鏍″噯璁″垝鎵瑰噯")
+ @PostMapping("/ratifyDeviceCalibrationPlan")
+ public Result ratifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
+ return Result.success(deviceCalibrationPlanService.ratifyDeviceCalibrationPlan(DeviceCalibrationPlan));
+ }
+
+
+ /**
+ * 璁惧鏍″噯璁″垝鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "璁惧鏍″噯璁″垝鍒楄〃")
+ @GetMapping("/pageDeviceCalibrationPlan")
+ public Result<IPage<DeviceCalibrationPlanDto>> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan DeviceCalibrationPlan) throws Exception {
+ return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlan(page, DeviceCalibrationPlan));
+ }
+
+ /**
+ * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "璁惧鏍″噯璁″垝璇︽儏鍒楄〃")
+ @PostMapping("/pageDeviceCalibrationPlanDetail")
+ public Result<IPage<DeviceCalibrationPlanDetail>> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
+ return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlanDetail(page, deviceCalibrationPlanDetails));
+ }
+
+ /**
+ * 鏂板璁惧鏍″噯璁″垝璇︽儏
+ * @return
+ */
+ @ApiOperation(value = "鏂板璁惧鏍″噯璁″垝璇︽儏")
+ @PostMapping("/addDeviceCalibrationPlanDetail")
+ public Result addDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+ if (deviceCalibrationPlanDetail.getPlanId() == null) {
+ throw new ErrorException("缂哄皯璁惧鏍″噯璁″垝涓昏〃id");
+ }
+ return Result.success(deviceCalibrationPlanDetailService.save(deviceCalibrationPlanDetail));
+ }
+
+ /**
+ * 淇敼璁惧鏍″噯璁″垝璇︽儏
+ * @return
+ */
+ @ApiOperation(value = "淇敼璁惧鏍″噯璁″垝璇︽儏")
+ @PostMapping("/updateDeviceCalibrationPlanDetail")
+ public Result updateDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+ return Result.success(deviceCalibrationPlanDetailService.updateById(deviceCalibrationPlanDetail));
+ }
+
+ /**
+ * 鍒犻櫎璁惧鏍″噯璁″垝璇︽儏
+ * @return
+ */
+ @ApiOperation(value = "鍒犻櫎璁惧鏍″噯璁″垝璇︽儏")
+ @GetMapping("/delDeviceCalibrationPlanDetail")
+ public Result delDeviceCalibrationPlanDetail(Integer planDetailsId){
+ return Result.success(deviceCalibrationPlanDetailService.removeById(planDetailsId));
+ }
+
+ /**
+ * 瀵煎嚭璁惧鏍″噯璁″垝
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭璁惧鏍″噯璁″垝")
+ @GetMapping("/exportDeviceCalibrationPlanDetail")
+ public void exportDeviceCalibrationPlanDetail(Integer planId, HttpServletResponse response){
+ deviceCalibrationPlanService.exportDeviceCalibrationPlanDetail(planId, response);
+ }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java
new file mode 100644
index 0000000..dd1b783
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 10:05:08
+ * Description:
+ */
+@Data
+public class DeviceCalibrationPlanDetailDto extends DeviceCalibrationPlanDetail {
+
+ @ApiModelProperty("搴忓彿")
+ private Integer index;
+ @ApiModelProperty("鏈�杩戞瀹氭椂闂碨tr")
+ private String lastDateStr;
+ @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿Str")
+ private String planDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java
new file mode 100644
index 0000000..76cba3a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceCalibrationPlanDto extends DeviceCalibrationPlan {
+
+ @ApiModelProperty("缂栧埗浜�")
+ private String writeName;
+
+ @ApiModelProperty("鎵瑰噯浜�")
+ private String ratifyName;
+
+ @ApiModelProperty("缂栧埗鏃堕棿")
+ private String writeTimeStr;
+
+ @ApiModelProperty("鎵瑰噯鏃堕棿")
+ private String ratifyTimeStr;
+
+ @ApiModelProperty("鏍″噯璁″垝璇︽儏")
+ private List<DeviceCalibrationPlanDetail> calibrationPlanDetailList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java
new file mode 100644
index 0000000..3636525
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.excel.upload;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceCalibrationPlanDetailUpload {
+
+ @ApiModelProperty("璁惧鍚嶇О鍙婂瀷鍙�")
+ private String deviceName;
+
+ @ApiModelProperty("璁惧鏁伴噺")
+ private String deviceAmount;
+
+ @ApiModelProperty("浠櫒缂栧彿")
+ private String deviceNumber;
+
+ @ApiModelProperty("妫�瀹氬崟浣�")
+ private String verificationUnit;
+
+ @ApiModelProperty("妫�瀹氬懆鏈�")
+ private String verificationCycles;
+
+ @ApiModelProperty("鏈�杩戞瀹氭椂闂�")
+ private String lastDate;
+
+ @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿")
+ private String planDate;
+
+ @ApiModelProperty("澶囨敞")
+ private String remark;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java
new file mode 100644
index 0000000..0434130
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java
@@ -0,0 +1,37 @@
+package com.ruoyi.device.excel.upload;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceExaminePlanUpload {
+
+ @ApiModelProperty("璁惧缂栧彿")
+ private String deviceNumber;
+
+ @ApiModelProperty("璁″垝鍚嶇О")
+ private String deviceName;
+
+ @ApiModelProperty("鏍告煡鏃堕棿")
+ private String checkTime;
+
+ @ApiModelProperty("鏍告煡鎸囨爣")
+ private String checkIndex;
+
+ @ApiModelProperty("鏍告煡鏂规硶")
+ private String checkMethod;
+
+ @ApiModelProperty("缁撴灉濡備綍鍒ゅ畾")
+ private String howResults;
+
+ @ApiModelProperty("鏍告煡璐d换浜�")
+ private String checkChargerUser;
+
+ @ApiModelProperty("澶囨敞")
+ private String remark;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java
new file mode 100644
index 0000000..3f45575
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+public interface DeviceCalibrationPlanDetailMapper extends BaseMapper<DeviceCalibrationPlanDetail> {
+
+ /**
+ * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+ * @param page
+ * @param ew
+ * @return
+ */
+ IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlanDetail> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java
new file mode 100644
index 0000000..deedc46
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+public interface DeviceCalibrationPlanMapper extends BaseMapper<DeviceCalibrationPlan> {
+
+ /**
+ * 璁惧鏍″噯璁″垝鍒楄〃
+ * @param page
+ * @param ew
+ * @return
+ */
+ IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, @Param("ew") QueryWrapper<DeviceCalibrationPlan> ew);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java
new file mode 100644
index 0000000..2bfef94
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java
@@ -0,0 +1,67 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Getter
+@Setter
+@TableName("device_calibration_plan")
+@ApiModel(value = "DeviceCalibrationPlan瀵硅薄", description = "璁惧鏍″噯璁″垝涓昏〃")
+public class DeviceCalibrationPlan{
+
+ @TableId(value = "plan_id", type = IdType.AUTO)
+ private Integer planId;
+
+ @ApiModelProperty("璁″垝鍚嶇О")
+ private String planName;
+
+ @ApiModelProperty("璁″垝骞翠唤")
+ private String planYear;
+
+ @ApiModelProperty("缂栧埗浜�")
+ private Integer writeUserId;
+
+ @ApiModelProperty("缂栧埗鏃堕棿")
+ private LocalDateTime writeTime;
+
+ @ApiModelProperty("鎵瑰噯浜�")
+ private Integer ratifyUserId;
+
+ @ApiModelProperty("鎵瑰噯鏃堕棿")
+ private LocalDateTime ratifyTime;
+
+ @ApiModelProperty("鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+ private Integer ratifyStatus;
+
+ @ApiModelProperty("鎵瑰噯淇℃伅")
+ private String ratifyRemark;
+
+ @ApiModelProperty("鍒涘缓浜�")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("淇敼浜�")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java
new file mode 100644
index 0000000..01a0718
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java
@@ -0,0 +1,74 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+@Getter
+@Setter
+@TableName("device_calibration_plan_detail")
+@ApiModel(value = "DeviceCalibrationPlanDetail瀵硅薄", description = "璁惧鏍″噯璁″垝璇︽儏琛�")
+public class DeviceCalibrationPlanDetail{
+
+ @TableId(value = "plan_detail_id", type = IdType.AUTO)
+ private Integer planDetailId;
+
+ @ApiModelProperty("璁″垝涓昏〃id")
+ private Integer planId;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("璁惧鍚嶇О鍙婂瀷鍙�")
+ private String deviceName;
+
+ @ApiModelProperty("璁惧鏁伴噺")
+ private String deviceAmount;
+
+ @ApiModelProperty("浠櫒缂栧彿")
+ private String deviceNumber;
+
+ @ApiModelProperty("妫�瀹氬崟浣�")
+ private String verificationUnit;
+
+ @ApiModelProperty("妫�瀹氬懆鏈�")
+ private String verificationCycles;
+
+ @ApiModelProperty("鏈�杩戞瀹氭椂闂�")
+ private LocalDate lastDate;
+
+ @ApiModelProperty("鏈勾璁″垝鏍″噯鏃堕棿")
+ private LocalDate planDate;
+
+ @ApiModelProperty("澶囨敞")
+ private String remark;
+
+ @ApiModelProperty("鍒涘缓浜�")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("淇敼浜�")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java
new file mode 100644
index 0000000..f696dd4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+public interface DeviceCalibrationPlanDetailService extends IService<DeviceCalibrationPlanDetail> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java
new file mode 100644
index 0000000..0e66f43
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+public interface DeviceCalibrationPlanService extends IService<DeviceCalibrationPlan> {
+
+ /**
+ * 鏂板璁惧鏍″噯璁″垝
+ * @param calibrationPlanDto
+ * @return
+ */
+ boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
+
+ /**
+ * 瀵煎叆璁惧鏍″噯璁″垝
+ * @param file
+ * @return
+ */
+ boolean importDeviceCalibrationPlan(MultipartFile file, String planYear);
+
+ /**
+ * 鎻愪氦鎵瑰噯
+ * @param deviceCalibrationPlan
+ * @return
+ */
+ boolean submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan);
+
+ /**
+ * 璁惧鏍″噯璁″垝鎵瑰噯
+ * @param DeviceCalibrationPlan
+ * @return
+ */
+ boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan DeviceCalibrationPlan);
+
+ /**
+ * 璁惧鏍″噯璁″垝鍒楄〃
+ * @param page
+ * @param DeviceCalibrationPlan
+ * @return
+ */
+ IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan);
+
+ /**
+ * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+ * @param page
+ * @param DeviceCalibrationPlanDetails
+ * @return
+ */
+ IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails);
+
+
+ /**
+ * 瀵煎嚭璁惧鏍″噯璁″垝
+ *
+ * @param DeviceCalibrationPlanId
+ * @param response
+ */
+ void exportDeviceCalibrationPlanDetail(Integer DeviceCalibrationPlanId, HttpServletResponse response);
+
+ /**
+ * 鎵归噺缂栬緫璁惧鏍″噯璇︽儏
+ * @param calibrationPlanDto
+ * @return
+ */
+ boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
+
+ /**
+ * 鏌ヨ璁惧鏍″噯璇︽儏
+ * @param planId
+ * @return
+ */
+ DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
new file mode 100644
index 0000000..8c4b2da
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+@Service
+public class DeviceCalibrationPlanDetailServiceImpl extends ServiceImpl<DeviceCalibrationPlanDetailMapper, DeviceCalibrationPlanDetail> implements DeviceCalibrationPlanDetailService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
new file mode 100644
index 0000000..a31d3da
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
@@ -0,0 +1,353 @@
+package com.ruoyi.device.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDetailDto;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.excel.upload.DeviceCalibrationPlanDetailUpload;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanMapper;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
+import com.ruoyi.device.service.DeviceCalibrationPlanService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceCalibrationPlanServiceImpl extends ServiceImpl<DeviceCalibrationPlanMapper, DeviceCalibrationPlan> implements DeviceCalibrationPlanService {
+
+ @Resource
+ private DeviceCalibrationPlanDetailMapper deviceCalibrationPlanDetailMapper;
+ @Resource
+ private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+ @Resource
+ private UserMapper userMapper;
+
+
+ /**
+ * 鏂板璁惧鏍″噯璁″垝
+ * @param calibrationPlanDto
+ * @return
+ */
+ @Override
+ public boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
+ // 褰撳墠鐧诲綍鐢ㄦ埛
+ Integer userId = SecurityUtils.getUserId().intValue();
+ // 缂栧埗鏃ユ湡
+ calibrationPlanDto.setWriteUserId(userId);
+ calibrationPlanDto.setWriteTime(LocalDateTime.now());
+ baseMapper.insert(calibrationPlanDto);
+
+ // 娣诲姞璇︽儏
+ if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
+ for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
+ calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
+ }
+ deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
+ }
+
+ return true;
+ }
+
+ /**
+ * 瀵煎叆璁惧鏍″噯璁″垝
+ * @param file
+ * @return
+ */
+ @Override
+ public boolean importDeviceCalibrationPlan(MultipartFile file, String planYear) {
+ // 褰撳墠鐧诲綍鐢ㄦ埛
+ Integer userId = SecurityUtils.getUserId().intValue();
+ // 鏂囦欢鍚嶇О
+ String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+ DeviceCalibrationPlan calibrationPlan = new DeviceCalibrationPlan();
+ calibrationPlan.setPlanName(fileName);
+ calibrationPlan.setPlanYear(planYear);
+ calibrationPlan.setWriteUserId(userId);
+ calibrationPlan.setWriteTime(LocalDateTime.now());
+ baseMapper.insert(calibrationPlan);
+
+ List<DeviceCalibrationPlanDetail> detailsUploadList = new ArrayList<>();
+ // 瀵煎叆闄勪欢鍐呭
+ try {
+ // excel瑙f瀽
+ EasyExcel.read(file.getInputStream(), DeviceCalibrationPlanDetailUpload.class, new AnalysisEventListener<DeviceCalibrationPlanDetailUpload>() {
+ @Override
+ public void invoke(DeviceCalibrationPlanDetailUpload detailsUpload, AnalysisContext analysisContext) {
+ // 鍒ゆ柇鏄惁涓虹┖
+ if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
+ StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
+ // 瀵硅薄澶嶅埗
+ DeviceCalibrationPlanDetail calibrationPlanDetail = new DeviceCalibrationPlanDetail();
+ BeanUtils.copyProperties(detailsUpload, calibrationPlanDetail);
+ // 鏍煎紡璇濇渶杩戞瀹氭椂闂村拰鏈勾璁″垝鏍″噯鏃堕棿
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
+ calibrationPlanDetail.setLastDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
+ calibrationPlanDetail.setPlanDate(LocalDate.parse(detailsUpload.getLastDate(), formatter));
+
+ calibrationPlanDetail.setPlanId(calibrationPlan.getPlanId());
+ detailsUploadList.add(calibrationPlanDetail);
+ }
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+ }
+ }).sheet().doRead();
+ deviceCalibrationPlanDetailService.saveBatch(detailsUploadList);
+
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return true;
+ }
+
+ /**
+ * 鎻愪氦鎵瑰噯
+ * @param deviceCalibrationPlan
+ * @return
+ */
+ @Override
+ public boolean submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
+ baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
+ .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
+ .set(DeviceCalibrationPlan::getRatifyUserId, deviceCalibrationPlan.getRatifyUserId())
+ .set(DeviceCalibrationPlan::getRatifyRemark, null)
+ .set(DeviceCalibrationPlan::getRatifyStatus, null)
+ .set(DeviceCalibrationPlan::getRatifyTime, null)
+ );
+
+ DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(deviceCalibrationPlan.getPlanId());
+
+ // 鍙戦�佹秷鎭�
+ Integer userId = SecurityUtils.getUserId().intValue();
+ User user = userMapper.selectById(userId);
+ // 娑堟伅鍙戦��
+ InformationNotification info = new InformationNotification();
+ // 鍙戦�佷汉
+ info.setCreateUser(user.getName());
+ info.setMessageType("6");
+ info.setTheme("CNAS璁惧鏍″噯璁″垝鎵瑰噯閫氱煡");
+ info.setContent(calibrationPlan.getPlanName() + "鐨勮澶囨牎鍑嗚鍒掑緟鎵瑰噯");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(deviceCalibrationPlan.getRatifyUserId());
+ info.setJumpPath("a6-device");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(deviceCalibrationPlan.getPlanId());
+
+ String message = "";
+ message += "CNAS璁惧鏍″噯璁″垝鎵瑰噯閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧鏍″噯璁″垝濉啓";
+ message += "\n" + calibrationPlan.getPlanName() + "鐨勬牎鍑嗚鍒掑緟鎵瑰噯";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+ return true;
+ }
+
+ /**
+ * 璁惧鏍″噯璁″垝鎵瑰噯
+ * @param deviceCalibrationPlan
+ * @return
+ */
+ @Override
+ public boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
+ baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
+ .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
+ .set(DeviceCalibrationPlan::getRatifyRemark, deviceCalibrationPlan.getRatifyRemark())
+ .set(DeviceCalibrationPlan::getRatifyStatus, deviceCalibrationPlan.getRatifyStatus())
+ .set(DeviceCalibrationPlan::getRatifyTime, LocalDateTime.now())
+ );
+ return true;
+ }
+
+ /**
+ * 璁惧鏍″噯璁″垝鍒楄〃
+ * @param page
+ * @param deviceCalibrationPlan
+ * @return
+ */
+ @Override
+ public IPage<DeviceCalibrationPlanDto> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan deviceCalibrationPlan) {
+ return baseMapper.pageDeviceCalibrationPlan(page, QueryWrappers.queryWrappers(deviceCalibrationPlan));
+ }
+
+ /**
+ * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+ * @param page
+ * @param deviceCalibrationPlanDetails
+ * @return
+ */
+ @Override
+ public IPage<DeviceCalibrationPlanDetail> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
+ if (deviceCalibrationPlanDetails.getPlanId() == null) {
+ return new Page();
+ }
+ return deviceCalibrationPlanDetailMapper.pageDeviceCalibrationPlanDetail(page, QueryWrappers.queryWrappers(deviceCalibrationPlanDetails));
+ }
+
+ /**
+ * 瀵煎嚭璁惧鏍″噯璁″垝
+ * @param deviceCalibrationPlanId
+ * @param response
+ */
+ @Override
+ public void exportDeviceCalibrationPlanDetail(Integer deviceCalibrationPlanId, HttpServletResponse response) {
+ // 鏌ヨ璁惧鏍″噯璁″垝
+ DeviceCalibrationPlan deviceCalibrationPlan = baseMapper.selectById(deviceCalibrationPlanId);
+ DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
+ BeanUtils.copyProperties(deviceCalibrationPlan, deviceCalibrationPlanDto);
+ // 璁剧疆缂栧埗鍜屾壒鍑嗘椂闂存牸寮�
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ deviceCalibrationPlanDto.setWriteTimeStr(deviceCalibrationPlan.getWriteTime() == null ? null : deviceCalibrationPlan.getWriteTime().format(formatter));
+ deviceCalibrationPlanDto.setRatifyTimeStr(deviceCalibrationPlan.getRatifyTime() == null ? null : deviceCalibrationPlan.getRatifyTime().format(formatter));
+
+ // 鏌ヨ璁惧鏍″噯璁″垝璇︽儏
+ List<DeviceCalibrationPlanDetail> deviceCalibrationPlanDetailList = deviceCalibrationPlanDetailMapper.selectList(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, deviceCalibrationPlanId));
+ // 璁剧疆搴忓彿 鍜� 鏃堕棿
+ ArrayList<DeviceCalibrationPlanDetailDto> deviceCalibrationPlanDetailDtoList = new ArrayList<>();
+ deviceCalibrationPlanDetailList.forEach(deviceCalibrationPlanDetail -> {
+ DeviceCalibrationPlanDetailDto deviceCalibrationPlanDetailDto = new DeviceCalibrationPlanDetailDto();
+ BeanUtils.copyProperties(deviceCalibrationPlanDetail, deviceCalibrationPlanDetailDto);
+ deviceCalibrationPlanDetailDto.setIndex(deviceCalibrationPlanDetailList.indexOf(deviceCalibrationPlanDetail) + 1);
+ deviceCalibrationPlanDetailDto.setLastDateStr((deviceCalibrationPlanDetail.getLastDate().format(formatter)));
+ deviceCalibrationPlanDetailDto.setPlanDateStr((deviceCalibrationPlanDetail.getPlanDate().format(formatter)));
+ deviceCalibrationPlanDetailDtoList.add(deviceCalibrationPlanDetailDto);
+ });
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-calibration-plan.docx");
+ Configure configure = Configure.builder()
+ .bind("deviceCalibrationPlanDetailDtoList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceCalibrationPlan", deviceCalibrationPlanDto);
+ put("deviceCalibrationPlanDetailDtoList", deviceCalibrationPlanDetailDtoList);
+ //鑾峰彇缂栧埗浜虹殑绛惧悕鍦板潃
+ put("organizationUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getRatifyUserId()));
+ //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+ put("approvedUrl", UserUtils.getFinalUserSignatureUrl(deviceCalibrationPlan.getWriteUserId()));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ "璁惧鏍″噯璁″垝琛�", "UTF-8");
+ response.setHeader("Content-disposition",
+ "attachment;filename=" + fileName + ".docx");
+ OutputStream os = response.getOutputStream();
+ template.write(os);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+ }
+
+ /**
+ * 鎵归噺缂栬緫璁惧鏍″噯
+ * @param calibrationPlanDto
+ * @return
+ */
+ @Override
+ public boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
+ // 褰撳墠鐧诲綍鐢ㄦ埛
+ Integer userId = SecurityUtils.getUserId().intValue();
+ // 缂栧埗鏃ユ湡
+ calibrationPlanDto.setWriteUserId(userId);
+ calibrationPlanDto.setWriteTime(LocalDateTime.now());
+ baseMapper.updateById(calibrationPlanDto);
+
+ // 鍒犻櫎鍘熸湰鐨勮鎯�
+ deviceCalibrationPlanDetailService.remove(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, calibrationPlanDto.getPlanId()));
+
+ // 娣诲姞璇︽儏
+ if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
+ for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
+ calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
+ }
+ deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
+ }
+ return true;
+ }
+
+ /**
+ * 鏌ヨ璁惧鏍″噯璇︽儏
+ * @param planId
+ * @return
+ */
+ @Override
+ public DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId) {
+ DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(planId);
+ DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
+ BeanUtils.copyProperties(calibrationPlan, deviceCalibrationPlanDto);
+ // 鏌ヨ璇︽儏
+ List<DeviceCalibrationPlanDetail> list = deviceCalibrationPlanDetailService.list(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery()
+ .eq(DeviceCalibrationPlanDetail::getPlanId, planId)
+ .orderByAsc(DeviceCalibrationPlanDetail::getPlanDate));
+
+ deviceCalibrationPlanDto.setCalibrationPlanDetailList(list);
+ return deviceCalibrationPlanDto;
+ }
+
+}
diff --git a/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml
new file mode 100644
index 0000000..d6bce8c
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper">
+
+ <!-- 璁惧鏍″噯璁″垝璇︽儏鍒楄〃 -->
+ <select id="pageDeviceCalibrationPlanDetail" resultType="com.ruoyi.device.pojo.DeviceCalibrationPlanDetail">
+ select * from (
+ select *
+ from device_calibration_plan_detail
+ order by plan_date asc
+ ) a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
new file mode 100644
index 0000000..bf7cf39
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceCalibrationPlanMapper">
+
+ <!-- 璁惧鏍″噯璁″垝鍒楄〃 -->
+ <select id="pageDeviceCalibrationPlan" resultType="com.ruoyi.device.dto.DeviceCalibrationPlanDto">
+ select *
+ from (select cqm.*,
+ u1.name write_name,
+ u3.name ratify_name
+ from device_calibration_plan cqm
+ left join user u1 on u1.id = cqm.write_user_id
+ left join user u3 on u3.id = cqm.ratify_user_id
+ order by cqm.create_time desc) a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+
+</mapper>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java b/inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java
new file mode 100644
index 0000000..4ea9c59
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/util/UserUtils.java
@@ -0,0 +1,90 @@
+package com.ruoyi.inspect.util;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.PictureRenderData;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 10:35:50
+ * Description: User宸ュ叿绫�
+ */
+@Component
+public class UserUtils {
+ private static UserMapper userMapper;
+
+ private static String imgUrl;
+
+ @Autowired
+ public void setUserMapper(UserMapper userMapper) {
+ UserUtils.userMapper = userMapper;
+ }
+
+ @Autowired
+ public void setImgUrl(@Value("${file.path}") String imgUrl) {
+ UserUtils.imgUrl = imgUrl;
+ }
+
+ /**
+ * 閫氳繃浜哄憳id鑾峰彇鐢ㄦ埛绛惧悕鍦板潃
+ * @param userId 浜哄憳id
+ * @return 鐢ㄦ埛绛惧悕鍦板潃
+ */
+ public static String getUserSignatureUrl(Integer userId) {
+ String userSignatureUrl = null;
+ if (userId != null) {
+ userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getId, userId))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(userSignatureUrl)) {
+ throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+ }
+ return imgUrl + "\\" + userSignatureUrl;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 閫氳繃浜哄憳id鑾峰彇娓叉煋Word鐢ㄦ埛绛惧悕瀵硅薄
+ * @param userId 浜哄憳id
+ * @return 鐢ㄦ埛绛惧悕瀵硅薄 or null
+ */
+ public static PictureRenderData getFinalUserSignatureUrl(Integer userId) {
+ String userSignatureUrl = null;
+ if (userId != null) {
+ userSignatureUrl = userMapper.selectById(userId)
+ .getSignatureUrl();
+ if (StringUtils.isBlank(userSignatureUrl)) {
+ throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+ }
+ }
+ return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
+ }
+
+
+ /**
+ * 閫氳繃鍚嶅瓧鑾峰彇娓叉煋Word鐢ㄦ埛绛惧悕瀵硅薄
+ * @param userName 浜哄憳鍚嶅瓧
+ * @return 鐢ㄦ埛绛惧悕瀵硅薄 or null
+ */
+ public static PictureRenderData getFinalUserSignatureUrl(String userName) {
+ String userSignatureUrl = null;
+ if (userName != null) {
+ userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, userName))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(userSignatureUrl)) {
+ throw new ErrorException("鎵句笉鍒拌浜哄憳绛惧悕");
+ }
+ }
+ return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
+ }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java b/inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java
new file mode 100644
index 0000000..386c987
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/util/XWPFDocumentUtils.java
@@ -0,0 +1,119 @@
+package com.ruoyi.inspect.util;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+
+import java.util.*;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/16
+ */
+public class XWPFDocumentUtils {
+
+ public static void updateMergeByDocument(XWPFDocument document) {
+ // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+ List<XWPFTable> xwpfTables = document.getTables();
+ for (int i = 0; i < xwpfTables.size(); i++) {
+ Set<String> set1 = new HashSet<>();
+ Map<String, Map<String, Integer>> maps = new HashMap<>();
+ for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+ for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+ if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().contains("鈭�")) {
+ String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+ if (set1.add(split[1])) {
+ Map<String, Integer> map = new HashMap<>();
+ map.put("sr", j);
+ map.put("sc", k);
+ map.put("er", j + 0);
+ map.put("ec", k + 0);
+ maps.put(split[1], map);
+ } else {
+ Map<String, Integer> map1 = maps.get(split[1]);
+ if (j == map1.get("sr")) {
+ map1.put("ec", map1.get("ec") + 1);
+ } else if (k == map1.get("sc")) {
+ map1.put("er", map1.get("er") + 1);
+ }
+ }
+ String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+ xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+ xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+ xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+ xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+ }
+ }
+ }
+ // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+ List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+ entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+ // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+ List<String> list = new ArrayList<>();
+ for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+ list.add(entry.getKey());
+ }
+ for (int a = list.size() - 1; a >= 0; a--) {
+ Map<String, Integer> v = maps.get(list.get(a));
+ for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+ if (v.get("ec") > v.get("sc")) {
+ try {
+ mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+ } catch (Exception e) {
+ }
+ }
+ }
+ if (v.get("er") > v.get("sr")) {
+ try {
+ mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+ //澶勭悊涓嫳鏂囨崲琛岀殑闂
+ List<XWPFTable> xwpfTables1 = document.getTables();
+ for (int i = 0; i < xwpfTables1.size(); i++) {
+ for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+ for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+ if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+ String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+ String[] split = text.split("@");
+ xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+ XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+ XWPFRun run = xwpfParagraph.createRun();
+ run.setText(split[0]);
+ if (ObjectUtils.isNotNull(split[1])) {
+ run.addBreak();
+ run.setText(split[1]);
+ }
+ xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+ }
+ }
+ }
+ }
+ }
+
+ // 姘村钩鍚堝苟鍗曞厓鏍�
+ private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+ for (int i = fromCol; i <= toCol; i++) {
+ if (i == fromCol) {
+ table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+ } else {
+ table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+ }
+ }
+ }
+
+ // 鍨傜洿鍚堝苟鍗曞厓鏍�
+ private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+ for (int i = fromRow; i <= toRow; i++) {
+ if (i == fromRow) {
+ table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+ } else {
+ table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+ }
+ }
+ }
+}
+
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 9a14798..0e179cd 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -78,7 +78,7 @@
# 鏁版嵁搴撶储寮�
database: 0
# 瀵嗙爜
- password: 123456
+# password: 123456
# 杩炴帴瓒呮椂鏃堕棿
timeout: 10s
lettuce:
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
index 949196f..e4785df 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
@@ -51,7 +51,7 @@
{
this.id = menu.getMenuId();
this.label = menu.getMenuName();
- this.isRersonalButton = menu.geIsRersonalButton();
+ this.isRersonalButton = menu.getIsRersonalButton();
this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
index 39a2cc0..eb77b98 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -239,7 +239,7 @@
this.icon = icon;
}
- public Integer geIsRersonalButton()
+ public Integer getIsRersonalButton()
{
return isRersonalButton;
}
@@ -282,7 +282,7 @@
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
- .append("isRersonalButton", geIsRersonalButton())
+ .append("isRersonalButton", getIsRersonalButton())
.toString();
}
}
--
Gitblit v1.9.3