From 13c00d34e03f8c45d7b17a42bee5cff8f54c2b9c Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期六, 22 二月 2025 14:54:44 +0800
Subject: [PATCH] 添加设备验收校准

---
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java            |   16 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java        |  133 +++++++
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java               |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java                        |   77 ++++
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java                    |   13 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java      |   89 +++++
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java                |   27 +
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java            |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java                    |   58 +++
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java                       |   66 +++
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java |   20 +
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java          |   17 +
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java   |   20 +
 cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml                             |   17 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java                          |  179 ++++++++++
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java             |   16 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java     |  159 +++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java                                |   17 +
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java              |   39 ++
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java    |   20 +
 20 files changed, 1,015 insertions(+), 0 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
new file mode 100644
index 0000000..27c15bf
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
@@ -0,0 +1,133 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceAcceptance;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.service.DeviceAcceptanceFileService;
+import com.ruoyi.device.service.DeviceAcceptanceService;
+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.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Api(tags = "璁惧楠屾敹(瑁呭)")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAcceptance")
+public class DeviceAcceptanceController {
+
+    private DeviceAcceptanceService deviceAcceptanceService;
+    private DeviceAcceptanceFileService deviceAcceptanceFileService;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹鍒楄〃")
+    @GetMapping("/pageDeviceAcceptance")
+    public Result<IPage<DeviceAcceptance>> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return Result.success(deviceAcceptanceService.pageDeviceAcceptance(page, deviceAcceptance));
+    }
+
+    /**
+     * 鏌ヨ璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧楠屾敹")
+    @GetMapping("/getDeviceAcceptance")
+    public Result getDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.getById(acceptanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧楠屾敹")
+    @GetMapping("/delDeviceAcceptance")
+    public Result delDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧楠屾敹")
+    @PostMapping("/addDeviceAcceptance")
+    public Result addDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.save(deviceAcceptance));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "缂栬緫璁惧楠屾敹")
+    @PostMapping("/updateDeviceAcceptance")
+    public Result updateDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.updateById(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹瀵煎嚭")
+    @GetMapping("/exportDeviceAcceptance")
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response){
+        deviceAcceptanceService.exportDeviceAcceptance(acceptanceId, response);
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鏂板
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鏂板")
+    @PostMapping("/uploadDeviceAcceptanceFile")
+    public Result<?> uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        return Result.success(deviceAcceptanceService.uploadDeviceAcceptanceFile(acceptanceId, file));
+    }
+
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒楄〃")
+    @GetMapping("/getDeviceAcceptanceFileList")
+    public Result<List<DeviceAcceptanceFile>> getVerifyMethodFileList(Integer acceptanceId){
+        return Result.success(deviceAcceptanceFileService.list(Wrappers.<DeviceAcceptanceFile>lambdaQuery()
+                .eq(DeviceAcceptanceFile::getAcceptanceId, acceptanceId)));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒犻櫎")
+    @GetMapping("/delDeviceAcceptanceFileList")
+    public Result delDeviceAcceptanceFileList(Integer acceptanceFileId){
+        return Result.success(deviceAcceptanceFileService.removeById(acceptanceFileId));
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
new file mode 100644
index 0000000..67ce760
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.device.dto.DeviceMetricRecordDto;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import com.ruoyi.device.service.DeviceMetricRecordService;
+import com.ruoyi.device.service.DeviceMetricsCopyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Api(tags = "璁惧 - 璁惧鏍″噯")
+@RestController
+@RequestMapping("/deviceMetricRecord")
+public class DeviceMetricRecordController {
+
+    @Autowired
+    private DeviceMetricRecordService deviceMetricRecordService;
+
+    @Autowired
+    private DeviceMetricsCopyService deviceMetricsCopyService;
+
+    @Autowired
+    private NumberGenerator<DeviceMetricRecord> numberGenerator;
+
+    @ApiOperation("璁惧鏍″噯鍒嗛〉鏌ヨ")
+    @GetMapping("/deviceMetricRecordPage")
+    public Result deviceMetricRecordPage(@RequestParam("deviceId") Integer deviceId, Page page, @RequestParam("type") String type) {
+        return Result.success(deviceMetricRecordService.page(page, Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏂板 鏇存柊")
+    @PostMapping("/addOrUpdateDeviceMetricRecord")
+    public Result addOrUpdateDeviceMetricRecord(@RequestBody DeviceMetricRecordDto deviceMetricRecordDto) {
+        if (ObjectUtils.isEmpty(deviceMetricRecordDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(5, "SBJZ" + year + month, DeviceMetricRecord::getProcessNumber);
+            deviceMetricRecordDto.setProcessNumber(processNumber);
+        }
+        deviceMetricRecordService.saveOrUpdate(deviceMetricRecordDto);
+        if (CollectionUtils.isNotEmpty(deviceMetricRecordDto.getDeviceMetricsCopyList())) {
+            deviceMetricRecordDto.getDeviceMetricsCopyList().forEach(i -> i.setDeviceMetricsId(deviceMetricRecordDto.getId()));
+            deviceMetricsCopyService.saveOrUpdateBatch(deviceMetricRecordDto.getDeviceMetricsCopyList());
+        }
+        return Result.success();
+    }
+
+    @ApiOperation("璁惧鏍″噯 鍒犻櫎")
+    @DeleteMapping("/deleteDeviceMetricRecord")
+    public Result deleteDeviceMetricRecord(@RequestParam("id") Integer id) {
+        DeviceMetricRecord deviceMetricRecord = deviceMetricRecordService.getById(id);
+        deviceMetricsCopyService.remove(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id));
+        // 鍒犻櫎鏂囦欢
+        FileSaveUtil.DeleteFile(deviceMetricRecord.getSystemFileName());
+        return Result.success(deviceMetricRecordService.removeById(id));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏍″噯鏉$洰鏌ヨ")
+    @GetMapping("/showDeviceMetricsCopy")
+    public Result showDeviceMetricsCopy(@RequestParam("id") Integer id, @RequestParam("type") String type) {
+        return Result.success(deviceMetricsCopyService.list(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id)
+                .eq(DeviceMetricsCopy::getType, type)));
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java
new file mode 100644
index 0000000..bf0918c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceMetricRecordDto extends DeviceMetricRecord {
+
+    private List<DeviceMetricsCopy> deviceMetricsCopyList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java
new file mode 100644
index 0000000..e6eb335
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileMapper extends BaseMapper<DeviceAcceptanceFile> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java
new file mode 100644
index 0000000..31bdb87
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.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.DeviceAcceptance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+public interface DeviceAcceptanceMapper extends BaseMapper<DeviceAcceptance> {
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, @Param("ew") QueryWrapper<DeviceAcceptance> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
new file mode 100644
index 0000000..4c1824a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyMapper extends BaseMapper<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
new file mode 100644
index 0000000..2c66be9
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
@@ -0,0 +1,77 @@
+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-20 01:45:14
+ */
+@Getter
+@Setter
+@TableName("device_acceptance")
+@ApiModel(value = "DeviceAcceptance瀵硅薄", description = "璁惧楠屾敹(瑁呭)")
+public class DeviceAcceptance {
+
+    @TableId(value = "acceptance_id", type = IdType.AUTO)
+    private Integer acceptanceId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒拌揣鏃ユ湡")
+    private LocalDate arrivalDate;
+
+    @ApiModelProperty("閲戦")
+    private String goldAmount;
+
+    @ApiModelProperty("缁翠慨鍗曚綅")
+    private String maintenanceunit;
+
+    @ApiModelProperty("鏀惰澶囦富鏈哄拰澶囦唤鎯呭喌")
+    private String spareParts;
+
+    @ApiModelProperty("瀹夎鍜岃皟璇曟儏鍐�")
+    private String installationDebugging;
+
+    @ApiModelProperty("楠屾敹鎯呭喌")
+    private String checkSituation;
+
+    @ApiModelProperty("鎺ユ敹绛惧瓧")
+    private String receivingSignature;
+
+    @ApiModelProperty("鍘傚浠h〃")
+    private String producer;
+
+    @ApiModelProperty("鎺ユ敹浜�")
+    private String recipient;
+
+    @ApiModelProperty("鎺ユ敹鏃堕棿")
+    private String recipientDate;
+
+    @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/DeviceAcceptanceFile.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
new file mode 100644
index 0000000..914f15e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
@@ -0,0 +1,58 @@
+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.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+@Getter
+@Setter
+@TableName("device_acceptance_file")
+@ApiModel(value = "DeviceAcceptanceFile瀵硅薄", description = "璁惧楠屾敹(瑁呭)闄勪欢琛�")
+public class DeviceAcceptanceFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "acceptance_file_id", type = IdType.AUTO)
+    private Integer acceptanceFileId;
+
+    @ApiModelProperty("璁惧楠屾敹id")
+    private Integer acceptanceId;
+
+    @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @ApiModelProperty("闄勪欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+
+    @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/DeviceMetricsCopy.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
new file mode 100644
index 0000000..fb7d79b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
@@ -0,0 +1,66 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Getter
+@Setter
+@TableName("device_metrics_copy")
+@ApiModel(value = "DeviceMetricsCopy瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰")
+public class DeviceMetricsCopy implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧鏍″噯 - 鏍″噯璁板綍id")
+    private Integer deviceMetricsId;
+
+    @ApiModelProperty("璁¢噺鍙傛暟")
+    private String measurementParameter;
+
+    @ApiModelProperty("閲忕▼鑼冨洿")
+    private String rangeOfMeasurement;
+
+    @ApiModelProperty("鏈�澶у厑璁歌宸�")
+    private String maxPermissibleError;
+
+    @ApiModelProperty("鍒ゅ畾鏍囧噯")
+    private String judgmentCriteria;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createdBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private LocalDateTime creationTime;
+
+    @ApiModelProperty("鏄惁鏍″噯")
+    private String isCalibration;
+
+    @ApiModelProperty("鍒ゅ畾缁撴灉")
+    private String result;
+
+    @ApiModelProperty("鍗曢」缁撴灉璇存槑")
+    private String singleResultStatement;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java
new file mode 100644
index 0000000..11218d1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileService extends IService<DeviceAcceptanceFile> {
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java
new file mode 100644
index 0000000..3446429
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java
@@ -0,0 +1,39 @@
+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.pojo.DeviceAcceptance;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+public interface DeviceAcceptanceService extends IService<DeviceAcceptance> {
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance);
+
+
+    boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file);
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java
new file mode 100644
index 0000000..d55a281
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordService extends IService<DeviceMetricRecord> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java
new file mode 100644
index 0000000..be7c8cc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyService extends IService<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java
new file mode 100644
index 0000000..aa4577c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.service.DeviceAcceptanceFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+@Service
+public class DeviceAcceptanceFileServiceImpl extends ServiceImpl<DeviceAcceptanceFileMapper, DeviceAcceptanceFile> implements DeviceAcceptanceFileService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
new file mode 100644
index 0000000..911c0e5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
@@ -0,0 +1,159 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.utils.QueryWrappers;
+import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
+import com.ruoyi.device.mapper.DeviceAcceptanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAcceptance;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.service.DeviceAcceptanceService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Service
+public class DeviceAcceptanceServiceImpl extends ServiceImpl<DeviceAcceptanceMapper, DeviceAcceptance> implements DeviceAcceptanceService {
+
+    @Resource
+    private DeviceAcceptanceFileMapper deviceAcceptanceFileMapper;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    @Override
+    public IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return baseMapper.pageDeviceAcceptance(page, QueryWrappers.queryWrappers(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        if (acceptanceId == null) {
+            throw new ErrorException("缂哄皯楠屾敹id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        DeviceAcceptanceFile acceptanceFile = new DeviceAcceptanceFile();
+        acceptanceFile.setAcceptanceId(acceptanceId);
+        acceptanceFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            acceptanceFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            acceptanceFile.setType(2);
+        }
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            acceptanceFile.setFileUrl(pathName);
+            deviceAcceptanceFileMapper.insert(acceptanceFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @Override
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response) {
+        DeviceAcceptance deviceAcceptance = baseMapper.selectById(acceptanceId);
+        if (deviceAcceptance == null) {
+            throw new ErrorException("璁惧楠屾敹涓嶅瓨鍦�");
+        }
+        Device device = null;
+        if (deviceAcceptance.getDeviceId() != null) {
+            device = deviceMapper.selectById(deviceAcceptance.getDeviceId());
+        }
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/acceptance-certificate.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        Device finalDevice = device;
+        String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAcceptance", deviceAcceptance);
+                    put("device", finalDevice);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    deviceName+ "楠屾敹鍗�", "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("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java
new file mode 100644
index 0000000..8ce075f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.service.DeviceMetricRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Service
+public class DeviceMetricRecordServiceImpl extends ServiceImpl<DeviceMetricRecordMapper, DeviceMetricRecord> implements DeviceMetricRecordService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
new file mode 100644
index 0000000..22d1535
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMetricsCopyMapper;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import com.ruoyi.device.service.DeviceMetricsCopyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Service
+public class DeviceMetricsCopyServiceImpl extends ServiceImpl<DeviceMetricsCopyMapper, DeviceMetricsCopy> implements DeviceMetricsCopyService {
+
+}
diff --git a/cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml
new file mode 100644
index 0000000..45071c4
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.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.DeviceAcceptanceMapper">
+
+    <!-- 璁惧楠屾敹鍒楄〃 -->
+    <select id="pageDeviceAcceptance" resultType="com.ruoyi.device.pojo.DeviceAcceptance">
+        select * from (
+        select *
+        from device_acceptance
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
new file mode 100644
index 0000000..da4ca5f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
@@ -0,0 +1,179 @@
+package com.ruoyi.common.utils;
+
+import com.alibaba.excel.util.IoUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.FileSystemUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Random;
+
+/**
+ * 淇濆瓨鏂囦欢宸ュ叿
+ */
+@Slf4j
+@Component
+public class FileSaveUtil {
+
+    // 鍙杫ml涓殑璺緞 + /
+    private static String FILE_PATH;
+
+    private static String WORD_URL_PATH;
+
+    private static String[] ALLOWED;
+
+    @Value("${file.path}")
+    private String file;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.allowed}")
+    private String[] allowed;
+
+    @PostConstruct
+    public void getFile() {
+        FILE_PATH = this.file;
+    }
+
+    @PostConstruct
+    public void getWordUrl(){
+        WORD_URL_PATH = this.wordUrl;
+    }
+
+    @PostConstruct
+    public void getAllowed(){
+        ALLOWED = this.allowed;
+    }
+
+    /**
+     * 瀛樺偍鏂囦欢涓诲嚱鏁�
+     * @param file 鏂囦欢浜岃繘鍒舵祦
+     * @return 杩斿洖鏂囦欢鍚嶇О鐢ㄤ簬瀛樺偍鏁版嵁搴�
+     */
+    public static String StoreFile(MultipartFile file) {
+        String originalFilename = file.getOriginalFilename();
+        // 鐢熸垚闅忔満鍚嶇О锛氭椂闂確闅忔満6浣嶆暟瀛�
+        String FileName = System.currentTimeMillis() + "_" + getNumber(6);
+        String suffix = null;
+        if (originalFilename != null) {
+            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
+            // 濡傛灉鍚庣紑鍚嶄笉閫氳繃鎶涘嚭寮傚父
+            if (!isFileAllowed(suffix)){
+                throw new RuntimeException(suffix);
+            }
+        }
+        // 鍚嶇О鎷兼帴
+        String fileName = FileName + suffix;
+        // 杩涜瀛樺偍
+        try {
+            storeFileWithFileName(file.getBytes(), fileName);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return fileName;
+    }
+
+    public static Boolean DeleteFile(String fileName) {
+        if (ObjectUtils.isEmpty(fileName)) {
+            return false;
+        }
+        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
+    }
+    /**
+     * 瀛樺偍鏂囦欢鍑芥暟
+     * @param content 鏂囦欢浜岃繘鍒舵祦
+     * @param fileName 鏂囦欢鍚嶇О
+     */
+    private static void storeFileWithFileName(byte[] content, String fileName) {
+        // 瀛樺偍璺緞
+        String path = FILE_PATH + File.separatorChar;
+        // 鐩綍涓嶅瓨鍦ㄥ垯鍒涘缓
+        File file = new File(path);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        // 寮�濮嬪瓨鍌�
+        try (FileOutputStream os = new FileOutputStream(path + fileName);
+             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
+             IoUtils.copy(is, os);
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢瀛樺偍鏍煎紡寮傚父");
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏂囦欢鏄惁琚厑璁镐笂浼�
+     *
+     * @param fileName 鏂囦欢鍚�
+     * @return 鍏佽true, 鍚﹀垯false
+     */
+    private static boolean isFileAllowed(String fileName) {
+        // 鑾峰彇鍚庣紑鍚�
+        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
+        for (String allow : ALLOWED) {
+            if (allow.equals(suffixName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 淇濆瓨鏂囦欢鍒皐ord鏂囦欢澶归噷
+     * @param file
+     * @return
+     */
+    public static String uploadWordFile(MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path;
+        try {
+            String contentType = file.getContentType();
+            if (contentType != null && contentType.startsWith("image/")) {
+                // 鏄浘鐗�
+                path = FILE_PATH;
+            } else {
+                // 鏄枃浠�
+                path = WORD_URL_PATH;
+            }
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            return pathName;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+    /**
+     * 鑾峰彇闅忔満鏁板瓧
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍊�
+     */
+    public static String getNumber(int n) {
+        char[] chars = "1234567890".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java
new file mode 100644
index 0000000..bbf9da3
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java
@@ -0,0 +1,17 @@
+package com.ruoyi.common.utils;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+@Component
+public class MyUtil<T> {
+
+
+
+
+
+}

--
Gitblit v1.9.3