From e8e73529983bf656d8aa6627215045f56cc27103 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期一, 24 二月 2025 11:01:00 +0800
Subject: [PATCH] Merge branch 'dev' into dev_ly
---
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java | 27
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java | 16
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java | 16
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java | 25
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java | 64
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java | 221 +
cnas-personnel/src/main/resources/static/supervision-record.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java | 16
ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java | 27
cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml | 17
cnas-device/src/main/resources/static/word/examine-plan-detail.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java | 25
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java | 16
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java | 120
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java | 16
cnas-device/src/main/resources/static/word/device-document.docx | 0
cnas-personnel/src/main/resources/static/person-basic-info.docx | 0
cnas-device/src/main/resources/static/word/device-scrapped.docx | 0
cnas-personnel/src/main/resources/static/supervision-control-sheet.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java | 60
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java | 83
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java | 67
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java | 156
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java | 61
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java | 26
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java | 133
cnas-device/src/main/resources/static/word/device-external-apply.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java | 100
cnas-device/src/main/resources/static/word/device-inspection-record.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java | 113
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java | 90
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java | 74
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java | 86
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java | 35
cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java | 43
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java | 26
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java | 24
pom.xml | 8
cnas-device/src/main/resources/static/word/quipment-details.docx | 0
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java | 66
cnas-device/src/main/resources/static/word/traceability-management-details.docx | 0
cnas-device/src/main/resources/static/word/device-accident-report.docx | 0
cnas-personnel/pom.xml | 46
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java | 229 +
cnas-personnel/src/main/resources/static/credentials-deal.docx | 0
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java | 77
cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml | 24
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java | 27
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java | 31
cnas-device/src/main/resources/static/word/use-record.docx | 0
cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java | 20
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java | 132
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java | 21
cnas-device/src/main/resources/static/word/device-status.docx | 0
cnas-device/src/main/resources/static/word/examine-record.docx | 0
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java | 20
cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml | 47
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java | 107
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java | 23
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java | 14
cnas-personnel/src/main/resources/static/person-training.docx | 0
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java | 116
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml | 118
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java | 34
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java | 2
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java | 26
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java | 23
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java | 53
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java | 28
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java | 49
ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java | 37
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java | 66
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java | 20
cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml | 23
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java | 20
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java | 27
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java | 429 ++
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java | 99
cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java | 23
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java | 93
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java | 4
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java | 47
cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml | 17
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java | 27
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java | 24
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java | 82
cnas-device/src/main/resources/static/word/maintenance-plan.docx | 0
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java | 159
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java | 107
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java | 14
cnas-device/src/main/resources/static/word/maintenance-records.docx | 0
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java | 98
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml | 19
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java | 114
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java | 92
cnas-device/src/main/resources/static/word/device-calibration-plan.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java | 20
ruoyi-admin/src/main/resources/application-druid.yml | 13
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java | 189 +
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java | 16
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java | 15
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java | 13
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java | 246 +
cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java | 31
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java | 101
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java | 78
cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java | 88
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java | 16
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml | 126
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java | 58
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java | 177
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java | 30
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java | 67
cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx | 0
cnas-personnel/src/main/resources/static/communication-deal.docx | 0
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java | 13
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java | 16
cnas-device/src/main/resources/static/word/acceptance-certificate.docx | 0
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java | 2
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java | 93
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java | 32
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java | 23
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java | 20
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java | 28
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java | 16
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java | 45
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java | 42
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java | 48
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java | 9
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java | 42
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java | 39
cnas-personnel/src/main/resources/static/explain-deal.docx | 0
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java | 60
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java | 42
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java | 48
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java | 63
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java | 84
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java | 69
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java | 85
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java | 85
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java | 41
cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml | 46
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java | 87
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java | 9
cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml | 29
ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml | 25
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java | 20
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java | 159
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java | 179
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java | 29
cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx | 0
cnas-personnel/src/main/resources/static/person-training-record.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java | 20
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java | 23
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java | 89
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/OperationInstructionMapper.xml | 13
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java | 14
ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java | 179
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java | 65
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java | 20
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml | 65
ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java | 17
cnas-personnel/src/main/resources/static/personnel-capacity.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java | 61
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java | 31
cnas-device/src/main/resources/static/word/incident-report.docx | 0
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java | 36
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java | 13
cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx | 0
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java | 14
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java | 158
cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java | 65
cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml | 14
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java | 105
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java | 16
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java | 97
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java | 35
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java | 25
cnas-device/src/main/resources/mapper/InstructionMapper.xml | 19
cnas-device/pom.xml | 17
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java | 113
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java | 69
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java | 58
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java | 59
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java | 63
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java | 133
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java | 59
cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml | 27
cnas-personnel/src/main/resources/static/training-record.docx | 0
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java | 41
cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java | 36
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java | 16
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java | 64
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java | 152
cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java | 7
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java | 340 +
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java | 27
cnas-personnel/src/main/resources/static/super-vise-plan.docx | 0
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java | 73
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java | 32
ruoyi-admin/pom.xml | 7
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java | 16
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java | 20
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java | 99
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java | 61
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java | 103
cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml | 21
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java | 21
cnas-device/src/main/resources/mapper/DeviceStateMapper.xml | 19
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java | 41
cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java | 20
221 files changed, 10,974 insertions(+), 4 deletions(-)
diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
index 4aee7af..74dbc21 100644
--- a/cnas-device/pom.xml
+++ b/cnas-device/pom.xml
@@ -18,6 +18,23 @@
<groupId>com.ruoyi</groupId>
<artifactId>inspect-server</artifactId>
</dependency>
+
+ <!--mqtt jar鍖�-->
+ <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
+ <dependency>
+ <groupId>org.springframework.integration</groupId>
+ <artifactId>spring-integration-mqtt</artifactId>
+ </dependency>
+ <!--mqtt闇�瑕佺殑jar鍖�-->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-integration</artifactId>
+ </dependency>
+ <!--mqtt闇�瑕佺殑jar鍖�-->
+ <dependency>
+ <groupId>org.springframework.integration</groupId>
+ <artifactId>spring-integration-stream</artifactId>
+ </dependency>
</dependencies>
<properties>
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..d77575d
--- /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 = "鍒犻櫎璁惧楠屾敹")
+ @DeleteMapping("/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/DeviceAccidentReportController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
new file mode 100644
index 0000000..22a216b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
@@ -0,0 +1,84 @@
+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.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Api(tags = "璁惧浜嬫晠鎶ュ憡鍗�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAccidentReport")
+public class DeviceAccidentReportController {
+
+ private DeviceAccidentReportService deviceAccidentReportService;
+
+
+ /**
+ * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "璁惧浜嬫晠鎶ュ憡鍒楄〃")
+ @GetMapping("/pageDeviceAccidentReport")
+ public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
+ return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
+ }
+
+ /**
+ * 鏌ヨ璁惧浜嬫晠鎶ュ憡
+ * @return
+ */
+ @ApiOperation(value = "鏌ヨ璁惧浜嬫晠鎶ュ憡")
+ @GetMapping("/getDeviceAccidentReport")
+ public Result getDeviceAccidentReport(Integer accidentReportId){
+ return Result.success(deviceAccidentReportService.getById(accidentReportId));
+ }
+
+ /**
+ * 鍒犻櫎璁惧浜嬫晠鎶ュ憡
+ * @return
+ */
+ @ApiOperation(value = "鍒犻櫎璁惧浜嬫晠鎶ュ憡")
+ @DeleteMapping("/delDeviceAccidentReport")
+ public Result delDeviceAccidentReport(Integer accidentReportId){
+ return Result.success(deviceAccidentReportService.removeById(accidentReportId));
+ }
+
+ /**
+ * 鏂板璁惧浜嬫晠鎶ュ憡
+ * @return
+ */
+ @ApiOperation(value = "鏂板璁惧浜嬫晠鎶ュ憡")
+ @PostMapping("/addDeviceAccidentReport")
+ public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
+ return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
+ }
+
+ /**
+ * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+ * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+ * @param response 鍝嶅簲
+ */
+ @ApiOperation(value = "瀵煎嚭璁惧浜嬫晠鎶ュ憡")
+ @GetMapping("/exportDeviceAccidentReport")
+ public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+ deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
+ return Result.success();
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
new file mode 100644
index 0000000..6be1b18
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
@@ -0,0 +1,73 @@
+package com.ruoyi.device.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceBorrow;
+import com.ruoyi.device.service.DeviceBorrowService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@RestController
+@RequestMapping("/deviceBorrow")
+public class DeviceBorrowController {
+
+ @Resource
+ private DeviceBorrowService deviceBorrowService;
+
+
+ //鍒嗛〉
+ @GetMapping("/deviceBorrowPage")
+ public Result deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) throws Exception {
+ return Result.success(deviceBorrowService.deviceBorrowPage(page, deviceBorrow));
+ }
+
+ //鏌ヨ
+ @GetMapping("/getDeviceBorrow")
+ public Result getDeviceBorrow(Integer id) {
+ return Result.success(deviceBorrowService.getDeviceBorrow(id));
+ }
+
+ //鏂板
+ @PostMapping("/saveDeviceBorrow")
+ public Result saveDeviceBorrow(@RequestBody DeviceBorrow deviceBorrow) {
+ return Result.success(deviceBorrowService.saveDeviceBorrow(deviceBorrow));
+ }
+
+ //鍒犻櫎
+ @DeleteMapping("/deleteDeviceBorrow")
+ public Result deleteDeviceBorrow(Integer id) {
+ return Result.success(deviceBorrowService.removeById(id));
+ }
+
+ //瀵煎嚭
+ @GetMapping("/deviceBorrowExport")
+ public Result deviceBorrowExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+ List<DeviceBorrow> deviceBorrows = deviceBorrowService.getDeviceBorrowBydeviceId(deviceId);
+ response.setHeader("requestType", "excel");
+ response.setHeader("Access-Control-Expose-Headers", "requestType");
+ // 璁剧疆鍗曞厓鏍兼牱寮�
+ // 淇濆瓨鍒扮涓�涓猻heet涓�
+ EasyExcel.write(response.getOutputStream())
+ .head(DeviceBorrow.class)
+ .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+ .sheet()
+ .doWrite(deviceBorrows);
+ return Result.success();
+ }
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
new file mode 100644
index 0000000..f86dd9c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
@@ -0,0 +1,85 @@
+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.DeviceBreakdownMaintenance;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Api(tags = "璁惧鏁呴殰缁翠慨琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceBreakdownMaintenance")
+public class DeviceBreakdownMaintenanceController {
+
+ private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
+
+
+ /**
+ * 璁惧鏁呴殰缁翠慨鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "璁惧鏁呴殰缁翠慨鍒楄〃")
+ @GetMapping("/pageDeviceBreakdownMaintenance")
+ public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+ return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
+ }
+
+ /**
+ * 鏌ヨ璁惧鏁呴殰缁翠慨
+ * @return
+ */
+ @ApiOperation(value = "鏌ヨ璁惧鏁呴殰缁翠慨")
+ @GetMapping("/getDeviceBreakdownMaintenance")
+ public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
+ return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
+ }
+
+ /**
+ * 鍒犻櫎璁惧鏁呴殰缁翠慨
+ * @return
+ */
+ @ApiOperation(value = "鍒犻櫎璁惧鏁呴殰缁翠慨")
+ @DeleteMapping("/delDeviceBreakdownMaintenance")
+ public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
+ return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
+ }
+
+ /**
+ * 鏂板璁惧鏁呴殰缁翠慨
+ * @return
+ */
+ @ApiOperation(value = "鏂板璁惧鏁呴殰缁翠慨")
+ @PostMapping("/addDeviceBreakdownMaintenance")
+ public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
+ return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
+ }
+
+ /**
+ * 瀵煎嚭璁惧鏁呴殰缁翠慨
+ * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+ * @param response 鍝嶅簲
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭璁惧鏁呴殰缁翠慨")
+ @GetMapping("/exportDeviceBreakdownMaintenance")
+ public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
+ deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
+ return Result.success();
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
new file mode 100644
index 0000000..9db6182
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
@@ -0,0 +1,99 @@
+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.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Api(tags = "璁惧鐐规璁板綍")
+@RestController
+@RequestMapping("/deviceInspectionRecord")
+public class DeviceInspectionRecordController {
+ @Resource
+ private DeviceInspectionRecordService deviceInspectionRecordService;
+
+ /**
+ * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+ */
+ @ApiOperation("鍒嗛〉鏌ヨ璁惧鐐规璁板綍")
+ @GetMapping("/getDeviceInspectionRecordByPage")
+ public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto itemParameter) {
+ return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
+ }
+
+ /**
+ * 鏌ヨ鐐规璇︽儏
+ */
+ @ApiOperation("鏌ヨ鐐规璇︽儏")
+ @GetMapping("/getDeviceInspectionRecord")
+ public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+ return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
+ }
+
+ /**
+ * 鏂板璁惧鐐规璁板綍
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ @ApiOperation("鏂板璁惧鐐规璁板綍")
+ @PostMapping("/addDeviceInspectionRecord")
+ public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+ return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
+ }
+
+ /**
+ * 淇敼璁惧鐐规璁板綍
+ */
+ @ApiOperation("淇敼璁惧鐐规璁板綍")
+ @PostMapping("/updateDeviceInspectionRecord")
+ public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+ return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
+ }
+
+ /**
+ * 鍒犻櫎璁惧鐐规璁板綍
+ */
+ @ApiOperation("鍒犻櫎璁惧鐐规璁板綍")
+ @DeleteMapping("/deleteDeviceInspectionRecord")
+ public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+ return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
+ }
+
+
+ /**
+ * 澶嶆牳鐐规璁板綍
+ * @return
+ */
+ @ApiOperation(value = "澶嶆牳鏍告煡璁板綍")
+ @PostMapping("/reviewDeviceInspectionRecord")
+ public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
+ return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
+ }
+
+
+ /**
+ * 瀵煎嚭璁惧鐐规璁板綍
+ */
+ @ApiOperation("瀵煎嚭璁惧鐐规璁板綍")
+ @GetMapping("/exportDeviceInspectionRecord")
+ public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
+ return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
new file mode 100644
index 0000000..a4af938
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
@@ -0,0 +1,103 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/deviceInstruction")
+public class DeviceInstructionController {
+
+ @Autowired
+ private DeviceInstructionService deviceInstructionService;
+
+ @Autowired
+ private DeviceOperationInstructionService deviceOperationInstructionService;
+
+
+ @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+ @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+ public Result<IPage<DeviceInstruction>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
+ return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
+ }
+
+ @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+ @PostMapping("/newHomeworkGuidebookAdded")
+ public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
+ deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+ @GetMapping("/homeworkGuidebookEditor")
+ public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+ DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
+ List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.homeworkGuidebookEditor(instructionId);
+ HashMap<String, Object> map = new HashMap<>();
+ map.put("list", list);
+ map.put("instruction", instruction);
+ return Result.success(map);
+ }
+
+ @ApiOperation(value = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+ @GetMapping("/deleteHomeworkGuidebook")
+ public Result deleteHomeworkGuidebook(String ids){
+ if (ObjectUtils.isNotEmpty(ids)) {
+ String[] idArray = ids.split(",");
+ deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+ }
+ return Result.success();
+ }
+
+ @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+ @GetMapping("/homeworkGuidebook")
+ public Result homeworkGuidebook(String id, String instructionId){
+ // 鍒犻櫎瀛愯〃鏁版嵁
+ deviceOperationInstructionService.removeById(id);
+ // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+ long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+ .eq(OperationInstruction::getInstructionId, instructionId));
+ // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+ if (count < 1) {
+ deviceInstructionService.removeById(id);
+ }
+ return Result.success();
+ }
+
+ @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+ @GetMapping("/approvalOfHomeworkInstructionManual")
+ public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+ deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+ .eq(OperationInstruction::getId, id)
+ .set(OperationInstruction::getStatus, status)
+ .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
+ .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+ return Result.success();
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
new file mode 100644
index 0000000..9420f41
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -0,0 +1,98 @@
+package com.ruoyi.device.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.device.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * todo: 瀛欐渤婊�
+ */
+@RestController
+@RequestMapping("/device-maintain")
+public class DeviceMaintenanceController {
+
+ @Autowired
+ private DeviceMaintenanceService deviceMaintenanceService;
+
+ @Autowired
+ private NumberGenerator<DeviceMaintenance> numberGenerator;
+ //澧�
+ @PostMapping()
+ public Result create(@RequestBody DeviceMaintenance deviceMaintenance){
+ String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+ String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+ String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceMaintenance::getDeviceNumber);
+ deviceMaintenance.setDeviceNumber(processNumber);
+ return Result.success(deviceMaintenanceService.save(deviceMaintenance));
+ }
+
+ //閫氳繃deviceId鏌ヨ缁存姢鏁版嵁
+ @GetMapping("/getDeviceMaintenancePage")
+ public Result getDeviceMaintenancePage(@RequestParam("deviceId") Integer deviceId, Page page, String deviceNumber){
+ return Result.success(deviceMaintenanceService.getDeviceMaintenancePage(page, deviceId, deviceNumber));
+ }
+
+ //鍒�
+ @DeleteMapping("/delete/{id}")
+ public void deleteDeviceFault(@PathVariable Integer id) {
+ deviceMaintenanceService.removeById(id);
+ }
+
+ @GetMapping("/deviceMaintenanceExport")
+ public Result deviceMaintenanceExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
+ List<DeviceMaintenanceExport> list = deviceMaintenanceService.deviceMaintenanceExport(deviceId);
+ response.setHeader("requestType","excel");
+ response.setHeader("Access-Control-Expose-Headers", "requestType");
+ // 璁剧疆鍗曞厓鏍兼牱寮�
+ // 淇濆瓨鍒扮涓�涓猻heet涓�
+ EasyExcel.write(response.getOutputStream())
+ .head(DeviceMaintenanceExport.class)
+ .registerWriteHandler(getHorizontalCellStyleStrategy((short) 12))
+ .sheet()
+ .doWrite(list);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "璁惧缁存姢璁板綍瀵煎嚭")
+ @GetMapping("/exportMaintenanceRecord")
+ public void exportMaintenanceRecord(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+ deviceMaintenanceService.exportMaintenanceRecord(deviceId, response);
+ }
+
+ /**
+ * 鍗曞厓鏍兼牱寮忕瓥鐣�
+ */
+ public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy(Short fontHeightInPoints) {
+ // 鍐呭鐨勭瓥鐣�
+ WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+
+ // 銆愭按骞冲眳涓渶瑕佷娇鐢ㄤ互涓嬩袱琛屻��
+ // 璁剧疆鏂囧瓧宸﹀彸灞呬腑
+ contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+ // 璁剧疆鏂囧瓧涓婁笅灞呬腑
+ contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+ // 璁剧疆 鑷姩鎹㈣
+ contentWriteCellStyle.setWrapped(true);
+
+ // 鏍峰紡绛栫暐
+ return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
index 9ee8ffe..4052858 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -65,7 +65,7 @@
* @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
*/
@ApiOperation("鍒犻櫎璁惧淇濆吇璁″垝")
- @GetMapping("/deleteMaintenancePlan")
+ @DeleteMapping("/deleteMaintenancePlan")
public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
}
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/controller/DeviceScrappedController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
new file mode 100644
index 0000000..95794eb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
@@ -0,0 +1,82 @@
+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.pojo.DeviceScrapped;
+import com.ruoyi.device.service.DeviceScrappedService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Api(tags = "璁惧鎶ュ簾鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceScrapped")
+public class DeviceScrappedController {
+
+ private DeviceScrappedService deviceScrappedService;
+
+
+ /**
+ * 璁惧鎶ュ簾鐢宠鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "璁惧鎶ュ簾鐢宠鍒楄〃")
+ @GetMapping("/pageDeviceScrapped")
+ public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
+ return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
+ }
+
+ /**
+ * 鏌ヨ璁惧鎶ュ簾鐢宠
+ * @return
+ */
+ @ApiOperation(value = "鏌ヨ璁惧鎶ュ簾鐢宠")
+ @GetMapping("/getDeviceScrapped")
+ public Result getDeviceScrapped(Integer scrappedId){
+ return Result.success(deviceScrappedService.getById(scrappedId));
+ }
+
+ /**
+ * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+ * @return
+ */
+ @ApiOperation(value = "鍒犻櫎璁惧鎶ュ簾鐢宠")
+ @DeleteMapping("/delDeviceScrapped")
+ public Result delDeviceScrapped(Integer scrappedId){
+ return Result.success(deviceScrappedService.removeById(scrappedId));
+ }
+
+ /**
+ * 鏂板璁惧鎶ュ簾鐢宠
+ * @return
+ */
+ @ApiOperation(value = "鏂板璁惧鎶ュ簾鐢宠")
+ @PostMapping("/addDeviceScrapped")
+ public Result addDeviceScrapped(@RequestBody DeviceScrapped deviceScrapped){
+ return Result.success(deviceScrappedService.addDeviceScrapped(deviceScrapped));
+ }
+
+ /**
+ * 瀵煎嚭璁惧鎶ュ簾鐢宠
+ */
+ @ApiOperation("瀵煎嚭璁惧鎶ュ簾鐢宠")
+ @GetMapping("/exportDeviceScrapped")
+ public Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+ return deviceScrappedService.exportDeviceScrapped(scrappedId, response);
+ }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java
new file mode 100644
index 0000000..4c73996
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java
@@ -0,0 +1,87 @@
+package com.ruoyi.device.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.excel.DeviceStateExport;
+import com.ruoyi.device.pojo.DeviceState;
+import com.ruoyi.device.service.DeviceStateService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@RestController
+@RequestMapping("/deviceState")
+public class DeviceStateController {
+
+ @Autowired
+ private DeviceStateService deviceStateService;
+
+ @Autowired
+ private NumberGenerator<DeviceState> numberGenerator;
+
+ @PostMapping("saveDeviceState")
+ public Result saveIncidentReportData(@RequestBody DeviceState deviceState) {
+ if (ObjectUtils.isEmpty(deviceState.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(3, "DG-TC-23FM " + month + "-" + year + month, DeviceState::getProcessNumber);
+ deviceState.setProcessNumber(processNumber);
+ }
+ deviceStateService.saveOrUpdate(deviceState);
+ return Result.success();
+ }
+
+ @GetMapping("/getDeviceStatePage")
+ public Result getDeviceStatePage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
+ return Result.success(deviceStateService.getDeviceStatePage(deviceId, page, processNumber));
+ }
+
+ @DeleteMapping("/deleteDeviceState")
+ public Result deleteDeviceState(@RequestParam("stateId") Integer stateId){
+ return Result.success(deviceStateService.removeById(stateId));
+ }
+
+ @PostMapping("/deviceStateExport")
+ public Result deviceStateExport(@RequestParam("deviceId") Integer deviceId, String processNumber, HttpServletResponse response) throws Exception {
+ IPage<DeviceStateDto> deviceBorrows = deviceStateService.getDeviceStatePage(deviceId, new Page<>(1, -1), processNumber);
+ List<DeviceStateExport> studentList = JSONObject.parseArray(JSON.toJSONString(deviceBorrows.getRecords()), DeviceStateExport.class);
+ response.setHeader("requestType", "excel");
+ response.setHeader("Access-Control-Expose-Headers", "requestType");
+ // 璁剧疆鍗曞厓鏍兼牱寮�
+ // 淇濆瓨鍒扮涓�涓猻heet涓�
+ EasyExcel.write(response.getOutputStream())
+ .head(DeviceStateExport.class)
+ .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+ .sheet("sheet")
+ .doWrite(studentList);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "璁惧鍚姩/鍋滄瀵煎嚭")
+ @GetMapping("/exportDeviceStatus")
+ public void exportDeviceStatus(@RequestParam("processNumber") String processNumber,@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+ deviceStateService.exportDeviceStatus(deviceId, processNumber, response);
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
index d1036ac..b506a92 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -62,7 +62,7 @@
* @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
*/
@ApiOperation("鍒犻櫎閲忓�兼函婧愯鍒�")
- @GetMapping("/deleteTraceabilityManagement")
+ @DeleteMapping("/deleteTraceabilityManagement")
public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
new file mode 100644
index 0000000..41fa6e3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-18 鏄熸湡涓� 10:00:48
+ * Description:
+ */
+@Data
+public class DeviceAccidentReportDto extends DeviceAccidentReport {
+ @ApiModelProperty("鏃堕棿")
+ private String accidentDateStr;
+
+ @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+ private String reportDateStr;
+
+ @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+ private String assessorDateStr;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+ private String departmentHeadDateStr;
+
+ @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+ private String technicalDirectorDateStr;
+
+ @ApiModelProperty("涓讳换濉啓鏃堕棿")
+ private String directorHeadDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
new file mode 100644
index 0000000..3d5ba22
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
@@ -0,0 +1,90 @@
+package com.ruoyi.device.dto;
+
+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-17 04:50:57
+ */
+@Getter
+@Setter
+@TableName("device_breakdown_maintenance")
+@ApiModel(value = "DeviceBreakdownMaintenance瀵硅薄", description = "璁惧鏁呴殰缁翠慨琛�")
+public class DeviceBreakdownMaintenance {
+
+ @TableId(value = "maintenance_id", type = IdType.AUTO)
+ private Integer maintenanceId;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("瀹夎鍦板潃")
+ private String location;
+
+ @ApiModelProperty("鎹熷潖鎴栨晠闅滄儏鍐�")
+ private String damageOrMalfunction;
+
+ @ApiModelProperty("鐢宠浜篿d")
+ private Integer applicantUserId;
+
+ @ApiModelProperty("鐢宠浜�")
+ private String applicantUser;
+
+ @ApiModelProperty("瑕佹眰淇鏃堕棿")
+ private LocalDate repairDate;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+ private String departmentHeadOpinion;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+ private Integer departmentHeadUserId;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+ private String departmentHeadUser;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+ private LocalDate departmentHeadDate;
+
+ @ApiModelProperty("缁翠慨璁颁簨")
+ private String maintenanceRecord;
+
+ @ApiModelProperty("缁翠慨浜�")
+ private String maintenanceUser;
+
+ @ApiModelProperty("缁翠慨鏃堕棿")
+ private LocalDate maintenanceDate;
+
+ @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+ private Integer isFinish;
+
+ @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;
+
+ @TableField(exist = false,select = false)
+ @ApiModelProperty("娴佺▼, 0:鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:缁翠慨璁颁簨")
+ private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
new file mode 100644
index 0000000..f71386a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 17:23:22
+ * Description:
+ */
+@Data
+public class DeviceInspectionRecordDto extends DeviceInspectionRecord {
+
+ @TableField(exist = false)
+ @ApiModelProperty("娴嬭瘯璇︽儏鍐呭")
+ private List<DeviceInspectionRecordDetails> details;
+
+ @ApiModelProperty("娴嬭瘯鏃堕棿")
+ private String testDateString;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
new file mode 100644
index 0000000..11244b4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceInstructionDto extends DeviceInstruction {
+
+ private List<OperationInstruction> feTempHumRecordList;
+}
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/dto/DeviceOperationInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
new file mode 100644
index 0000000..89ebd4c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceOperationInstructionDto extends OperationInstruction {
+ @ApiModelProperty("鐢宠缂栧彿")
+ private String applicationNumber;
+
+ @ApiModelProperty("鐢宠閮ㄩ棬")
+ private String applicationDepartment;
+
+ @ApiModelProperty("璐d换浜�")
+ private String personLiable;
+
+ @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+ private String controlledApplicationDescription;
+
+ @ApiModelProperty("绠$悊缂栧彿")
+ private String deviceNumber;
+
+ @ApiModelProperty("鍨嬪彿")
+ private String deviceModel;
+
+ @ApiModelProperty("璁惧鍚嶇О")
+ private String deviceName;
+
+ @ApiModelProperty("涓婁紶浜�")
+ private String uploaderName;
+
+ @ApiModelProperty("瀹℃壒浜�")
+ private String approverName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
new file mode 100644
index 0000000..4cac0ce
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceScrapped;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 18:34:17
+ * Description:
+ */
+@Data
+public class DeviceScrappedDto extends DeviceScrapped {
+
+ @ApiModelProperty("鐢宠鏃堕棿")
+ private String applicantDateStr;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+ private String departmentHeadDateStr;
+
+ @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+ private String meteringRoomDateStr;
+
+ @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+ private String approverDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java
new file mode 100644
index 0000000..6e45eee
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceState;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceStateDto extends DeviceState {
+ @ApiModelProperty(value = "璁惧鍚嶇О")
+ private String deviceName;
+
+ @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+ private String specificationModel;
+
+ @ApiModelProperty(value = "绠$悊缂栧彿")
+ private String managementNumber;
+
+ @ApiModelProperty(value = "鎿嶄綔鏃ユ湡 yyyy-MM-dd")
+ private String submitDateString;
+
+ @ApiModelProperty("璐熻矗浜哄鎵规棩鏈� yyyy-MM-dd")
+ private String departmentDateString;
+
+ @ApiModelProperty("璁¢噺瀹ゅ鎵规棩鏈� yyyy-MM-dd")
+ private String measuringRoomDateString;
+
+ @ApiModelProperty("鎵瑰噯鏃ユ湡 yyyy-MM-dd")
+ private String approvalDateString;
+
+ @ApiModelProperty(value = "璁惧绫诲瀷")
+ private String largeCategory;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java
new file mode 100644
index 0000000..f4e5592
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DeviceStateExport {
+ @ExcelProperty(value = "璁惧鍚嶇О")
+ private String deviceName;
+
+ @ExcelProperty(value = "瑙勬牸鍨嬪彿")
+ private String specificationModel;
+
+ @ExcelProperty(value = "绠$悊缂栧彿")
+ private String managementNumber;
+
+ @ExcelProperty("璁惧鐘舵��")
+ private String deviceStatus;
+
+ @ExcelProperty("鍋滅敤鍚敤鐞嗙敱")
+ private String reason;
+
+ @ExcelProperty("鎻愪氦浜�")
+ private String createUser;
+
+ @ExcelProperty("鎻愪氦鏃ユ湡")
+ private LocalDateTime createTime;
+
+ @ExcelProperty("褰撳墠鐘舵��")
+ private String currentState;
+
+ @ExcelProperty("褰撳墠璐熻矗浜�")
+ private String currentResponsible;
+}
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/DeviceAccidentReportMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
new file mode 100644
index 0000000..25de891
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
@@ -0,0 +1,35 @@
+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.DeviceAccidentReportDto;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportMapper extends BaseMapper<DeviceAccidentReport> {
+
+ /**
+ * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+ * @param page
+ * @param ew
+ * @return
+ */
+ IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, @Param("ew") QueryWrapper<DeviceAccidentReport> ew);
+
+ /**
+ * 鏌ヨ璁惧浜嬫晠鎶ュ憡璇︽儏
+ * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+ * @return
+ */
+ DeviceAccidentReportDto selectDeviceAccidentReportById(Integer accidentReportId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java
new file mode 100644
index 0000000..498e972
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java
@@ -0,0 +1,25 @@
+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.DeviceBorrow;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+public interface DeviceBorrowMapper extends BaseMapper<DeviceBorrow> {
+
+ IPage<DeviceBorrow> deviceBorrowPage(Page page, @Param("ew")QueryWrapper<DeviceBorrow> ew);
+
+ List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
new file mode 100644
index 0000000..78e9da2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.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.dto.DeviceBreakdownMaintenance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceMapper extends BaseMapper<DeviceBreakdownMaintenance> {
+
+ /**
+ * 璁惧鏁呴殰缁翠慨鍒楄〃
+ * @param page
+ * @param ew
+ * @return
+ */
+ IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, @Param("ew") QueryWrapper<DeviceBreakdownMaintenance> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
new file mode 100644
index 0000000..66d10cd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
new file mode 100644
index 0000000..5cb34ee
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
@@ -0,0 +1,28 @@
+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.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
+
+ /**
+ * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+ * @param page
+ * @param queryWrappers
+ * @return
+ */
+ IPage<DeviceInspectionRecord> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java
new file mode 100644
index 0000000..193b5b6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceLogMapper extends BaseMapper<DeviceLog> {
+}
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/mapper/DeviceScrappedMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java
new file mode 100644
index 0000000..bf6266f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java
@@ -0,0 +1,35 @@
+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.DeviceScrappedDto;
+import com.ruoyi.device.pojo.DeviceScrapped;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+public interface DeviceScrappedMapper extends BaseMapper<DeviceScrapped> {
+
+ /**
+ * 璁惧鎶ュ簾鐢宠鍒楄〃
+ * @param page
+ * @param ew
+ * @return
+ */
+ IPage<DeviceScrapped> pageDeviceScrapped(Page page, @Param("ew") QueryWrapper<DeviceScrapped> ew);
+
+ /**
+ * 鏍规嵁id鏌ヨ璁惧鎶ュ簾鐢宠
+ * @param scrappedId
+ * @return
+ */
+ DeviceScrappedDto selectDeviceScrappedById(@Param("scrappedId") Integer scrappedId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
new file mode 100644
index 0000000..db96d63
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+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.DeviceStateDto;
+import com.ruoyi.device.pojo.DeviceState;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateMapper extends BaseMapper<DeviceState> {
+
+ IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
new file mode 100644
index 0000000..12fd129
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
@@ -0,0 +1,23 @@
+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.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
+
+
+ IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..f034e12
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+ List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
new file mode 100644
index 0000000..d429673
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.mqtt;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQBean {
+
+ @Bean("mqClient") // 鍚姩WEB鏈嶅姟鍣ㄧ殑鏃跺�欒皟鐢ㄦ鏂规硶鍒濆鍖�
+ public MQClient myMQTTClient(){
+ MQClient mqClient = new MQClient();
+ return mqClient;
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
new file mode 100644
index 0000000..51fb42a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -0,0 +1,93 @@
+package com.ruoyi.device.mqtt;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class MQCallback<component> implements MqttCallback {
+
+ private MQClient mqClient; // MQTT杩炴帴鏁版嵁
+
+ private MQConfig mqConfig; // yml閰嶇疆鏁版嵁
+
+ private static MQCallback mqCallback;
+
+ @Resource
+ private CollectBridgeService collectBridgeService;
+
+ @PostConstruct
+ public void init() {
+ mqCallback = this;
+ // 鍒濅娇鍖栨椂灏嗗凡闈欐�佸寲鐨刢onfigParam瀹炰緥鍖�
+ mqCallback.collectBridgeService = this.collectBridgeService;
+ }
+
+ public MQCallback(MQClient mqClient, MQConfig mqConfig) {
+ this.mqClient = mqClient;
+ this.mqConfig = mqConfig;
+ }
+
+ /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+ @SneakyThrows
+ @Override
+ public void connectionLost(Throwable cause) {
+ /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+ if (mqClient != null) {
+ while (true) {
+ try {
+ log.info("==============銆嬨�嬨�媅MQTT] 杩炴帴涓㈠け锛屽皾璇曢噸杩�...");
+ MQClient mqttPushClient = new MQClient();
+ mqttPushClient.connect(mqConfig);
+ if (mqClient.getClient().isConnected()) {
+ log.info("=============>>閲嶈繛鎴愬姛");
+ }
+ break;
+ } catch (Exception e) {
+ log.error("=============>>>[MQTT] 杩炴帴鏂紑锛岄噸杩炲け璐ワ紒<<=============");
+ continue;
+ }
+ }
+ }
+ log.info(cause.getMessage());
+ }
+
+ /**
+ * MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈紝瀹樻柟璇濈О涓猴細璁㈤槄鍚庣殑娑堟伅
+ * @param topic 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+ * @param message 淇℃伅
+ * @throws Exception 鎶ラ敊
+ */
+ @Override
+ public void messageArrived(String topic, MqttMessage message) throws Exception {
+ try {
+ String parse = new String(message.getPayload());
+ JSONObject jsonObject = JSONObject.parseObject(parse);
+ // 濉厖閲囬泦鏁版嵁
+ mqCallback.collectBridgeService.addBridgeValue(jsonObject);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.info("============銆嬨�嬫帴鏀舵秷鎭富棰樺紓甯� : " + e.getMessage());
+ }
+ }
+
+ /**
+ * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈�
+ * 瀹樻柟璇濈О涓猴細鍙戝竷鍚庝細鎵ц鍒拌繖閲�
+ * @param token 杩炴帴token
+ */
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken token) {
+// log.info("==========鍙戝竷淇℃伅={}==========", token.isComplete());
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
new file mode 100644
index 0000000..1c3c548
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
@@ -0,0 +1,97 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQClient {
+
+ private static MqttClient client;
+ public static MqttClient getClient() {
+ return client;
+ }
+ public static void setClient(MqttClient client) {
+ MQClient.client = client;
+ }
+
+ /**
+ * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄧ殑閰嶇疆
+ * @param userName 璐﹀彿
+ * @param password 瀵嗙爜
+ * @param outTime 瓒呮椂鏃堕棿
+ * @param KeepAlive 蹇冭烦妫�娴嬫椂闂�
+ * @return
+ */
+ private MqttConnectOptions getOption(String userName, String password, int outTime, int KeepAlive) {
+ MqttConnectOptions option = new MqttConnectOptions();
+ // 璁剧疆鏄惁娓呯┖session,false琛ㄧず鏈嶅姟鍣ㄤ細淇濈暀瀹㈡埛绔殑杩炴帴璁板綍锛宼rue琛ㄧず姣忔杩炴帴鍒版湇鍔″櫒閮戒互鏂扮殑韬唤杩炴帴
+ option.setCleanSession(true);
+ // 璁剧疆杩炴帴鐨勭敤鎴峰悕
+ option.setUserName(userName);
+ // 璁剧疆杩炴帴鐨勫瘑鐮�
+ option.setPassword(password.toCharArray());
+ // 璁剧疆瓒呮椂鏃堕棿 鍗曚綅涓虹
+ option.setConnectionTimeout(outTime);
+ // 璁剧疆浼氳瘽蹇冭烦鏃堕棿 鍗曚綅涓虹 鏈嶅姟鍣ㄤ細姣忛殧(1.5*keepTime)绉掔殑鏃堕棿鍚戝鎴风鍙戦�佷釜娑堟伅鍒ゆ柇瀹㈡埛绔槸鍚﹀湪绾匡紝浣嗚繖涓柟娉曞苟娌℃湁閲嶈繛鐨勬満鍒�
+ option.setKeepAliveInterval(KeepAlive);
+ // setWill鏂规硶锛屽鏋滈」鐩腑闇�瑕佺煡閬撳鎴风鏄惁鎺夌嚎鍙互璋冪敤璇ユ柟娉曘�傝缃渶缁堢鍙g殑閫氱煡娑堟伅
+ // option.setWill(topic, "close".getBytes(), 2, true);
+ //璁剧疆鏈�澶ч�熷害
+ option.setMaxInflight(1000);
+ log.info("================>>>MQTT杩炴帴璁よ瘉鎴愬姛<<======================");
+ return option;
+ }
+
+ /**
+ * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄥ嚱鏁�
+ * @param mqttConfig yml涓璏QTT鐨勯厤缃�
+ */
+ public void connect(MQConfig mqttConfig) throws MqttException {
+ client = new MqttClient(mqttConfig.getUrl(), mqttConfig.getClientId(), new MemoryPersistence());
+ MqttConnectOptions options = getOption(mqttConfig.getUsername(), mqttConfig.getPassword(),
+ mqttConfig.getTimeout(), mqttConfig.getKeepAlive());
+ MQClient.setClient(client);
+ //杩炴帴澶辫触璋冪敤鍥炶皟鍑芥暟锛岄噸鏂拌繛鎺�
+ client.setCallback(new MQCallback<Object>(this, mqttConfig));
+ if (!client.isConnected()) {
+ client.connect(options);
+ // 璁㈤槄涓婚
+ MQSubscribe.subscribe_0(mqttConfig.getSubscribe());
+ log.info("================>>>MQTT杩炴帴鎴愬姛<<======================");
+ } else {// 杩欓噷鐨勯�昏緫鏄鏋滆繛鎺ヤ笉鎴愬姛灏遍噸鏂拌繛鎺�
+ client.disconnect();
+ client.connect(options);
+ }
+ }
+
+ /**
+ * WEB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂嚎閲嶈繛
+ * @throws Exception
+ */
+ public Boolean reConnect() throws Exception {
+ Boolean isConnected = false;
+ if (null != client) {
+ client.connect();
+ if (client.isConnected()) {
+ isConnected = true;
+ }
+ }
+ return isConnected;
+ }
+
+ /**
+ * 寮傚父鍏抽棴鏈嶅姟锛學EB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂紑杩炴帴鍑芥暟
+ */
+ @SneakyThrows
+ public void close(){
+ client.close();
+ client.disconnect();
+ log.info("================>>寮傚父鍏抽棴涓巑qtt鏈嶅姟鍣ㄧ殑杩炴帴<<======================");
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
new file mode 100644
index 0000000..a88b29c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
@@ -0,0 +1,64 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+public class MQConfig {
+
+ /**
+ * MQTT-鏈嶅姟绔�-IP
+ */
+ @Value("${mqtt.url}")
+ private String url;
+
+ /**
+ * MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�
+ */
+ @Value("${mqtt.username}")
+ private String username;
+
+ /**
+ * MQTT-鏈嶅姟绔�-瀵嗙爜
+ */
+ @Value("${mqtt.password}")
+ private String password;
+
+ /**
+ * 瓒呮椂鏃堕棿
+ */
+ @Value("${mqtt.timeout}")
+ private int timeout;
+
+ /**
+ * 蹇冭烦妫�娴嬫椂闂�
+ */
+ @Value("${mqtt.keepalive}")
+ private int keepAlive;
+
+ /**
+ * 蹇冭烦鍖呯骇鍒�
+ */
+ @Value("${mqtt.qos}")
+ private int qos;
+
+ /**
+ * 鏈嶅姟绔繛鎺ヨ秴鏃舵椂闂�
+ */
+ @Value("${mqtt.completion-timeout}")
+ private int completionTimeout;
+
+ /**
+ * clientId
+ */
+ @Value("${mqtt.clientId}")
+ private String clientId;
+
+ /**
+ * 璁㈤槄涓婚
+ */
+ @Value("${mqtt.subscribe}")
+ private String subscribe;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
new file mode 100644
index 0000000..78c26d7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQPublic {
+
+ /**
+ * 閫氫俊璐ㄩ噺qos涓�0锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彧鍙戦�佷竴娆★紝涓嶇MQTT鏈嶅姟鍣ㄦ湁娌℃湁鏀跺埌
+ * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟
+ * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+ * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+ */
+ public void publish_0(int qos, String topic, byte[] pushMessage) {
+ publish(0, false, topic, pushMessage);
+ }
+
+ /**
+ * 閫氫俊璐ㄩ噺qos涓�1锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝MQTT鏈嶅姟鍣ㄤ竴瀹氫細鏀跺埌涓�娆℃暟鎹紝濡傛灉MQTT鏈嶅姟鍣ㄦ病鏈夊搷搴斺�滄敹鍒版暟鎹�濓紝閭d箞WEB鏈嶅姟鍣ㄥ氨浼氫竴鐩村彂閫佹暟鎹�
+ * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝璋冪敤姝ゅ嚱鏁帮紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺qos涓�1
+ * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+ * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+ */
+ public void publish_1(String topic, byte[] pushMessage) {
+ publish(1, false, topic, pushMessage);
+ }
+
+ /**
+ *閫氫俊璐ㄩ噺qos涓�2锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝涓よ�呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け锛屼絾鏄浉搴旂殑涔熶細娑堣�楄绠楁満涓殑璧勬簮
+ * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺锛�2
+ * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+ * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+ */
+ public void publish_2(String topic, byte[] pushMessage) {
+ publish(2,false, topic, pushMessage);
+ }
+
+ /**
+ * 鍙戝竷鍑芥暟锛歐EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+ *
+ * @param qos 閫氫俊璐ㄩ噺
+ * @param retained 榛樿锛歠alse-闈炴寔涔呭寲锛堟槸鎸囦竴鏉℃秷鎭秷璐瑰畬锛屽氨浼氳鍒犻櫎锛涙寔涔呭寲锛屾秷璐瑰畬锛岃繕浼氫繚瀛樺湪鏈嶅姟鍣ㄤ腑锛屽綋鏂扮殑璁㈤槄鑰呭嚭鐜帮紝缁х画缁欐柊璁㈤槄鑰呮秷璐癸級
+ * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+ * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+ */
+ public void publish(int qos, boolean retained, String topic, byte[] pushMessage) {
+ MqttMessage message = new MqttMessage();
+ message.setQos(qos);
+ message.setRetained(retained);
+ // 灏哠tring[]鏁扮粍杞崲涓篵yte鏁扮粍鍙戦��
+ message.setPayload(pushMessage);
+ MqttTopic mTopic = MQClient.getClient().getTopic(topic);
+ if (null == mTopic) {
+ log.error("===============>>>MQTT {} 涓嶅瓨鍦�<<=======================",topic);
+ }
+ MqttDeliveryToken token;
+ try {
+ token = mTopic.publish(message);
+ token.waitForCompletion();
+ } catch (MqttPersistenceException e) {
+ e.printStackTrace();
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
new file mode 100644
index 0000000..0541e3f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
@@ -0,0 +1,60 @@
+package com.ruoyi.device.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQSubscribe {
+
+ /**
+ * 璁㈤槄鏌愪釜涓婚锛歁QTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+ *涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+ * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+ * @param qos MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+ * qos涓�0锛氬彧鍚慦EB鏈嶅姟鍣ㄥ彂閫佷竴娆★紱
+ * qos涓�1锛氳嚦灏戝悜WEB鏈嶅姟鍣ㄥ彂閫佷竴娆★紝鎺ユ敹鏂逛細鍝嶅簲涓�涓姤鏂囷紱
+ * qos涓�2锛氫袱鑰呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け
+ */
+ private static void subscribe(String topic, int qos) {
+ try {
+ MQClient.getClient().subscribe(topic,qos);
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�0
+ * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+ * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+ */
+ public static void subscribe_0(String topic) {
+ subscribe(topic, 0);
+ }
+
+ /**
+ * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�1
+ * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+ * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+ */
+ public void subscribe_1(String topic) {
+ subscribe(topic, 1);
+ }
+
+ /**
+ * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�2
+ * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+ * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+ */
+ public void subscribe_2(String topic) {
+ subscribe(topic, 2);
+ }
+
+ public void OffSubscribe(String topic) {
+ try {
+ MQClient.getClient().unsubscribe(topic);
+ } catch (MqttException e) {
+ e.printStackTrace();
+ }
+ }
+}
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/DeviceAccidentReport.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
new file mode 100644
index 0000000..44558f3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
@@ -0,0 +1,120 @@
+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-17 06:31:12
+ */
+@Getter
+@Setter
+@TableName("device_accident_report")
+@ApiModel(value = "DeviceAccidentReport瀵硅薄", description = "璁惧浜嬫晠鎶ュ憡鍗�")
+public class DeviceAccidentReport {
+
+ @TableId(value = "accident_report_id", type = IdType.AUTO)
+ private Integer accidentReportId;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("鍦板潃")
+ private String address;
+
+ @ApiModelProperty("鏃堕棿")
+ private LocalDateTime accidentDate;
+
+ @ApiModelProperty("浜嬫晠鎯呭喌鎻忚堪")
+ private String descriptionOfAccident;
+
+ @ApiModelProperty("鎶ュ憡浜篿d")
+ private Integer reportUserId;
+
+ @ApiModelProperty("鎶ュ憡浜�")
+ private String reportUser;
+
+ @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+ private LocalDate reportDate;
+
+ @ApiModelProperty("璇勪及浜烘剰瑙�")
+ private String assessorOpinion;
+
+ @ApiModelProperty("璇勪及浜篿d")
+ private Integer assessorUserId;
+
+ @ApiModelProperty("璇勪及浜�")
+ private String assessorUser;
+
+ @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+ private LocalDate assessorDate;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+ private String departmentHeadOpinion;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+ private Integer departmentHeadUserId;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+ private String departmentHeadUser;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+ private LocalDate departmentHeadDate;
+
+ @ApiModelProperty("鎶�鏈礋璐d汉鎰忚")
+ private String technicalDirectorOpinion;
+
+ @ApiModelProperty("鎶�鏈礋璐d汉id")
+ private Integer technicalDirectorUserId;
+
+ @ApiModelProperty("鎶�鏈礋璐d汉")
+ private String technicalDirectorUser;
+
+ @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+ private LocalDate technicalDirectorDate;
+
+ @ApiModelProperty("涓讳换鎰忚")
+ private String directorHeadOpinion;
+
+ @ApiModelProperty("涓讳换id")
+ private Integer directorHeadUserId;
+
+ @ApiModelProperty("涓讳换")
+ private String directorHeadUser;
+
+ @ApiModelProperty("涓讳换濉啓鏃堕棿")
+ private LocalDate directorHeadDate;
+
+ @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+ private Integer isFinish;
+
+ @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;
+
+ @TableField(exist = false,select = false)
+ @ApiModelProperty("娴佺▼, 0:鎶ュ憡, 1璇勪及, 2:閮ㄩ棬璐熻矗浜烘剰瑙�, 3:鎶�鏈礋璐d汉鎰忚, 4:涓讳换鎰忚")
+ private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
new file mode 100644
index 0000000..da122b6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
@@ -0,0 +1,133 @@
+package com.ruoyi.device.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Getter
+@Setter
+@TableName("device_borrow")
+@ApiModel(value = "DeviceBorrow瀵硅薄", description = "璁惧鍊熺敤")
+@ExcelIgnoreUnannotated
+public class DeviceBorrow implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("娴佺▼缂栧彿")
+ @ExcelProperty(value = "娴佺▼缂栧彿")
+ private String processNumber;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("绠$悊缂栧彿")
+ @ExcelProperty(value = "绠$悊缂栧彿")
+ private String unifyNumber;
+
+ @ApiModelProperty("鍊熺敤浜�")
+ @ExcelProperty(value = "鍊熺敤浜�")
+ private String recipientUser;
+
+ @ExcelProperty(value = "鍊熺敤浜鸿仈绯绘柟寮�")
+ @ApiModelProperty("鍊熺敤浜鸿仈绯绘柟寮�")
+ private String borrowerContactInformation;
+
+ @ApiModelProperty("鍊熺敤鏃剁姸鎬�")
+ @ExcelProperty(value = "鍊熺敤鏃剁姸鎬�")
+ //0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾
+ private Integer recipientState;
+
+ @ApiModelProperty("鍊熺敤鏃ユ湡")
+ @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+ private Date recipientTime;
+
+ @ApiModelProperty("鍊熷嚭浜�")
+ @ExcelProperty(value = "鍊熷嚭浜�")
+ private String submitUser;
+
+ @ApiModelProperty("鍊熷嚭鏃ユ湡")
+ @ExcelProperty(value = "鍊熷嚭鏃ユ湡")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("褰撳墠鐘舵��")
+ @ExcelProperty(value = "褰撳墠鐘舵��")
+ private String nowState;
+
+ @ApiModelProperty("褰撳墠璐d换浜�")
+ @ExcelProperty(value = "褰撳墠璐d换浜�")
+ private String nowUser;
+
+ @ApiModelProperty("闄勪欢")
+ //璺緞
+ private String url;
+
+ @ApiModelProperty("闄勪欢")
+ @ExcelProperty(value = "闄勪欢")
+ //鏂囦欢鍚�
+ private String fileName;
+
+ @ApiModelProperty("涓嬬幆鑺傝矗浠讳汉")
+ private String nextUser;
+
+ @ApiModelProperty("鎻愪氦鎿嶄綔浜�")
+ private String submitOperationUser;
+
+ @ApiModelProperty("鎻愪氦鎿嶄綔鏃堕棿")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime submitOperationTime;
+
+ @ApiModelProperty("褰掕繕浜�")
+ private String rebackUser;
+
+ @ApiModelProperty("褰掕繕鏃ユ湡")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime rebackTime;
+
+ @ApiModelProperty("鎺ュ彈鐘舵��0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾")
+ private Integer receiveState;
+
+ @ApiModelProperty("璁惧璐d换浜�")
+ private String deviceUser;
+
+ @ApiModelProperty("澶囨敞")
+ private String note;
+
+ @ApiModelProperty("鎺ユ敹鎿嶄綔浜�")
+ private String receiveOperationUser;
+
+ @ApiModelProperty("鎺ユ敹鎿嶄綔鏃堕棿")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime receiveOperationTime;
+
+ @ApiModelProperty("璁惧鍚嶇О")
+ @TableField(select = false, exist = false)
+ @ExcelProperty(value = "璁惧鍚嶇О")
+ private String deviceName;
+
+
+ @ApiModelProperty("娴佺▼璺熻釜")
+ @TableField(select = false, exist = false)
+ private List<DeviceLog> deviceLogs;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
new file mode 100644
index 0000000..e605cb3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
@@ -0,0 +1,93 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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-16 04:25:14
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record")
+@ApiModel(value = "DeviceInspectionRecord瀵硅薄", description = "")
+public class DeviceInspectionRecord implements Serializable {
+
+ @ApiModelProperty("璁惧鐐规璁板綍id")
+ @TableId(value = "inspection_record_id", type = IdType.AUTO)
+ private Integer inspectionRecordId;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("娴嬮噺鑼冨洿")
+ private String measurementScope;
+
+ @ApiModelProperty("鐐规浣跨敤鐗╄川鍚嶇О")
+ private String materialName;
+
+ @ApiModelProperty("鐐规浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+ private String materialModel;
+
+ @ApiModelProperty("鐐规浣跨敤鐗╄川绠$悊缂栧彿")
+ private String materialManagementNumber;
+
+ @ApiModelProperty("鐐规浣跨敤鐗╄川绮惧害绛夌骇")
+ private String materialAccuracyGrade;
+
+ @ApiModelProperty("娓╁害")
+ private String temperature;
+
+ @ApiModelProperty("婀垮害")
+ private String humidity;
+
+ @ApiModelProperty("娴嬭瘯缁撹")
+ private String testConclusion;
+
+ @ApiModelProperty("澶囨敞")
+ private String remark;
+
+ @ApiModelProperty("鐘舵�侊紙鏄惁澶嶆牳锛�0鏈鏍革紝1澶嶆牳")
+ private Integer status;
+
+ @ApiModelProperty("娴嬭瘯浜�")
+ private String recorder;
+
+ @ApiModelProperty("娴嬭瘯浜篿d")
+ private Integer recorderId;
+
+ @ApiModelProperty("澶嶆牳浜�")
+ private String reviewer;
+
+ @ApiModelProperty("澶嶆牳浜篿d")
+ private Integer reviewerId;
+
+ @ApiModelProperty("澶嶆牳淇℃伅")
+ private String reviewerRemark;
+
+ @ApiModelProperty("娴嬭瘯鏃ユ湡")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private LocalDateTime testDate;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("淇敼浜篿d")
+ private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
new file mode 100644
index 0000000..feaed31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
@@ -0,0 +1,63 @@
+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-16 04:27:32
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record_details")
+@ApiModel(value = "DeviceInspectionRecordDetails瀵硅薄", description = "")
+public class DeviceInspectionRecordDetails implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("鐐规璇︽儏id")
+ @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
+ private Integer inspectionRecordDetailId;
+
+ @ApiModelProperty("鐐规id")
+ private Integer inspectionRecordId;
+
+ @ApiModelProperty("娴嬭瘯椤圭洰")
+ private String testItems;
+
+ @ApiModelProperty("鏍囧噯鍊�")
+ private String standardValue;
+
+ @ApiModelProperty("瀹炴祴鍊�")
+ private String measuredValue;
+
+ @ApiModelProperty("绀哄�艰宸�")
+ private String indicationError;
+
+ @ApiModelProperty("鍏佽璇樊")
+ private String allowableError;
+
+ @ApiModelProperty("鍗曢」缁撹")
+ private String singleItemConclusion;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("淇敼浜篿d")
+ private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
new file mode 100644
index 0000000..5a4f845
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
@@ -0,0 +1,64 @@
+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-04 10:29:18
+ */
+@Getter
+@Setter
+@TableName("device_instruction")
+@ApiModel(value = "Instruction瀵硅薄", description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class DeviceInstruction implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鐢宠缂栧彿")
+ private String applicationNumber;
+
+ @ApiModelProperty("鐢宠閮ㄩ棬")
+ private String applicationDepartment;
+
+ @ApiModelProperty("璐d换浜�")
+ private String personLiable;
+
+ @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+ private String controlledApplicationDescription;
+
+ @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+ private String fileSystemName;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("鏇存柊鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鍒涘缓浜�")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鏇存柊浜�")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java
new file mode 100644
index 0000000..5141c82
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("device_log") // 璁板綍
+public class DeviceLog implements Serializable {
+
+ @TableId(type= IdType.AUTO)
+ private Integer id;
+ private String operator;
+// @JsonFormat()
+ private LocalDateTime operationTime;
+ private String operationType;
+ private String operationContent;
+ private Integer deviceId;
+
+ //鍏宠仈鐨勮〃鍚�
+ private String relevanceForm;
+
+ //鍏宠仈鐨刬d
+ private Integer relevanceId;
+}
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/pojo/DeviceScrapped.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
new file mode 100644
index 0000000..f60aefb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
@@ -0,0 +1,105 @@
+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-17 01:53:47
+ */
+@Getter
+@Setter
+@TableName("device_scrapped")
+@ApiModel(value = "DeviceScrapped瀵硅薄", description = "璁惧鎶ュ簾鐢宠琛�")
+public class DeviceScrapped {
+
+ @TableId(value = "scrapped_id", type = IdType.AUTO)
+ private Integer scrappedId;
+
+ @ApiModelProperty("璁惧id")
+ private Integer deviceId;
+
+ @ApiModelProperty("閰嶄欢")
+ private String parts;
+
+ @ApiModelProperty("鎶ュ簾鐞嗙敱")
+ private String reasonsForScrap;
+
+ @ApiModelProperty("鐢宠浜篿d")
+ private Integer applicantUserId;
+
+ @ApiModelProperty("鐢宠浜�")
+ private String applicantUser;
+
+ @ApiModelProperty("鐢宠鏃堕棿")
+ private LocalDate applicantDate;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+ private String departmentHeadOpinion;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+ private Integer departmentHeadUserId;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+ private String departmentHeadUser;
+
+ @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+ private LocalDate departmentHeadDate;
+
+ @ApiModelProperty("璁¢噺瀹ゆ剰瑙�")
+ private String meteringRoomOpinion;
+
+ @ApiModelProperty("璁¢噺瀹や汉id")
+ private Integer meteringRoomUserId;
+
+ @ApiModelProperty("璁¢噺瀹や汉")
+ private String meteringRoomUser;
+
+ @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+ private LocalDate meteringRoomDate;
+
+ @ApiModelProperty("鎵瑰噯浜烘剰瑙�")
+ private String approverOpinion;
+
+ @ApiModelProperty("鎵瑰噯浜篿d")
+ private Integer approverUserId;
+
+ @ApiModelProperty("鎵瑰噯浜�")
+ private String approverUser;
+
+ @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+ private LocalDate approverDate;
+
+ @ApiModelProperty("鏄惁缁撴潫,0: 鏈粨鏉�, 1:缁撴潫")
+ private Integer isFinish;
+
+ @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;
+
+ @TableField(exist = false,select = false)
+ @ApiModelProperty("娴佺▼, 0:鎶ュ簾鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:璁¢噺瀹ゆ剰瑙�, 3:鎵瑰噯浜�")
+ private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
new file mode 100644
index 0000000..e212f3e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
@@ -0,0 +1,107 @@
+package com.ruoyi.device.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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-09-26 09:51:40
+ */
+@Getter
+@Setter
+@TableName("device_state")
+@ApiModel(value = "DeviceState瀵硅薄", description = "璁惧鍋滅敤/鍚敤")
+public class DeviceState implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("璁惧鍋滅敤鍚敤id")
+ @TableId(value = "state_id", type = IdType.AUTO)
+ private Integer stateId;
+
+ @ApiModelProperty("娴佺▼缂栧彿")
+ private String processNumber;
+
+ @ApiModelProperty("0閰嶄欢")
+ private String accessoryPart;
+
+ @ApiModelProperty("0璁惧鐘舵��")
+ private String deviceStatus;
+
+ @ApiModelProperty("0鍋滅敤鍚敤鐞嗙敱")
+ private String reason;
+
+ @ApiModelProperty("0涓嬬幆鑺傝矗浠讳汉")
+ private String submitNextPesponsible;
+
+ @ApiModelProperty("0鎿嶄綔浜�")
+ private String submitOperatingPersonnel;
+
+ @ApiModelProperty("0鏃ユ湡")
+ private LocalDateTime submitDate;
+
+ @ApiModelProperty("1閮ㄩ棬璐熻矗浜烘剰瑙�")
+ private String departmentReviewOpinion;
+
+ @ApiModelProperty("1涓嬬幆鑺傝矗浠讳汉")
+ private String departmentNextPesponsible;
+
+ @ApiModelProperty("1鎿嶄綔浜�")
+ private String departmentOperatingPersonnel;
+
+ @ApiModelProperty("1鏃ユ湡")
+ private LocalDateTime departmentDate;
+
+ @ApiModelProperty("2璁¢噺瀹ゆ剰瑙�")
+ private String measuringRoomReviewOpinion;
+
+ @ApiModelProperty("2涓嬬幆鑺傝矗浠讳汉")
+ private String measuringRoomNextPesponsible;
+
+ @ApiModelProperty("2鎿嶄綔浜�")
+ private String measuringRoomOperatingPersonnel;
+
+ @ApiModelProperty("2鏃ユ湡")
+ private LocalDateTime measuringRoomDate;
+
+ @ApiModelProperty("3鎵瑰噯鎰忚")
+ private String approvalOpinion;
+
+ @ApiModelProperty("3涓嬬幆鑺傝矗浠讳汉")
+ private String approvalNextPesponsible;
+
+ @ApiModelProperty("3鎿嶄綔浜�")
+ private String approvalOperatingPersonnel;
+
+ @ApiModelProperty("3鏃ユ湡")
+ private LocalDateTime approvalDate;
+
+ @ApiModelProperty("褰撳墠鐘舵��")
+ private String currentState;
+
+ @ApiModelProperty("璁惧Id")
+ private Integer deviceId;
+
+ @ApiModelProperty("褰撳墠鐜妭璐熻矗浜�")
+ private String currentResponsible;
+
+ @ApiModelProperty("鎻愪氦浜�")
+ @ExcelProperty(value = "鎻愪氦浜�")
+ private String createUser;
+
+ @ApiModelProperty("鎻愪氦鏃ユ湡")
+ @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
new file mode 100644
index 0000000..7666be1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
@@ -0,0 +1,88 @@
+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-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+public class OperationInstruction {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("璁惧涓婚敭id")
+ private String deviceId;
+
+ @ApiModelProperty("鏂囦欢绫诲瀷")
+ private String documentType;
+
+ @ApiModelProperty("鏂囨。缂栧彿")
+ private String documentNumber;
+
+ @ApiModelProperty("鏂囦欢鐗堟湰")
+ private String documentVersion;
+
+ @ApiModelProperty("浣滆��")
+ private String author;
+
+ @ApiModelProperty("鎻愪氦鏃ユ湡")
+ private LocalDate submitDate;
+
+ @ApiModelProperty("鏂囨。璇存槑")
+ private String documentNote;
+
+ @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+ private String fileSystemName;
+
+ @ApiModelProperty("浣滀笟鎸囧涔d")
+ private Integer instructionId;
+
+ @ApiModelProperty("涓婁紶浜篿d")
+ private Integer uploader;
+
+ @ApiModelProperty("瀹℃壒浜篿d")
+ private Integer approverId;
+
+ @ApiModelProperty("瀹℃壒鐘舵��")
+ private Boolean status;
+
+ @ApiModelProperty("鐢熸晥鏃堕棿")
+ private LocalDateTime entryIntoForceTime;
+
+ @ApiModelProperty("涓婁紶鏃堕棿")
+ private LocalDateTime uploadTime;
+
+ @ApiModelProperty("鏇存柊鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("鏇存柊浜篿d")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty("鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
new file mode 100644
index 0000000..3a6ce16
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeService extends IService<CollectBridge> {
+
+ /**
+ * 濉厖閲囬泦鏁版嵁
+ * @param jsonObject
+ */
+ void addBridgeValue(JSONObject jsonObject);
+}
+
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/DeviceAccidentReportService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
new file mode 100644
index 0000000..0b2ff31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
@@ -0,0 +1,41 @@
+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.DeviceAccidentReport;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
+
+ /**
+ * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+ * @param page
+ * @param deviceAccidentReport
+ * @return
+ */
+ IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
+
+ /**
+ * 鏂板璁惧浜嬫晠鎶ュ憡
+ * @param deviceAccidentReport
+ * @return
+ */
+ boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
+
+ /**
+ * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+ * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+ * @param response 鍝嶅簲
+ */
+ void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java
new file mode 100644
index 0000000..298b03e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java
@@ -0,0 +1,28 @@
+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.DeviceBorrow;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+public interface DeviceBorrowService extends IService<DeviceBorrow> {
+
+ IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow);
+
+ int saveDeviceBorrow(DeviceBorrow deviceBorrow);
+
+ DeviceBorrow getDeviceBorrow(Integer id);
+
+ List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
new file mode 100644
index 0000000..e244044
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
@@ -0,0 +1,41 @@
+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.DeviceBreakdownMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
+
+ /**
+ * 璁惧鏁呴殰缁翠慨鍒楄〃
+ * @param page
+ * @param deviceBreakdownMaintenance
+ * @return
+ */
+ IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+ /**
+ * 鏂板璁惧鏁呴殰缁翠慨
+ * @param deviceBreakdownMaintenance
+ * @return
+ */
+ boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+ /**
+ * 瀵煎嚭璁惧鏁呴殰缁翠慨
+ * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+ * @param response 鍝嶅簲
+ */
+ void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
new file mode 100644
index 0000000..4fd6270
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
new file mode 100644
index 0000000..7278b3c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordService extends IService<DeviceInspectionRecord> {
+
+ /**
+ * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+ * @param page
+ */
+ Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecord);
+
+
+ /**
+ * 鏌ヨ鐐规璇︽儏
+ * @param inspectionRecordId
+ * @return
+ */
+ Result getDeviceInspectionRecord(Integer inspectionRecordId);
+
+ /**
+ * 鏂板璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
+
+ /**
+ * 淇敼璁惧鐐规璁板綍
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+ /**
+ * 鍒犻櫎璁惧鐐规璁板綍
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+ /**
+ * 澶嶆牳鐐规璁板綍
+ * @param deviceExamineRecordDto
+ * @return
+ */
+ Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
+
+ /**
+ * 瀵煎嚭璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+ * @param response
+ */
+ Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
new file mode 100644
index 0000000..70e5f1c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
@@ -0,0 +1,23 @@
+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.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface DeviceInstructionService extends IService<DeviceInstruction> {
+
+ IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
+
+ void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
new file mode 100644
index 0000000..4883178
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
@@ -0,0 +1,24 @@
+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.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface DeviceMaintenanceService extends IService<DeviceMaintenance> {
+ IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber);
+
+ List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+
+ /**
+ * 瀵煎嚭Word璁惧缁存姢璁板綍
+ *
+ * @param deviceId
+ * @param response
+ */
+ void exportMaintenanceRecord(Integer deviceId, 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/DeviceOperationInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
new file mode 100644
index 0000000..afc8bdd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
+
+ List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
new file mode 100644
index 0000000..71cf704
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
@@ -0,0 +1,43 @@
+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.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceScrapped;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+public interface DeviceScrappedService extends IService<DeviceScrapped> {
+
+ /**
+ * 璁惧鎶ュ簾鐢宠鍒楄〃
+ * @param page
+ * @param deviceScrapped
+ * @return
+ */
+ IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped);
+
+ /**
+ * 鏂板璁惧鎶ュ簾鐢宠
+ * @param deviceScrapped
+ * @return
+ */
+ boolean addDeviceScrapped(DeviceScrapped deviceScrapped);
+
+ /**
+ * 淇敼璁惧鎶ュ簾鐢宠
+ * @param scrappedId 璁惧鎶ュ簾鐢宠id
+ * @return
+ */
+ Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java
new file mode 100644
index 0000000..9a2b789
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java
@@ -0,0 +1,31 @@
+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.DeviceStateDto;
+import com.ruoyi.device.pojo.DeviceState;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateService extends IService<DeviceState> {
+
+ IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+
+ /**
+ * 瀵煎嚭璁惧鐘舵��
+ *
+ * @param deviceId
+ * @param processNumber
+ * @param response
+ */
+ void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
new file mode 100644
index 0000000..a1acb6e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.device.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.CollectBridgeMapper;
+import com.ruoyi.device.pojo.CollectBridge;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+@Service
+@Slf4j
+public class CollectBridgeServiceImpl extends ServiceImpl<CollectBridgeMapper, CollectBridge> implements CollectBridgeService {
+
+ /**
+ * 濉厖閲囬泦鏁版嵁
+ * @param jsonObject
+ */
+ @Override
+ public void addBridgeValue(JSONObject jsonObject) {
+ JSONArray dataArray = jsonObject.getJSONArray("data");
+ for (int i = 0; i < dataArray.size(); i++) {
+ JSONObject listInfo = dataArray.getJSONObject(i);
+ // 瀛樺偍鏁版嵁
+ String dataStream = listInfo.getString("dataStream");
+ if (dataStream.equals("DQCS.DQCS.SN")) {
+ JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+ JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+ String entrustCode = pointsJSONObject.getString("value");
+ // 瑙f瀽鏃堕棿鎴�
+ Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time"));
+ LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+ // 鍏堝瓨鍌ㄧ紪鍙�, 鍚庣画瀛樺偍鍊�
+ CollectBridge collectBridge = new CollectBridge();
+ collectBridge.setEntrustCode(entrustCode);
+ collectBridge.setCollectDate(collectDate);
+ baseMapper.insert(collectBridge);
+
+ }
+ // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+ if (dataStream.equals("DQCS.DQCS.64")) {
+ JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+ JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+ String value = pointsJSONObject.getString("value");
+
+ if (value.equals("64")) {
+ for (int j = 0; j < dataArray.size(); j++) {
+ JSONObject listInfo2 = dataArray.getJSONObject(j);
+ String dataStream2 = listInfo2.getString("dataStream");
+ // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+ if (dataStream2.equals("DQCS.DQCS.DZZ")) {
+ JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints");
+ JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0);
+ String collectValue = pointsJSONObject2.getString("value");
+
+ // 瑙f瀽鏃堕棿鎴�
+ Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time"));
+ LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+ // 鏌ヨ鏈�鏂颁竴鏉℃暟鎹�
+ CollectBridge collectBridge = baseMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery()
+ .orderByDesc(CollectBridge::getCollectDate)
+ .last("limit 1"));
+
+ // 鍒ゆ柇涓ゆ潯鏁版嵁鏄惁鐩稿樊鍦�10鍒嗛挓涔嬪唴鍜屾湁娌℃湁缂栧彿
+ if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) &&
+ StringUtils.isNotBlank(collectBridge.getEntrustCode())) {
+ // 淇敼妫�楠屽��
+ collectBridge.setCollectValue(collectValue);
+ baseMapper.updateById(collectBridge);
+ } else {
+ // 鍙瓨鍌ㄥ��
+ CollectBridge bridge = new CollectBridge();
+ bridge.setCollectValue(collectValue);
+ bridge.setCollectDate(collectDate);
+ baseMapper.insert(bridge);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
+ Duration duration = Duration.between(dateTime1, dateTime2);
+ long minutesDifference = Math.abs(duration.toMinutes());
+ return minutesDifference <= 10;
+ }
+
+}
+
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/DeviceAccidentReportServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
new file mode 100644
index 0000000..60d610e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
@@ -0,0 +1,189 @@
+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.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceAccidentReportDto;
+import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Service
+public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
+
+ @Resource
+ private UserMapper userMapper;
+
+
+ @Resource
+ private DeviceMapper deivceMapper;
+
+ /**
+ * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+ * @param page
+ * @param deviceAccidentReport
+ * @return
+ */
+ @Override
+ public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
+ return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
+ }
+
+ /**
+ * 鏂板璁惧浜嬫晠鎶ュ憡
+ * @param deviceAccidentReport
+ * @return
+ */
+ @Override
+ public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
+ DeviceAccidentReport accidentReport = new DeviceAccidentReport();
+ User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+ switch (deviceAccidentReport.getFlowType()) {
+ case 0:
+ // 鎶ュ憡
+ BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
+ accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
+ accidentReport.setReportUserId(user.getId());
+ accidentReport.setReportUser(user.getName());
+ accidentReport.setReportDate(LocalDate.now());
+
+ // 璇勪及浜轰俊鎭�
+ User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
+ accidentReport.setAssessorUserId(assessorUser.getId());
+ accidentReport.setAssessorUser(assessorUser.getName());
+
+ baseMapper.insert(accidentReport);
+ break;
+ case 1:
+ accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+ // 璇勪及
+ accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
+ accidentReport.setAssessorDate(LocalDate.now());
+
+ // 閮ㄩ棬璐熻矗浜�
+ User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
+ accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
+ accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
+
+ baseMapper.updateById(accidentReport);
+
+ break;
+ case 2:
+ accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+ // 閮ㄩ棬璐熻矗浜烘剰瑙�
+ accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
+ accidentReport.setDepartmentHeadDate(LocalDate.now());
+
+ // 鎶�鏈礋璐d汉淇℃伅
+ User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
+ accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
+ accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
+
+ baseMapper.updateById(accidentReport);
+
+ break;
+ case 3:
+ accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+ // 鎶�鏈礋璐d汉鎰忚
+ accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
+ accidentReport.setTechnicalDirectorDate(LocalDate.now());
+
+ // 涓讳换淇℃伅
+ User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
+ accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
+ accidentReport.setDirectorHeadUser(directorHeadUser.getName());
+
+ baseMapper.updateById(accidentReport);
+
+ break;
+ case 4:
+ accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+ // 涓讳换鎰忚
+ accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
+ accidentReport.setDirectorHeadDate(LocalDate.now());
+
+ accidentReport.setIsFinish(1);
+ baseMapper.updateById(accidentReport);
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+ * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+ * @param response 鍝嶅簲
+ */
+ @Override
+ public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+ // 鏌ヨ浜嬫晠鎶ュ憡
+ DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
+
+ Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
+ device = device == null ? new Device() : device;
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
+ Configure configure = Configure.builder()
+ .build();
+ Device finalDevice = device;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceAccidentReport", deviceAccidentReport);
+ put("device", finalDevice);
+ // 鎶ュ憡浜虹鍚�
+ put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
+ // 璇勪及浜虹鍚�
+ put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
+ // 閮ㄩ棬璐熻矗浜虹鍚�
+ put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+ // 鎶�鏈礋璐d汉绛惧悕
+ put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
+ // 涓讳换绛惧悕
+ put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+ 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/DeviceBorrowServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
new file mode 100644
index 0000000..72023fc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.mapper.DeviceBorrowMapper;
+import com.ruoyi.device.mapper.DeviceLogMapper;
+import com.ruoyi.device.pojo.DeviceBorrow;
+import com.ruoyi.device.pojo.DeviceLog;
+import com.ruoyi.device.service.DeviceBorrowService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceBorrowServiceImpl extends ServiceImpl<DeviceBorrowMapper, DeviceBorrow> implements DeviceBorrowService {
+
+ @Resource
+ private DeviceBorrowMapper deviceBorrowMapper;
+
+ @Resource
+ private DeviceLogMapper deviceLogMapper;
+
+ @Resource
+ private UserMapper userMapper;
+
+ @Autowired
+ private NumberGenerator<DeviceBorrow> numberGenerator;
+
+ @Override
+ public IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) {
+ return deviceBorrowMapper.deviceBorrowPage(page, QueryWrappers.queryWrappers(deviceBorrow));
+ }
+
+ @Override
+ public int saveDeviceBorrow(DeviceBorrow deviceBorrow) {
+ Integer userId = SecurityUtils.getUserId().intValue();
+ User user = userMapper.selectById(userId);
+ //鏂板鐨勬椂鍊欐坊鍔犳柊寤烘祦绋�
+ if (ObjectUtils.isEmpty(deviceBorrow.getId())) {
+ deviceBorrow.setSubmitUser(user.getName());
+ String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+ String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+ String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceBorrow::getProcessNumber);
+ deviceBorrow.setProcessNumber(processNumber);
+ deviceBorrowMapper.insert(deviceBorrow);
+ DeviceLog deviceLog = new DeviceLog();
+ deviceLog.setOperator(user.getName());
+ deviceLog.setOperationTime(LocalDateTime.now());
+ deviceLog.setOperationType("鏂板缓");
+ deviceLog.setOperationContent("鏂板缓娴佺▼");
+ deviceLog.setRelevanceForm("device_borrow");
+ deviceLog.setRelevanceId(deviceBorrow.getId());
+ deviceLogMapper.insert(deviceLog);
+ } else {
+ DeviceBorrow borrow = deviceBorrowMapper.selectById(deviceBorrow.getId());
+ deviceBorrowMapper.updateById(deviceBorrow);
+ //閫氳繃鎴栬�呴┏鍥炲鍔犳祦绋嬭窡韪�
+ if (deviceBorrow.getNowState().equals("鍏抽棴")) {
+ DeviceLog deviceLog = new DeviceLog();
+ deviceLog.setOperator(user.getName());
+ deviceLog.setOperationTime(LocalDateTime.now());
+ deviceLog.setOperationType("鎺ユ敹閫氳繃");
+ deviceLog.setRelevanceForm("device_borrow");
+ deviceLog.setRelevanceId(deviceBorrow.getId());
+ deviceLogMapper.insert(deviceLog);
+ }
+ else if (deviceBorrow.getNowState().equals("鎻愪氦") && borrow.getNowState().equals("鎺ユ敹")) {
+ DeviceLog deviceLog = new DeviceLog();
+ deviceLog.setOperator(user.getName());
+ deviceLog.setOperationTime(LocalDateTime.now());
+ deviceLog.setOperationType("鎺ユ敹椹冲洖");
+ deviceLog.setRelevanceForm("device_borrow");
+ deviceLog.setRelevanceId(deviceBorrow.getId());
+ deviceLogMapper.insert(deviceLog);
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public DeviceBorrow getDeviceBorrow(Integer id) {
+ List<DeviceLog> deviceLogs = deviceLogMapper.selectList(Wrappers.<DeviceLog>lambdaQuery()
+ .eq(DeviceLog::getRelevanceForm, "device_borrow")
+ .eq(DeviceLog::getRelevanceId, id));
+ DeviceBorrow deviceBorrow = deviceBorrowMapper.selectById(id);
+ deviceBorrow.setDeviceLogs(deviceLogs);
+ return deviceBorrow;
+ }
+
+ @Override
+ public List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId) {
+ return deviceBorrowMapper.getDeviceBorrowBydeviceId(deviceId);
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
new file mode 100644
index 0000000..8fb4089
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -0,0 +1,152 @@
+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.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Service
+public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
+
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private DeviceMapper deivceMapper;
+
+ /**
+ * 璁惧鏁呴殰缁翠慨鍒楄〃
+ * @param page
+ * @param deviceBreakdownMaintenance
+ * @return
+ */
+ @Override
+ public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+ return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
+ }
+
+ /**
+ * 鏂板璁惧鏁呴殰缁翠慨
+ * @param deviceBreakdownMaintenance
+ * @return
+ */
+ @Override
+ public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+ DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
+ //褰撳墠鐧诲綍鐢ㄦ埛
+ User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+
+ switch (deviceBreakdownMaintenance.getFlowType()) {
+ case 0:
+ BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
+ // 鐢宠
+ breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
+ breakdownMaintenance.setApplicantUserId(user.getId());
+ breakdownMaintenance.setApplicantUser(user.getName());
+ breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
+
+ // 澶勭悊浜轰俊鎭�
+ User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
+ breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
+ breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
+
+ baseMapper.insert(breakdownMaintenance);
+ break;
+ case 1:
+ breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+ // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+ breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
+ breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
+
+ baseMapper.updateById(breakdownMaintenance);
+ break;
+ case 2:
+ breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+ // 璁¢噺瀹ゆ剰瑙�
+ breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
+ breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
+ breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
+
+ breakdownMaintenance.setIsFinish(1);
+
+ baseMapper.updateById(breakdownMaintenance);
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * 瀵煎嚭璁惧鏁呴殰缁翠慨
+ * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+ * @param response 鍝嶅簲
+ */
+ @Override
+ public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
+ // 鏌ヨ澶栭儴璁惧鐢宠
+ DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
+
+ Device device = null;
+ if (deviceBreakdownMaintenance.getDeviceId() != null) {
+ device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
+ device = device == null ? new Device() : device;
+ }
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
+ Configure configure = Configure.builder()
+ .build();
+ Device finalDevice = device;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
+ put("device", finalDevice);
+ // 鐢宠浜虹鍚�
+ put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
+ // 閮ㄩ棬璐熻矗浜虹鍚�
+ put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+ 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/DeviceInspectionRecordDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
new file mode 100644
index 0000000..9058081
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Service
+public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
new file mode 100644
index 0000000..2c8041d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -0,0 +1,221 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private DeviceMapper deviceMapper;
+ @Resource
+ private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
+
+ /**
+ * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+ *
+ * @param page 褰撳墠椤电爜
+ */
+ @Override
+ public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
+ IPage<DeviceInspectionRecord> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
+ return Result.success(iPage);
+ }
+
+
+ /**
+ * 鏌ヨ鐐规璇︽儏
+ * @param inspectionRecordId
+ * @return
+ */
+ @Override
+ public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+ DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
+ DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
+ BeanUtils.copyProperties(deviceInspectionRecord, dto);
+ List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
+ dto.setDetails(list);
+ return Result.success(dto);
+ }
+
+ /**
+ * 鏂板璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+
+ Integer userId = SecurityUtils.getUserId().intValue();
+ User user = userMapper.selectById(userId);
+ deviceInspectionRecord.setRecorderId(userId);
+ deviceInspectionRecord.setRecorder(user.getName());
+
+ // 鏌ヨ澶嶆牳浜篿d
+ if (deviceInspectionRecord.getReviewerId() != null) {
+ User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+ deviceInspectionRecord.setReviewer(reviewUser.getName());
+ }
+ this.saveOrUpdate(deviceInspectionRecord);
+ if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+ for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+ detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+ }
+ deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+ }
+
+ return Result.success();
+ }
+
+
+ /**
+ * 淇敼璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ @Override
+ public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+ // 鏌ヨ澶嶆牳浜篿d
+ if (deviceInspectionRecord.getReviewerId() != null) {
+ User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+ deviceInspectionRecord.setReviewer(reviewUser.getName());
+ }
+ this.saveOrUpdate(deviceInspectionRecord);
+ deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+ if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+ for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+ detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+ }
+ deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+ }
+ return Result.success();
+ }
+
+ /**
+ * 鍒犻櫎璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecord 璁惧鐐规璁板綍
+ */
+ @Override
+ public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+ this.removeById(deviceInspectionRecord);
+ deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+ return Result.success();
+ }
+
+ /**
+ * 澶嶆牳鐐规璁板綍
+ * @param dto
+ * @return
+ */
+ @Override
+ public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
+ LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
+ .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
+ .set(DeviceInspectionRecord::getStatus, dto.getStatus())
+ .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
+
+ // 涓�0娓呴櫎瀹℃牳浜�
+ if (dto.getStatus().equals(0)) {
+ wrapper.set(DeviceInspectionRecord::getReviewerId, null)
+ .set(DeviceInspectionRecord::getReviewer, null);
+ }
+ this.update(wrapper);
+
+ return Result.success();
+ }
+
+ /**
+ * 瀵煎嚭璁惧鐐规璁板綍
+ *
+ * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+ * @param response 鍝嶅簲
+ */
+ @Override
+ public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
+ DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
+ DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
+ BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
+ DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
+
+ List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
+
+ Integer deviceId = deviceInspectionRecord.getDeviceId();
+
+ Device device = deviceMapper.selectById(deviceId);
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
+ Configure configure = Configure.builder()
+ .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceInspectionRecord", deviceInspectionRecordDto);
+ put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
+ put("device", device);
+ put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
+ put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ device.getDeviceName() + "鐐规璁板綍", "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("瀵煎嚭澶辫触");
+ }
+ return Result.success();
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
new file mode 100644
index 0000000..6f5bb5b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
@@ -0,0 +1,67 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.InstructionMapper;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
+
+ @Autowired
+ private DeviceOperationInstructionService operationInstructionService;
+
+ @Autowired
+ private NumberGenerator<DeviceInstruction> numberGenerator;
+
+ @Override
+ public IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
+ return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
+ }
+
+ @Override
+ public void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto) {
+ if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+ String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+ String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+ String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+ String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, DeviceInstruction::getApplicationNumber);
+ instructionDto.setApplicationNumber(processNumber);
+ }
+ saveOrUpdate(instructionDto);
+ if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+ instructionDto.getFeTempHumRecordList().forEach(i -> {
+ i.setInstructionId(instructionDto.getId());
+ i.setUploader(SecurityUtils.getUserId().intValue());
+ i.setUpdateTime(LocalDateTime.now());
+ });
+ operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+ }
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
new file mode 100644
index 0000000..3487fc2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
@@ -0,0 +1,86 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.device.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+public class DeviceMaintenanceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements DeviceMaintenanceService {
+
+ @Override
+ public IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber) {
+ return baseMapper.selectPage(page, Wrappers.<DeviceMaintenance>lambdaQuery()
+ .eq(DeviceMaintenance::getDeviceId, deviceId)
+ .like(DeviceMaintenance::getDeviceNumber, deviceNumber));
+ }
+
+ @Override
+ public List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId) {
+ return baseMapper.deviceMaintenanceExport(deviceId);
+ }
+
+ @Override
+ public void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response) {
+ // 鏌ヨcnas璁惧缁翠慨璁板綍
+ List<DeviceMaintenance> deviceMaintenanceList = baseMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery()
+ .eq(DeviceMaintenance::getDeviceId, deviceId)
+ .select(DeviceMaintenance::getDate,
+ DeviceMaintenance::getDeviceNumber,
+ DeviceMaintenance::getDeviceName,
+ DeviceMaintenance::getManagementNumber,
+ DeviceMaintenance::getContent,
+ DeviceMaintenance::getName,
+ DeviceMaintenance::getComments));
+
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/maintenance-records.docx");
+ Configure configure = Configure.builder()
+ .bind("deviceMaintenanceList", new HackLoopTableRenderPolicy())
+ .build();
+ // 鑾峰彇璁惧 鍚嶇О 鍜� 缂栧彿
+ DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(0);
+ String deviceName = deviceMaintenance.getDeviceName();
+ String managementNumber = deviceMaintenance.getManagementNumber();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceMaintenanceList", deviceMaintenanceList);
+ put("deviceName", deviceName);
+ put("managementNumber", managementNumber);
+ }});
+
+ 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("瀵煎嚭澶辫触");
+ }
+ }
+
+}
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/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
new file mode 100644
index 0000000..273dd2c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.OperationInstructionMapper;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
+
+ @Override
+ public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
+ return baseMapper.homeworkGuidebookEditor(instructionId);
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
new file mode 100644
index 0000000..910617a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
@@ -0,0 +1,179 @@
+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.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceScrappedDto;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceScrappedMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceScrapped;
+import com.ruoyi.device.service.DeviceScrappedService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Service
+public class DeviceScrappedServiceImpl extends ServiceImpl<DeviceScrappedMapper, DeviceScrapped> implements DeviceScrappedService {
+
+ @Resource
+ private DeviceMapper deivceMapper;
+ @Resource
+ private UserMapper userMapper;
+
+
+ /**
+ * 璁惧鎶ュ簾鐢宠鍒楄〃
+ *
+ * @param deviceScrapped
+ * @return
+ */
+ @Override
+ public IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
+ return baseMapper.pageDeviceScrapped(page, QueryWrappers.queryWrappers(deviceScrapped));
+ }
+
+ /**
+ * 鏂板璁惧鎶ュ簾鐢宠
+ *
+ * @return
+ */
+ @Override
+ public boolean addDeviceScrapped(DeviceScrapped deviceScrapped) {
+ DeviceScrapped scrapped = new DeviceScrapped();
+ // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+ User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+ switch (deviceScrapped.getFlowType()) {
+ case 0:
+ BeanUtils.copyProperties(deviceScrapped, scrapped);
+ // 鐢宠
+ scrapped.setReasonsForScrap(deviceScrapped.getReasonsForScrap());
+ scrapped.setApplicantUserId(user.getId());
+ scrapped.setApplicantUser(user.getName());
+ scrapped.setApplicantDate(LocalDate.now());
+
+ // 澶勭悊浜轰俊鎭�
+ User departmentHeadUser = userMapper.selectById(deviceScrapped.getDepartmentHeadUserId());
+ scrapped.setApplicantUserId(departmentHeadUser.getId());
+ scrapped.setApplicantUser(departmentHeadUser.getName());
+
+ baseMapper.insert(scrapped);
+ break;
+ case 1:
+ scrapped.setScrappedId(deviceScrapped.getScrappedId());
+ // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+ scrapped.setDepartmentHeadOpinion(deviceScrapped.getDepartmentHeadOpinion());
+ scrapped.setDepartmentHeadDate(LocalDate.now());
+
+ // 璁¢噺瀹や俊鎭�
+ User meteringRoomUser = userMapper.selectById(deviceScrapped.getMeteringRoomUserId());
+ scrapped.setMeteringRoomUserId(meteringRoomUser.getId());
+ scrapped.setMeteringRoomUser(meteringRoomUser.getName());
+
+ baseMapper.updateById(scrapped);
+ break;
+ case 2:
+ scrapped.setScrappedId(deviceScrapped.getScrappedId());
+ // 璁¢噺瀹ゆ剰瑙�
+ scrapped.setMeteringRoomOpinion(deviceScrapped.getMeteringRoomOpinion());
+ scrapped.setMeteringRoomDate(LocalDate.now());
+
+ // 鎵瑰噯浜轰俊鎭�
+ User approverUser = userMapper.selectById(deviceScrapped.getApproverUserId());
+ scrapped.setApproverUserId(approverUser.getId());
+ scrapped.setApproverUser(approverUser.getName());
+
+ baseMapper.updateById(scrapped);
+ break;
+ case 3:
+ scrapped.setScrappedId(deviceScrapped.getScrappedId());
+ //鎵瑰噯浜�
+ scrapped.setApproverOpinion(deviceScrapped.getApproverOpinion());
+ scrapped.setApproverDate(LocalDate.now());
+ scrapped.setIsFinish(1);
+ baseMapper.updateById(scrapped);
+ break;
+ }
+
+ return true;
+ }
+
+ /**
+ * 瀵煎嚭璁惧鎶ュ簾鐢宠
+ *
+ * @param scrappedId 璁惧鎶ュ簾鐢宠id
+ * @param response 鍝嶅簲
+ * @return 缁撴灉
+ */
+ @Override
+ public Result<?> exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+ // 鏌ヨ鎶ュ簾鏁版嵁
+ DeviceScrappedDto deviceScrapped = baseMapper.selectDeviceScrappedById(scrappedId);
+ if (deviceScrapped == null) {
+ return Result.fail("璁惧鎶ュ簾鐢宠涓嶅瓨鍦�");
+ }
+ Device device = null;
+ if (deviceScrapped.getDeviceId() != null) {
+ device = deivceMapper.selectById(deviceScrapped.getDeviceId());
+ device = device == null ? new Device() : device;
+ }
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-scrapped.docx");
+ Configure configure = Configure.builder()
+ .build();
+ Device finalDevice = device;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceScrapped", deviceScrapped);
+ put("device", finalDevice);
+ // 鐢宠浜虹鍚�
+ put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApplicantUserId()));
+ // 閮ㄩ棬璐熻矗浜虹鍚�
+ put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getDepartmentHeadUserId()));
+ // 璁¢噺瀹ょ鍚�
+ put("metrologyRoomUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getMeteringRoomUserId()));
+ // 鎵瑰噯浜虹鍚�
+ put("approverUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApproverUserId()));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+ 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("瀵煎嚭澶辫触");
+ }
+ return Result.success();
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
new file mode 100644
index 0000000..f4f7c5a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
@@ -0,0 +1,159 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.deepoove.poi.data.Pictures;
+import com.ruoyi.basic.mapper.LaboratoryMapper;
+import com.ruoyi.basic.pojo.Laboratory;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.mapper.DeviceStateMapper;
+import com.ruoyi.device.pojo.DeviceState;
+import com.ruoyi.device.service.DeviceStateService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@Service
+public class DeviceStateServiceImpl extends ServiceImpl<DeviceStateMapper, DeviceState> implements DeviceStateService {
+
+ @Resource
+ private LaboratoryMapper laboratoryMapper;
+
+ @Resource
+ private UserMapper userMapper;
+
+ @Value("${file.path}")
+ private String imgUrl;
+
+ @Override
+ public IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber) {
+ return baseMapper.getDeviceStatePage(deviceId, page, processNumber);
+ }
+
+ @Override
+ public void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response) {
+ // 鏍规嵁娴佺▼缂栧彿 鏌ヨcnas璁惧鐘舵��
+ DeviceStateDto deviceStateDto = baseMapper.getDeviceStatePage(deviceId,new Page<DeviceStateDto>(1,1), processNumber).getRecords().get(0);
+
+ // 瀵规椂闂磋繘琛屼慨鏀�
+ DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+ deviceStateDto.setSubmitDateString(deviceStateDto.getSubmitDate() != null ? deviceStateDto.getSubmitDate().format(format) : " 骞� 鏈� 鏃�");
+ deviceStateDto.setDepartmentDateString(deviceStateDto.getDepartmentDate() != null? deviceStateDto.getDepartmentDate().format(format) : " 骞� 鏈� 鏃�");
+ deviceStateDto.setMeasuringRoomDateString(deviceStateDto.getMeasuringRoomDate() != null? deviceStateDto.getMeasuringRoomDate().format(format) : " 骞� 鏈� 鏃�");
+ deviceStateDto.setApprovalDateString(deviceStateDto.getApprovalDate() != null? deviceStateDto.getApprovalDate().format(format) : " 骞� 鏈� 鏃�");
+
+ // 鏌ヨ璁惧灞炰簬鍝釜瀹為獙瀹�
+ String laboratoryName;
+ String largeCategory = deviceStateDto.getLargeCategory();
+ if (StringUtils.isNotBlank(largeCategory)) {
+ largeCategory = largeCategory.substring(0, 1);
+ Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
+ .eq(Laboratory::getLaboratoryNumber, largeCategory)
+ .select(Laboratory::getLaboratoryName));
+ laboratoryName = laboratory.getLaboratoryName();
+ } else {
+ laboratoryName = "";
+ }
+
+ //todo: 璁惧鐘舵�佹煡璇㈢鍚嶅湴鍧� 鏆傛椂浜哄悕鏌ヨ
+ //鑾峰彇鐢宠浜虹殑绛惧悕鍦板潃
+ String applicantUrl = null;
+ if (deviceStateDto.getSubmitOperatingPersonnel() != null) {
+ applicantUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, deviceStateDto.getSubmitOperatingPersonnel()))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(applicantUrl)) {
+ throw new ErrorException("鎵句笉鍒扮敵璇蜂汉鐨勭鍚�");
+ }
+ }
+
+ //鑾峰彇閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+ String headOfDepartmentUrl = null;
+ if (deviceStateDto.getDepartmentNextPesponsible() != null) {
+ headOfDepartmentUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, deviceStateDto.getDepartmentNextPesponsible()))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(headOfDepartmentUrl)) {
+ throw new ErrorException("鎵句笉鍒伴儴闂ㄨ礋璐d汉鐨勭鍚�");
+ }
+ }
+
+ //鑾峰彇璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+ String measurementRoomUrl = null;
+ if (deviceStateDto.getMeasuringRoomNextPesponsible() != null) {
+ measurementRoomUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, deviceStateDto.getMeasuringRoomNextPesponsible()))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(measurementRoomUrl)) {
+ throw new ErrorException("鎵句笉鍒拌閲忓澶嶆祴浜虹殑绛惧悕");
+ }
+ }
+
+ //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+ String approvedUrl = null;
+ if (deviceStateDto.getApprovalNextPesponsible() != null) {
+ approvedUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, deviceStateDto.getApprovalNextPesponsible()))
+ .getSignatureUrl();
+ if (StringUtils.isBlank(approvedUrl)) {
+ throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+ }
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-status.docx");
+ Configure configure = Configure.builder()
+ .build();
+ String finalApplicantUrl = applicantUrl; // 鐢宠浜虹殑绛惧悕鍦板潃
+ String finalHeadOfDepartmentUrl = headOfDepartmentUrl; // 閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+ String finalMeasurementRoomUrl = measurementRoomUrl; // 璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+ String finalApprovedUrl = approvedUrl; // 鎵瑰噯浜虹殑绛惧悕鍦板潃
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("deviceStateDto", deviceStateDto);
+ put("submitOperatingPersonnelUrl", StringUtils.isNotBlank(finalApplicantUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApplicantUrl).create() : null);
+ put("departmentNextPesponsibleUrl", StringUtils.isNotBlank(finalHeadOfDepartmentUrl) ? Pictures.ofLocal(imgUrl + "/" + finalHeadOfDepartmentUrl).create() : null);
+ put("measuringRoomNextPesponsibleUrl", StringUtils.isNotBlank(finalMeasurementRoomUrl) ? Pictures.ofLocal(imgUrl + "/" + finalMeasurementRoomUrl).create() : null);
+ put("approvalNextPesponsibleUrl", StringUtils.isNotBlank(finalApprovedUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovedUrl).create() : null);
+ put("laboratory", laboratoryName);
+ }});
+
+ 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("瀵煎嚭澶辫触");
+ }
+ }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
new file mode 100644
index 0000000..7ead8cb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
@@ -0,0 +1,65 @@
+package com.ruoyi.device.task;
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧浣跨敤璁板綍鎻愰啋
+ */
+@Component
+public class DeviceRecordSchedule {
+ @Resource
+ private DeviceRecordMapper deviceRecordMapper;
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+ /**
+ * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+ */
+// @Scheduled(cron = "0/5 * * * * *")
+ @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
+ public void task1() {
+ // 鏌ヨ鏈~鍐欑殑璁惧浣跨敤璁板綍
+ List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
+ Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
+ userPersonIdMap.forEach((userId, recordList) -> {
+ threadPoolTaskExecutor.execute(() -> {
+ // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+ User user = userMapper.selectById(userId);
+ String message = "";
+ message += "璁惧浣跨敤璁板綍鏈~鍐欐彁閱掗�氱煡";
+ for (DeviceRecordDto deviceRecord : recordList) {
+ message += "\n璁惧鍚嶇О缂栧彿: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
+ message += "\n濮旀墭缂栧彿: " + deviceRecord.getSampleCode();
+ message += "\n";
+ }
+ message += "\n璇峰幓濉啓璁惧浣跨敤璁板綍";
+
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(user.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ });
+ });
+
+
+ }
+
+}
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/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
new file mode 100644
index 0000000..2bbfce0
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
@@ -0,0 +1,29 @@
+<?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.DeviceAccidentReportMapper">
+
+ <!-- 璁惧浜嬫晠鎶ュ憡鍒楄〃 -->
+ <select id="pageDeviceAccidentReport" resultType="com.ruoyi.device.pojo.DeviceAccidentReport">
+ select * from (
+ select *
+ from device_accident_report
+ order by create_time desc
+ ) a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+ <select id="selectDeviceAccidentReportById" resultType="com.ruoyi.device.dto.DeviceAccidentReportDto">
+ select
+ d.*,
+ date_format(d.accident_date,'%Y-%m-%d') accidentDateStr, -- 鏃堕棿
+ date_format(d.report_date,'%Y-%m-%d') reportDateStr, -- 鎶ュ憡浜哄~鍐欐椂闂�
+ date_format(d.assessor_date,'%Y-%m-%d') assessorDateStr, -- 璇勪及浜哄~鍐欐椂闂�
+ date_format(d.department_head_date,'%Y-%m-%d') departmentHeadDateStr, -- 閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�
+ date_format(d.technical_director_date,'%Y-%m-%d') technicalDirectorDateStr, -- 鎶�鏈礋璐d汉濉啓鏃堕棿
+ date_format(d.director_head_date,'%Y-%m-%d') directorHeadDateStr -- 涓讳换濉啓鏃堕棿
+ from device_accident_report d
+ where d.accident_report_id = #{accidentReportId}
+ </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml
new file mode 100644
index 0000000..bb2454d
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml
@@ -0,0 +1,21 @@
+<?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.DeviceBorrowMapper">
+
+ <select id="deviceBorrowPage" resultType="com.ruoyi.device.pojo.DeviceBorrow">
+ select * from (
+ select db.*,device_name
+ from device_borrow db
+ left join `center-lims`.device on db.device_id=device.id
+ )a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+ <select id="getDeviceBorrowBydeviceId" resultType="com.ruoyi.device.pojo.DeviceBorrow">
+ select db.*,device_name
+ from device_borrow db
+ left join `center-lims`.device on db.device_id=device.id
+ where device_id=#{deviceId}
+ </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
new file mode 100644
index 0000000..4877ecf
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.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.DeviceBreakdownMaintenanceMapper">
+
+ <!--璁惧鏁呴殰缁翠慨鍒楄〃-->
+ <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
+ select * from (
+ select *
+ from device_breakdown_maintenance
+ order by create_time desc
+ ) a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
new file mode 100644
index 0000000..af4ac42
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
@@ -0,0 +1,14 @@
+<?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.DeviceInspectionRecordMapper">
+
+
+ <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
+ SELECT
+ *
+ from device_inspection_record
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml b/cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml
new file mode 100644
index 0000000..9bc7595
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml
@@ -0,0 +1,27 @@
+<?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.DeviceScrappedMapper">
+
+ <!-- 璁惧鎶ュ簾鐢宠鍒楄〃 -->
+ <select id="pageDeviceScrapped" resultType="com.ruoyi.device.pojo.DeviceScrapped">
+ select * from (
+ select *
+ from device_scrapped
+ order by create_time desc
+ ) a
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+ <select id="selectDeviceScrappedById" resultType="com.ruoyi.device.dto.DeviceScrappedDto">
+ select
+ *,
+ date_format(applicant_date,'%Y骞�%m鏈�%d鏃�') as applicantDateStr,
+ date_format(department_head_date,'%Y骞�%m鏈�%d鏃�') as departmentHeadDateStr,
+ date_format(metering_room_date,'%Y骞�%m鏈�%d鏃�') as meteringRoomDateStr,
+ date_format(approver_date,'%Y骞�%m鏈�%d鏃�') as approverDateStr
+ from device_scrapped
+ where scrapped_id = #{scrappedId}
+ </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceStateMapper.xml b/cnas-device/src/main/resources/mapper/DeviceStateMapper.xml
new file mode 100644
index 0000000..3423111
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceStateMapper.xml
@@ -0,0 +1,19 @@
+<?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.DeviceStateMapper">
+
+
+ <select id="getDeviceStatePage" resultType="com.ruoyi.device.dto.DeviceStateDto">
+ select ds.*,
+ d.device_name,
+ d.management_number,
+ d.specification_model,
+ d.large_category
+ from device_state ds
+ left join device d on d.id = ds.device_id
+ where ds.device_id = #{deviceId}
+ <if test="processNumber != '' and processNumber != null">
+ and ds.process_number like concat('%', #{processNumber}, '%')
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/InstructionMapper.xml b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..2d1a823
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,19 @@
+<?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.InstructionMapper">
+
+
+ <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.pojo.DeviceInstruction">
+ SELECT
+ doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
+ FROM
+ device_operation_instruction doi
+ LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+ left join device d on d.id = doi.device_id
+ left join user u on u.id = doi.uploader
+ left join user u1 on u1.id = doi.approver_id
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..5679e35
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,13 @@
+<?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.OperationInstructionMapper">
+
+ <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
+ SELECT
+ doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+ FROM
+ device_operation_instruction doi
+ left join device d on d.id = doi.device_id
+ where doi.instruction_id = #{instructionId}
+ </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/static/word/acceptance-certificate.docx b/cnas-device/src/main/resources/static/word/acceptance-certificate.docx
new file mode 100644
index 0000000..c4412dd
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/acceptance-certificate.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-accident-report.docx b/cnas-device/src/main/resources/static/word/device-accident-report.docx
new file mode 100644
index 0000000..6263ba9
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-accident-report.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx b/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx
new file mode 100644
index 0000000..595edc5
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-calibration-plan.docx b/cnas-device/src/main/resources/static/word/device-calibration-plan.docx
new file mode 100644
index 0000000..4f4e6ff
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-calibration-plan.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-document.docx b/cnas-device/src/main/resources/static/word/device-document.docx
new file mode 100644
index 0000000..d9e1d51
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-document.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-external-apply.docx b/cnas-device/src/main/resources/static/word/device-external-apply.docx
new file mode 100644
index 0000000..8df765b
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-external-apply.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-inspection-record.docx b/cnas-device/src/main/resources/static/word/device-inspection-record.docx
new file mode 100644
index 0000000..2c7a4f4
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-inspection-record.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-scrapped.docx b/cnas-device/src/main/resources/static/word/device-scrapped.docx
new file mode 100644
index 0000000..96dfdd8
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-scrapped.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-status.docx b/cnas-device/src/main/resources/static/word/device-status.docx
new file mode 100644
index 0000000..5753f22
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-status.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/examine-plan-detail.docx b/cnas-device/src/main/resources/static/word/examine-plan-detail.docx
new file mode 100644
index 0000000..118c324
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/examine-plan-detail.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/examine-record.docx b/cnas-device/src/main/resources/static/word/examine-record.docx
new file mode 100644
index 0000000..2462971
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/examine-record.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/incident-report.docx b/cnas-device/src/main/resources/static/word/incident-report.docx
new file mode 100644
index 0000000..c190287
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/incident-report.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/maintenance-plan.docx b/cnas-device/src/main/resources/static/word/maintenance-plan.docx
new file mode 100644
index 0000000..d4e69a0
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/maintenance-plan.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/maintenance-records.docx b/cnas-device/src/main/resources/static/word/maintenance-records.docx
new file mode 100644
index 0000000..ba8c9f8
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/maintenance-records.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/quipment-details.docx b/cnas-device/src/main/resources/static/word/quipment-details.docx
new file mode 100644
index 0000000..d244180
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/quipment-details.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx b/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx
new file mode 100644
index 0000000..dd48c97
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/traceability-management-details.docx b/cnas-device/src/main/resources/static/word/traceability-management-details.docx
new file mode 100644
index 0000000..cb6d3b9
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/traceability-management-details.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/use-record.docx b/cnas-device/src/main/resources/static/word/use-record.docx
new file mode 100644
index 0000000..236e645
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/use-record.docx
Binary files differ
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
index 0251cac..74f3ba3 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -71,7 +71,7 @@
*/
@ApiOperation(value = "瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�")
- @GetMapping("/delClientSatisfaction")
+ @DeleteMapping("/delClientSatisfaction")
public Result updateClientSatisfaction(Integer clientSatisfactionId){
return Result.success(clientSatisfactionService.removeById(clientSatisfactionId));
}
@@ -132,7 +132,7 @@
*/
@ApiOperation(value = "鍒犻櫎鎴峰垎鏋愰檮浠�")
- @GetMapping("/delAnalyseFile")
+ @DeleteMapping("/delAnalyseFile")
public Result delAnalyseFile(Integer analyseFileId){
return Result.success(clientSatisfactionAnalyseFileMapper.deleteById(analyseFileId));
}
diff --git a/cnas-personnel/pom.xml b/cnas-personnel/pom.xml
new file mode 100644
index 0000000..689a7a9
--- /dev/null
+++ b/cnas-personnel/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi</artifactId>
+ <version>3.8.9</version>
+ </parent>
+
+ <artifactId>cnas-personnel</artifactId>
+
+ <dependencies>
+ <!-- 閫氱敤宸ュ叿-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-common</artifactId>
+ </dependency>
+
+ <!-- 鏍稿績妯″潡-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-framework</artifactId>
+ </dependency>
+
+ <!-- 绯荤粺妯″潡-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-system</artifactId>
+ </dependency>
+
+ <!-- 绯荤粺妯″潡-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>inspect-server</artifactId>
+ </dependency>
+ </dependencies>
+
+ <properties>
+ <maven.compiler.source>8</maven.compiler.source>
+ <maven.compiler.target>8</maven.compiler.target>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+</project>
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
new file mode 100644
index 0000000..01b44d4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -0,0 +1,229 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.AnnexService;
+import com.ruoyi.personnel.service.PersonBasicInfoFileService;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
+@RestController
+@RequestMapping("/personBasicInfo")
+public class PersonBasicInfoController {
+
+ @Resource
+ private PersonBasicInfoService personBasicInfoService;
+
+ @Resource
+ private PersonBasicInfoFileService personBasicInfoFileService;
+ @Resource
+ private PersonBasicInfoWorkService personBasicInfoWorkService;
+
+ @Resource
+ private AnnexService annexService;
+
+
+ @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+ @GetMapping("/selectCNSAPersonTree")
+ public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+ return Result.success(personBasicInfoService.selectCNSAPersonTree());
+ }
+
+ @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+ @GetMapping("/getCNASPersonnelInfo")
+ public Result getCNASPersonnelInfo(Integer userId) {
+ return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+ }
+
+ @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+ @PostMapping("/saveCNASPersonnelInfo")
+ public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+ personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+ @GetMapping("basicInformationOfPersonnelSelectPage")
+ public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+ return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
+ }
+
+ // 涓婁紶鏂囦欢鎺ュ彛
+ @ApiOperation(value = "涓婁紶鏂囦欢鎺ュ彛")
+ @PostMapping("/saveCNASFile")
+ public Result saveFile(@RequestPart("file") MultipartFile file) {
+ String s = FileSaveUtil.uploadWordFile(file);
+ return Result.success("涓婁紶鎴愬姛", s);
+ }
+
+ @GetMapping("/getAnnexByUserId")
+ public Result<List<Annex>> getAnnexByUserId(Integer userId) {
+ List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
+ return Result.success(list);
+ }
+
+ // 鍒犻櫎鏂囦欢
+ @DeleteMapping("/deleteCNASFile")
+ public Result saveFile(String fileName) {
+ String[] split = fileName.split(",");
+ for (String s : split) {
+ FileSaveUtil.DeleteFile(s);
+ }
+ return Result.success();
+
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
+ */
+ @PostMapping("/addAnnex")
+ public Result addAnnex(@RequestBody Annex annex) {
+ annexService.save(annex);
+ return Result.success();
+ }
+
+ @GetMapping("/getAnnex")
+ public Result<Annex> getAnnex(Integer id) {
+ return Result.success(annexService.getById(id));
+ }
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ */
+ @DeleteMapping("/deleteAnnex")
+ public Result deleteAnnex(Integer id) {
+ annexService.removeById(id);
+ return Result.success();
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢淇敼
+ *
+ */
+ @PostMapping("/updateAnnex")
+ public Result updateAnnex(@RequestBody Annex annex) {
+ annexService.updateById(annex);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+ @GetMapping("/exportPersonBasicInfo")
+ public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+ personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+ }
+
+ @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�")
+ @GetMapping("/exportPersonBasicInfoById")
+ public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+ return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+ * @param userId
+ * @param file
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板")
+ @PostMapping("/uploadBasicInfoFile")
+ public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
+ return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
+ }
+
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃")
+ @GetMapping("/getBasicInfoFileList")
+ public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
+ return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
+ .eq(PersonBasicInfoFile::getUserId, userId)));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎")
+ @GetMapping("/delBasicInfoFileList")
+ public Result delBasicInfoFileList(Integer basicInfoFileId){
+ return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板")
+ @PostMapping("/addBasicInfoWork")
+ public Result<?> addBasicInfoWork(@RequestBody PersonBasicInfoWork basicInfoWork) {
+ if (basicInfoWork.getUserId() == null) {
+ throw new ErrorException("缂哄皯浜哄憳id");
+ }
+ basicInfoWork.setUserId(basicInfoWork.getUserId());
+ return Result.success(personBasicInfoWorkService.save(basicInfoWork));
+ }
+
+
+ /**
+ * 浜哄憳宸ヤ綔缁忓巻鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒楄〃")
+ @GetMapping("/getBasicInfoWorkList")
+ public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
+ return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+ .eq(PersonBasicInfoWork::getUserId, userId)));
+ }
+
+ /**
+ * 浜哄憳宸ヤ綔缁忓巻鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒犻櫎")
+ @GetMapping("/delBasicInfoWorkList")
+ public Result delBasicInfoWorkList(Integer basicInfoWorkId){
+ return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻淇敼")
+ @PostMapping("/updateBasicInfoWorkList")
+ public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
+ return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
new file mode 100644
index 0000000..3aef8b9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Api(tags = "浜哄憳 - 娌熼�氳褰�")
+@RestController
+@RequestMapping("/personCommunicationAbility")
+public class PersonCommunicationAbilityController {
+
+ @Autowired
+ private PersonCommunicationAbilityService personCommunicationAbilityService;
+
+ @ApiOperation(value = "鏂板/鏇存柊 娌熼�氳褰�")
+ @PostMapping("addOrUpdatePersonCommunicationAbility")
+ public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
+ personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍒犻櫎 娌熼�氳褰�")
+ @DeleteMapping("deletePersonCommunicationAbility")
+ public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
+ personCommunicationAbilityService.removeById(id);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鏌ヨ 娌熼�氳褰�")
+ @GetMapping("personPersonCommunicationAbilityPage")
+ public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
+ Integer departLimsId,
+ Integer userId,
+ String userName) {
+ return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
+ }
+
+ @ApiOperation(value = "瀵煎嚭娌熼�氳褰�")
+ @PostMapping("exportPersonCommunicationAbility")
+ public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
+ personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
new file mode 100644
index 0000000..615af7b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Api(tags = "浜哄憳 - 宀椾綅鑱岃矗")
+@RestController
+@RequestMapping("/personJobResponsibilities")
+public class PersonJobResponsibilitiesController {
+ @Autowired
+ private PersonJobResponsibilitiesService personJobResponsibilitiesService;
+
+ @ApiOperation(value = "鏂板/鏇存柊 宀椾綅鑱岃矗")
+ @PostMapping("/personJobResponsibilitiesSave")
+ public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
+ personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍒犻櫎 宀椾綅鑱岃矗")
+ @DeleteMapping("/personJobResponsibilitiesDelete")
+ public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
+ personJobResponsibilitiesService.removeById(id);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鏌ヨ 宀椾綅鑱岃矗")
+ @GetMapping("/personJobResponsibilitiesSelect")
+ public Result<IPage<PersonJobResponsibilitiesDto>> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+ IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+ return Result.success(iPage);
+ }
+
+
+ @ApiOperation(value = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�")
+ @PostMapping("/exportPersonJobResponsibilities")
+ public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){
+ personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
new file mode 100644
index 0000000..a066615
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
@@ -0,0 +1,92 @@
+package com.ruoyi.personnel.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.common.utils.SecurityUtils;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Api(tags = "浜哄憳 - 浜哄憳鑳藉姏")
+@RestController
+@RequestMapping("/personPersonnelCapacity")
+public class PersonPersonnelCapacityController {
+
+ @Autowired
+ private PersonPersonnelCapacityService personPersonnelCapacityService;
+
+
+ @ApiOperation(value = "鏂板/鏇存柊 浜哄憳鑳藉姏")
+ @PostMapping("addOrUpdatePersonPersonnelCapacity")
+ public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+ personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍒犻櫎 浜哄憳鑳藉姏")
+ @DeleteMapping("deletePersonPersonnelCapacity")
+ public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
+ // 鍒犻櫎鏁版嵁
+ personPersonnelCapacityService.removeById(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鏌ヨ 浜哄憳鑳藉姏")
+ @GetMapping("personPersonnelCapacityPage")
+ public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
+ Integer departmentId,
+ Integer userId,
+ String userName) {
+ return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
+ }
+
+ @ApiOperation(value = "纭 浜哄憳鑳藉姏")
+ @GetMapping("confirmPersonnelCapability")
+ public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
+ Integer userId = SecurityUtils.getUserId().intValue();
+ personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+ .eq(PersonPersonnelCapacity::getId, id)
+ .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+ .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
+ return Result.success();
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鑳藉姏
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭浜哄憳鑳藉姏")
+ @GetMapping("/exportPersonnelCapacity")
+ public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
+ personPersonnelCapacityService.exportPersonnelCapacity(id, response);
+ }
+
+ /**
+ * 鎻愪氦纭浜哄憳鑳藉姏
+ * @param personPersonnelCapacity
+ * @return
+ */
+ @ApiOperation(value = "鎻愪氦")
+ @PostMapping("submitConfirmPersonnelCapability")
+ public Result<?> submitConfirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+ personPersonnelCapacityService.submitConfirmPersonnelCapability(personPersonnelCapacity);
+ return Result.success();
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
new file mode 100644
index 0000000..c65f312
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
@@ -0,0 +1,66 @@
+package com.ruoyi.personnel.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.common.utils.FileSaveUtil;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Api(tags = "浜哄憳 - 浠昏亴鎺堟潈璁板綍")
+@RestController
+@RequestMapping("/personPostAuthorizationRecord")
+public class PersonPostAuthorizationRecordController {
+
+ @Autowired
+ private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
+
+ @ApiOperation(value = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍")
+ @PostMapping("/addOrUpdatePersonPostAuthorizationRecord")
+ public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
+ personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍒犻櫎 浠昏亴鎺堟潈璁板綍")
+ @DeleteMapping("/deletePersonPostAuthorizationRecord")
+ public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
+ // 鍒犻櫎鏂囦欢
+ PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
+ FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
+ // 鍒犻櫎鏁版嵁
+ personPostAuthorizationRecordService.removeById(id);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鏌ヨ 浠昏亴鎺堟潈璁板綍")
+ @GetMapping("/PersonPostAuthorizationRecordPage")
+ public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
+ Integer departLimsId,
+ Integer userId,
+ String userName) {
+ return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
+ }
+
+ @ApiOperation(value = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功")
+ @PostMapping("/exportPersonPostAuthorizationRecord")
+ public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){
+ personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
new file mode 100644
index 0000000..72f4e43
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
@@ -0,0 +1,100 @@
+package com.ruoyi.personnel.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+@Api(tags = "浜哄憳 - 濂栨儵璁板綍")
+@RestController
+@RequestMapping("/personRewardPunishmentRecord")
+public class PersonRewardPunishmentRecordController {
+
+ @Autowired
+ private PersonRewardPunishmentRecordService personRewardPunishmentRecordService;
+
+ @ApiOperation(value = "鏂板/鏇存柊 濂栨儵璁板綍")
+ @PostMapping("/addOrUpdateRewardPunishment")
+ public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) {
+ personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍒犻櫎濂栨儵璁板綍")
+ @DeleteMapping("/deleteRewardPunishment")
+ public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) {
+ personRewardPunishmentRecordService.removeById(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鏌ヨ 濂栨儵璁板綍")
+ @GetMapping("/rewardPunishmentPage")
+ @SneakyThrows
+ public Result<IPage<PersonRewardPunishmentRecordDto>> rewardPunishmentPage(Page page,
+ Integer userId,
+ Integer departmentId,
+ String userName,
+ @RequestParam(value = "startTime",required = false) String startTimeStr,
+ @RequestParam(value = "endTime",required = false) String endTimeStr) {
+ Date startTime = null;
+ Date endTime = null;
+ if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+ startTime = formatter.parse(startTimeStr);
+ endTime = formatter.parse(endTimeStr);
+ }
+ return Result.success(personRewardPunishmentRecordService.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId));
+ }
+
+ @ApiOperation(value = "濂栨儵璁板綍瀵煎嚭")
+ @GetMapping("/rewardPunishmentExport")
+ public void rewardPunishmentExport(Integer userId,
+ Integer departmentId,
+ String userName,
+ @RequestParam(value = "startTime",required = false) String startTimeStr,
+ @RequestParam(value = "endTime",required = false) String endTimeStr,
+ HttpServletResponse response) throws Exception {
+ Date startTime = null;
+ Date endTime = null;
+ if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+ startTime = formatter.parse(startTimeStr);
+ endTime = formatter.parse(endTimeStr);
+ }
+ List<PersonRewardPunishmentRecordExcel> data = personRewardPunishmentRecordService.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setHeader("requestType", "excel");
+ response.setHeader("Access-Control-Expose-Headers", "requestType");
+ // 璁剧疆鍗曞厓鏍兼牱寮�
+ // 淇濆瓨鍒扮涓�涓猻heet涓�
+ EasyExcel.write(response.getOutputStream())
+ .head(PersonRewardPunishmentRecordExcel.class)
+ .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+ .sheet()
+ .doWrite(data);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
new file mode 100644
index 0000000..203d834
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
@@ -0,0 +1,246 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁″垝")
+@RestController
+@RequestMapping("/personTraining")
+public class PersonTrainingController {
+
+ @Autowired
+ private PersonTrainingService personTrainingService;
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+
+ @Autowired
+ private PersonTrainingRecordService personTrainingRecordService;
+
+ @Autowired
+ private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+
+ @Autowired
+ private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+ @ApiOperation(value = "鍩硅璁″垝 瀵煎叆")
+ @PostMapping("personTrainingImport")
+ public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file, PersonTraining training) {
+ personTrainingService.personTrainingImport(file, training);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎")
+ @DeleteMapping("personTrainingDelete")
+ public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+ personTrainingService.personTrainingDelete(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鏌ヨ")
+ @GetMapping("personTrainingSelect")
+ public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, String departmentId) {
+ IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
+ return Result.success(iPage);
+ }
+
+ @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳")
+ @PostMapping("reviewAnnualPersonnelTraining")
+ public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+ personTrainingService.reviewAnnualPersonnelTraining(training);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯")
+ @PostMapping("approveAnnualPersonnelTraining")
+ public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+ personTrainingService.approveAnnualPersonnelTraining(training);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫")
+ @PostMapping("addOrUpdatePersonTrainingDetailed")
+ public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
+ if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
+ personTrainingDetailed.setState(3);
+ }
+ personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+ @DeleteMapping("deleteAnnualPlanDetailTable")
+ public Result<?> deleteAnnualPlanDetailTable(String ids) {
+ personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+ @GetMapping("queryTheAnnualPlanDetailsTable")
+ public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName, String courseCode,
+ String trainingDate, Integer id, Integer userId) {
+ IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
+ trainingLecturerName, courseCode, trainingDate, id, userId);
+ return Result.success(iPage);
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+ @GetMapping("trainingAndAssessmentRecordsPage")
+ public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+ String userName) {
+ List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+ return Result.success(list);
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+ @PostMapping("newPersonnelAddedToTrainingRecords")
+ public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+ personTrainingRecordService.saveBatch(personTrainingRecord);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら")
+ @PostMapping("claimOfTrainingAndAssessmentRecords")
+ public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+ @RequestParam("courseId") Integer courseId) {
+ personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢")
+ @PostMapping("trainingAndAssessmentRecordsAdded")
+ public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingRecordService.trainingAndAssessmentRecordsAdded(personTrainingRecordSubmitDto);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璇勪环")
+ @PostMapping("trainingAndAssessmentRecordsEvaluate")
+ public Result<?> trainingAndAssessmentRecordsEvaluate(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+ .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+ .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment())
+ .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate())
+ .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+ @DeleteMapping("deleteTrainingAndAssessmentRecords")
+ public Result<?> deleteTrainingAndAssessmentRecords(String ids) {
+ personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
+ return Result.success();
+ }
+
+ @PostMapping("outOfFocusPreservation")
+ public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
+ personTrainingRecordService.updateById(personTrainingRecord);
+ return Result.success();
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @return
+ */
+
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝")
+ @GetMapping("/exportPersonTraining")
+ public void exportPersonTraining(Integer id, HttpServletResponse response){
+ personTrainingService.exportPersonTraining(id, response);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+ @GetMapping("/exportPersonTrainingRecord")
+ public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+ personTrainingService.exportPersonTrainingRecord(id, response);
+ }
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+ * @param trainingDetailedId
+ * @param file
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鏂板")
+ @PostMapping("/uploadTrainingDetailedFile")
+ public Result<?> uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+ return Result.success(personTrainingService.uploadTrainingDetailedFile(trainingDetailedId, file));
+ }
+
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃")
+ @GetMapping("/getTrainingDetailedFileList")
+ public Result<List<PersonTrainingDetailedFile>> getTrainingDetailedFileList(Integer trainingDetailedId){
+ return Result.success(personTrainingDetailedFileMapper.selectList(Wrappers.<PersonTrainingDetailedFile>lambdaQuery()
+ .eq(PersonTrainingDetailedFile::getTrainingDetailedId, trainingDetailedId)));
+ }
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎")
+ @DeleteMapping("/delTrainingDetailedFileList")
+ public Result delTrainingDetailedFileList(Integer detailedFileId){
+ return Result.success(personTrainingDetailedFileMapper.deleteById(detailedFileId));
+ }
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ @ApiOperation(value = "鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅")
+ @GetMapping("/getThisYearTrainingDetailed")
+ public Result<List<PersonTrainingDetailed>> getThisYearTrainingDetailed(){
+ return Result.success(personTrainingService.getThisYearTrainingDetailed());
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
new file mode 100644
index 0000000..5385869
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
@@ -0,0 +1,59 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁板綍")
+@RestController
+@RequestMapping("/personTrainingRecord")
+public class PersonTrainingRecordController {
+
+ @Autowired
+ private PersonTrainingRecordService personTrainingRecordService;
+
+ @ApiOperation(value = "鏌ヨ浜哄憳 鍩硅璁板綍")
+ @GetMapping("trainingSelectTrainingRecord")
+ public Result<IPage<PersonTrainingRecordListDto>> trainingSelectTrainingRecord(Page page, String userName, Integer userId, Integer departmentId) {
+ IPage<PersonTrainingRecordListDto> iPage = personTrainingRecordService.personnelTrainingPersonnel(page, userName, userId, departmentId);
+ return Result.success(iPage);
+ }
+
+
+ @ApiOperation(value = "鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍")
+ @GetMapping("queryPersonnelDetails")
+ public Result<IPage<TrainingRecordPersonDetailedDto>> queryPersonnelDetails(Page page, Integer userId, Integer trainingDate) {
+ IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetailsOfUserIdAndYear(page, userId, trainingDate); // 鏂板鏍规嵁骞翠唤鏌ヨ
+ return Result.success(iPage);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁板綍
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁板綍")
+ @GetMapping("/exportTrainingRecord")
+ public void exportTrainingRecord(Integer userId, Integer trainingDate, HttpServletResponse response){
+ personTrainingRecordService.exportTrainingRecordAddTrainingDate(userId, trainingDate, response);// 鏂板鏍规嵁骞翠唤鏌ヨ
+
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
new file mode 100644
index 0000000..ffdbdcc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
@@ -0,0 +1,65 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 13:52:52
+ * Description:
+ */
+@Data
+public class PersonBasicInfoDetailsDto {
+
+ @ApiModelProperty("鐢ㄦ埛id")
+ private Integer userId;
+
+ @ApiModelProperty("鐢ㄦ埛濮撳悕")
+ private String name;
+
+ @ApiModelProperty("鍏ヨ亴鏃堕棿")
+ private String entryTimeStr;
+
+ @ApiModelProperty("瀹為檯瀹炰範缁撴潫")
+ private String endPracticalPracticeStr;
+
+ @ApiModelProperty("绫嶈疮")
+ private String nativePlace;
+
+ @ApiModelProperty("韬唤璇佸彿")
+ private String identityCard;
+
+ @ApiModelProperty("韬唤璇佸湴鍧�")
+ private String idAddress;
+
+ @ApiModelProperty("鐢ㄦ埛鎵嬫満鍙�")
+ private String phone;
+
+ @ApiModelProperty("姣曚笟闄㈡牎")
+ private String graduatedInstitutions1;
+
+ @ApiModelProperty("涓撲笟")
+ private String major1;
+
+ @ApiModelProperty("姣曚笟鏃堕棿1")
+ private LocalDateTime graduationTime1;
+
+ @ApiModelProperty("鏈�楂樺鍘�")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("鏈�楂樺浣�")
+ private String highestDegree;
+
+ @ApiModelProperty("鑱岀О")
+ private String professionalTitle;
+
+ // 鑱屼笟鑳藉姏
+
+ @ApiModelProperty("绱ф�ヨ仈绯讳汉")
+ private String emergencyContact;
+
+ @ApiModelProperty("绱ф�ヨ仈绯讳汉鐢佃瘽")
+ private String emergencyContactPhone;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java
new file mode 100644
index 0000000..b5cd643
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java
@@ -0,0 +1,47 @@
+package com.ruoyi.personnel.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@ExcelIgnoreUnannotated
+public class PersonBasicInfoDto extends PersonBasicInfo {
+ @ApiModelProperty(value = "璐﹀彿")
+ @ExcelProperty("鍛樺伐缂栧彿")
+ private String account;
+
+ @ApiModelProperty(value = "濮撳悕")
+ @ExcelProperty("濮撳悕")
+ private String name;
+
+ @ApiModelProperty(value = "濮撳悕(鑻辨枃)")
+ private String nameEn;
+
+ @ApiModelProperty(value = "骞撮緞")
+ private Integer age;
+
+ @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+ @ExcelProperty("鎵嬫満鍙�")
+ private String phone;
+
+ @ApiModelProperty(value = "閭")
+ private String email;
+
+ @ApiModelProperty(value = "閮ㄩ棬")
+ private String department;
+
+ @ApiModelProperty(value = "lims缁勭粐鏋舵瀯")
+ private String departLimsId;
+
+ @ApiModelProperty(value = "绛惧悕鐓х墖鍦板潃")
+ private String signatureUrl;
+
+ @ApiModelProperty(value = "鑷韩鐓х墖鍦板潃")
+ private String pictureUrl;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
new file mode 100644
index 0000000..13cd08d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/1/14
+ */
+@Data
+public class PersonBasicInfoWorkDto extends PersonBasicInfoWork {
+
+ @ApiModelProperty("濉厖浣跨敤")
+ private String fill;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
new file mode 100644
index 0000000..d3cb18e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import lombok.Data;
+
+@Data
+public class PersonCommunicationAbilityDto extends PersonCommunicationAbility {
+
+ private String userName;
+
+ private String account;
+
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java
new file mode 100644
index 0000000..096f8d3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import lombok.Data;
+
+@Data
+public class PersonJobResponsibilitiesDto extends PersonJobResponsibilities {
+
+ private String incumbentName;
+
+ private String supervisorName;
+
+ private String departLimsName;
+
+ private String account;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
new file mode 100644
index 0000000..5e77690
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonPersonnelCapacityDto extends PersonPersonnelCapacity {
+
+ @ApiModelProperty("鎿嶄綔浜哄鍚�")
+ private String confirmOperatingPersonnelName;
+
+ @ApiModelProperty("浜哄憳濮撳悕")
+ private String userName;
+
+ @ApiModelProperty("宀椾綅鍚嶇О")
+ private String postName;
+
+ @ApiModelProperty("宀椾綅鑱岃矗")
+ private String responsibilities;
+
+ @ApiModelProperty("宸ヤ綔缁忓巻")
+ private String placeWork;
+
+ @ApiModelProperty("涓撲笟")
+ private String major;
+
+ @ApiModelProperty(value = "鑱岀О")
+ private String professionalTitle;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
new file mode 100644
index 0000000..20526b6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
@@ -0,0 +1,101 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/28
+ */
+@Data
+public class PersonPersonnelCapacityExportDto extends PersonPersonnelCapacity {
+
+ @ApiModelProperty("宀椾綅鍚嶇О")
+ private String postName;
+
+ @ApiModelProperty("浜哄憳濮撳悕")
+ private String userName;
+
+ @ApiModelProperty("瀛﹀巻")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("涓撲笟")
+ private String major;
+
+ @ApiModelProperty("鑱岀О")
+ private String professionalTitle;
+
+ @ApiModelProperty("宸ヤ綔缁忓巻")
+ private String placeWork;
+
+ @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String academicConformNot1 = "鈻�";
+ @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String academicConformNot2 = "鈻�";
+ @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String academicConformNot3 = "鈻�";
+
+ @ApiModelProperty("鐩稿叧骞撮檺 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String relatedYearsConformNot1 = "鈻�";
+ @ApiModelProperty("鐩稿叧骞撮檺 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String relatedYearsConformNot2 = "鈻�";
+ @ApiModelProperty("鐩稿叧骞撮檺 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String relatedYearsConformNot3 = "鈻�";
+
+ @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String relatedTrainingConformNot1 = "鈻�";
+ @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String relatedTrainingConformNot2 = "鈻�";
+ @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String relatedTrainingConformNot3 = "鈻�";
+
+ @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String relevantExperienceConformNot1 = "鈻�";
+ @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String relevantExperienceConformNot2 = "鈻�";
+ @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String relevantExperienceConformNot3 = "鈻�";
+
+ @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String workLicenseConformNot1 = "鈻�";
+ @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String workLicenseConformNot2 = "鈻�";
+ @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String workLicenseConformNot3 = "鈻�";
+
+ @ApiModelProperty("宀椾綅鑱岃矗1(鐔熸倝鏈矖浣嶇殑浜у搧妫�娴嬫牱鍝佸埗澶囧拰鐩稿叧浜у搧鍩虹鐭ヨ瘑)")
+ private String jobResponsibilities1 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗2(鐔熸倝鏈矖浣嶆牱鍝佹娴嬫祦绋�)")
+ private String jobResponsibilities2 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗3(姝g‘鐔熺粌鎿嶄綔鏈矖浣嶄华琛ㄨ澶�)")
+ private String jobResponsibilities3 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗4(鐔熸倝鏈矖浣嶇浉鍏虫娴嬫爣鍑�)")
+ private String jobResponsibilities4 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗5(鐔熸倝鏈矖浣嶄骇鍝佹�ц兘鍙婄粨鏋滃垽鏂�佸垎鏋�)")
+ private String jobResponsibilities5 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗6(瀹屾垚鐩稿簲鐨勫巶楠屻�佽璇�)")
+ private String jobResponsibilities6 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗7(缂栧啓鐩稿叧妫�娴嬫墜椤�)")
+ private String jobResponsibilities7 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗8(浜嗚В浠櫒璁惧鍩烘湰缁撴瀯涓庣畝鍗曠淮鎶や繚鍏�)")
+ private String jobResponsibilities8 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗9(鍏峰鎶�鑳藉煿璁殑鑳藉姏)")
+ private String jobResponsibilities9 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗10(鍏峰妫�娴嬩华鍣ㄦ敼閫犺兘鍔�)")
+ private String jobResponsibilities10 = "鈻�";
+
+ @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚�)")
+ private String jobResponsibilitiesConformNot1 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+ private String jobResponsibilitiesConformNot2 = "鈻�";
+ @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+ private String jobResponsibilitiesConformNot3 = "鈻�";
+
+ @ApiModelProperty("缁煎悎璇勪环1(鍙儨浠昏宀椾綅)")
+ private String comprehensiveAssessment1 = "鈻�";
+ @ApiModelProperty("缁煎悎璇勪环2(鍙竟鍩硅杈逛笂宀�)")
+ private String comprehensiveAssessment2 = "鈻�";
+ @ApiModelProperty("缁煎悎璇勪环3(涓嶈儨浠昏宀椾綅)")
+ private String comprehensiveAssessment3 = "鈻�";
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java
new file mode 100644
index 0000000..33dd76c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import lombok.Data;
+
+@Data
+public class PersonPostAuthorizationRecordDto extends PersonPostAuthorizationRecord {
+
+ private String userName;
+
+ private String account;
+
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java
new file mode 100644
index 0000000..5be270b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import lombok.Data;
+
+@Data
+public class PersonRewardPunishmentRecordDto extends PersonRewardPunishmentRecord {
+
+ private String userName;
+
+ private String account;
+
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
new file mode 100644
index 0000000..2c6f9aa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
+
+ @ApiModelProperty("涓惧姙閮ㄩ棬鍚嶇О")
+ private String holdingDepartmentName;
+
+ @ApiModelProperty("鍩硅璁插笀鍚嶇О")
+ private String trainingLecturerName;
+
+ @ApiModelProperty("褰撳墠鐧诲綍浜烘槸鍚﹁棰�")
+ private Boolean whetherClaim;
+
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDateString;
+
+ // 瀵煎嚭浣跨敤
+ @TableField(select = false, exist = false)
+ @ApiModelProperty("搴忓彿(瀵煎嚭浣跨敤)")
+ private Integer index;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
new file mode 100644
index 0000000..c6ad50b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTraining;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "PersonTrainingDto瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTrainingDto extends PersonTraining {
+
+ @ApiModelProperty("缂栧埗浜哄鍚�")
+ private String compilerName;
+
+ @ApiModelProperty("瀹℃牳浜哄鍚�")
+ private String reviewerName;
+
+ @ApiModelProperty("鎵瑰噯浜哄鍚�")
+ private String approverName;
+
+ @ApiModelProperty("鍒涘缓浜哄鍚�")
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
new file mode 100644
index 0000000..445bef7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingRecordDto extends PersonTrainingRecord {
+ @ApiModelProperty(value = "濮撳悕")
+ private String userName;
+
+ @ApiModelProperty(value = "宸ュ彿")
+ private String account;
+
+ @ApiModelProperty(value = "瑙掕壊")
+ private String roleName;
+
+ @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+ private String phone;
+
+ @ApiModelProperty(value = "閮ㄩ棬")
+ private String department;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
new file mode 100644
index 0000000..da61ed1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
@@ -0,0 +1,37 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonTrainingRecordListDto {
+
+ @ApiModelProperty(value = "鐢ㄦ埛id")
+ private Integer userId;
+
+ @ApiModelProperty("鍛樺伐缂栧彿")
+ private String account;
+
+ @ApiModelProperty("鐢ㄦ埛濮撳悕")
+ private String name;
+
+ @ApiModelProperty("鎵�鍦ㄩ儴闂�")
+ private String departLimsName;
+
+ @ApiModelProperty("鑱岀О")
+ private String professionalTitle;
+
+ @ApiModelProperty("鏈�楂樺鍘�")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+ private LocalDateTime unitTime;
+
+ @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+ private String unitTimeSting;
+
+ @ApiModelProperty("涓撲笟")
+ private String major1;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
new file mode 100644
index 0000000..e24f5d2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class PersonTrainingRecordSubmitDto {
+
+ @ApiModelProperty("骞村害璁″垝鏄庣粏ID")
+ private Integer trainingDetailedId;
+
+ @ApiModelProperty("鍩硅鍦扮偣")
+ private String placeTraining;
+
+ @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+ private LocalDate openingTime;
+
+ @ApiModelProperty("鑰冩牳鏂瑰紡")
+ private String assessmentMethod;
+
+ @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+ private String comprehensiveAssessment;
+
+ @ApiModelProperty("璇勪环浜�")
+ private Integer assessmentUserId;
+
+ @ApiModelProperty("璇勪环鏃堕棿")
+ private LocalDate assessmentDate;
+
+ private Integer state;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
new file mode 100644
index 0000000..320af2a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/25
+ */
+@Data
+public class TrainingRecordExportDto {
+
+ @ApiModelProperty("鐢ㄦ埛鍚嶇О1")
+ private String userName1;
+
+ @ApiModelProperty("閮ㄩ棬1")
+ private String department1;
+
+ @ApiModelProperty("鑰冩牳缁撴灉1")
+ private String examinationResults1;
+
+ @ApiModelProperty("鐢ㄦ埛鍚嶇О2")
+ private String userName2;
+
+ @ApiModelProperty("閮ㄩ棬1")
+ private String department2;
+
+ @ApiModelProperty("鑰冩牳缁撴灉1")
+ private String examinationResults2;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
new file mode 100644
index 0000000..23f0a02
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TrainingRecordPersonDetailedDto {
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDateString;
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDate;
+
+ @ApiModelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ApiModelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ApiModelProperty("鑰冩牳缁撴灉")
+ private String examinationResults;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java
new file mode 100644
index 0000000..856b6f4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.common.core.domain.entity.User;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserPageDto extends User {
+
+ @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+ private String createUserName;
+
+ @ApiModelProperty(value = "鏇存柊鐢ㄦ埛")
+ private String updateUserName;
+
+ @ApiModelProperty(value = "瑙掕壊")
+ private String roleName;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java
new file mode 100644
index 0000000..84456f3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java
@@ -0,0 +1,34 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonRewardPunishmentRecordExcel {
+ @ExcelProperty("鍛樺伐缂栧彿")
+ private String account;
+
+ @ExcelProperty("濮撳悕")
+ private String userName;
+
+ @ExcelProperty("濂栨儵绾у埆")
+ private String rewardPunishLevel;
+
+ @ExcelProperty("濂栨儵鍚嶇О")
+ private String rewardPunishName;
+
+ @ExcelProperty("濂栨儵鏃堕棿")
+ private String rewardPunishTime;
+
+ @ExcelProperty("濂栨儵鍗曚綅")
+ private String rewardPunishWorkUnit;
+
+ @ExcelProperty("濂栨儵鍐呭")
+ private String rewardPunishContent;
+
+ @ExcelProperty("鍒涘缓鏃堕棿")
+ private String createTime;
+
+ @ExcelProperty("鍒涘缓浜�")
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
new file mode 100644
index 0000000..9effe23
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
@@ -0,0 +1,42 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
+
+ private Integer planId;
+
+ private static final int BATCH_COUNT = 1000;
+ List<PersonTrainingDetailedUpload> list = new ArrayList<>();
+
+ private PersonTrainingDetailedService personTrainingDetailedService;
+
+ public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService) {
+ this.personTrainingDetailedService = personTrainingDetailedService;
+ }
+
+ @Override
+ public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
+ list.add(data);
+ if (list.size() >= BATCH_COUNT) {
+ save();
+ list.clear();
+ }
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+ save();
+ }
+
+ private void save() {
+ personTrainingDetailedService.importExcel(list, this.planId);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
new file mode 100644
index 0000000..7bc5876
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+ @ExcelProperty("鍩硅鐩爣")
+ private String trainingObjectives;
+
+ @ExcelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ExcelProperty("鍩硅鏂瑰紡")
+ private String trainingMode;
+
+ @ExcelProperty("鍙傚姞瀵硅薄")
+ private String participants;
+
+ @ExcelProperty("涓惧姙閮ㄩ棬")
+ private String holdingDepartment;
+
+ @ExcelProperty("鍩硅璁插笀")
+ private String trainingLecturerName;
+
+ @ExcelProperty("鍩硅鏃堕棿")
+ private String trainingDate;
+
+ @ExcelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ExcelProperty("澶囨敞")
+ private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java
new file mode 100644
index 0000000..9fee604
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AnnexMapper extends BaseMapper<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java
new file mode 100644
index 0000000..fb0e2f5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+public interface PersonBasicInfoFileMapper extends BaseMapper<PersonBasicInfoFile> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
new file mode 100644
index 0000000..f23ba5f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
@@ -0,0 +1,42 @@
+package com.ruoyi.personnel.mapper;
+
+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.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+public interface PersonBasicInfoMapper extends BaseMapper<PersonBasicInfo> {
+
+ List<DepartmentDto> selectLimsUser();
+
+ PersonBasicInfoDto getCNASPersonnelInfo(Integer userId);
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅鍒嗛〉鏌ヨ
+ * @param page
+ * @param name
+ * @param departmentId
+ * @return
+ */
+ IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, String name, Integer departmentId);
+
+ /**
+ * 瀵煎嚭鏌ヨ浜哄憳淇℃伅
+ * @param userId
+ * @return
+ */
+ Map<String, Object> selectexportPersonBasic(Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java
new file mode 100644
index 0000000..df8d2d4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+public interface PersonBasicInfoWorkMapper extends BaseMapper<PersonBasicInfoWork> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
new file mode 100644
index 0000000..0888b35
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+public interface PersonCommunicationAbilityMapper extends BaseMapper<PersonCommunicationAbility> {
+
+ IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, @Param("departLimsId") Integer departLimsId, @Param("userId") Integer userId, @Param("userName") String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
new file mode 100644
index 0000000..a46e3bf
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+public interface PersonJobResponsibilitiesMapper extends BaseMapper<PersonJobResponsibilities> {
+
+ IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
new file mode 100644
index 0000000..b2bb671
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+public interface PersonPersonnelCapacityMapper extends BaseMapper<PersonPersonnelCapacity> {
+
+ IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
+
+ /**
+ * 鏌ヨ浜哄憳鑳藉姏鎺ュ彛
+ * @param id
+ * @return
+ */
+ PersonPersonnelCapacityExportDto selectExportPersonnelCapacity(@Param("id") Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
new file mode 100644
index 0000000..1121811
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+public interface PersonPostAuthorizationRecordMapper extends BaseMapper<PersonPostAuthorizationRecord> {
+
+ IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
new file mode 100644
index 0000000..a77cb79
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+public interface PersonRewardPunishmentRecordMapper extends BaseMapper<PersonRewardPunishmentRecord> {
+
+ IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, Integer userId, String userName, Date startTime, Date endTime, Integer departmentId);
+
+ List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
new file mode 100644
index 0000000..88b2531
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+public interface PersonTrainingDetailedFileMapper extends BaseMapper<PersonTrainingDetailedFile> {
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
new file mode 100644
index 0000000..47c397b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,48 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
+
+ IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName,
+ String courseCode, String trainingDate,
+ Integer id,
+ Integer userId,
+ Integer loginUserId);
+
+ /**
+ * 鏍规嵁涓昏〃id鏌ヨ璇︽儏
+ * @param trainingId
+ * @return
+ */
+ List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
+
+ /**
+ * 鏌ヨ璇︾粏
+ * @param id
+ * @return
+ */
+ PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
new file mode 100644
index 0000000..f5dd8a6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
+
+ IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departLimsId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
new file mode 100644
index 0000000..a10ed81
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
@@ -0,0 +1,67 @@
+package com.ruoyi.personnel.mapper;
+
+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.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordMapper extends BaseMapper<PersonTrainingRecord> {
+
+ List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
+
+ IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId);
+
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId);
+
+ /**
+ * 鏍规嵁璇︽儏id鏌ヨ鍩硅浜哄憳
+ * @param trainingDetailedId
+ * @return
+ */
+ List<PersonTrainingRecordDto> selectListByTrainingDetailedId(@Param("trainingDetailedId") Integer trainingDetailedId);
+
+ /**
+ * 鏌ヨ浜哄憳淇℃伅
+ * @param userId
+ * @return
+ */
+ PersonTrainingRecordListDto selectUserTraining(@Param("userId") Integer userId);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鏌ヨ鍩硅璁板綍
+ * @param userId
+ * @return
+ */
+ List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtos(Integer userId);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+ * @param page
+ * @param userId
+ * @param year
+ * @return
+ */
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭
+ * @param userId
+ * @param trainingDate
+ * @return
+ */
+ List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtosByTrainingDate(Integer userId, Integer year);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
new file mode 100644
index 0000000..bbf2017
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
@@ -0,0 +1,48 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("cnas_annex")
+@ApiModel("浜哄憳鍩烘湰淇℃伅闄勪欢琛�")
+public class Annex implements Serializable {
+
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "user琛╥d")
+ private Integer userId;
+
+ @ApiModelProperty(value = "璇佷欢鍙�")
+ private String idNumber;
+
+ @ApiModelProperty(value = "鍙戣瘉鍗曚綅")
+ private String issueUnit;
+
+ @ApiModelProperty(value = "鏂囦欢鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty(value = "绾у埆")
+ private String level;
+
+ @ApiModelProperty(value = "鏈夋晥鏈�")
+ private String periodValidity;
+
+ @ApiModelProperty(value = "娣诲姞鏃堕棿")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "澶嶅嵃浠�")
+ private String copy;
+
+ @ApiModelProperty(value = "鍘熶欢")
+ private String original;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
new file mode 100644
index 0000000..abf3880
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
@@ -0,0 +1,156 @@
+package com.ruoyi.personnel.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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-08-30 09:19:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info")
+@ApiModel(value = "PersonBasicInfo瀵硅薄", description = "")
+public class PersonBasicInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("褰撳墠鐘舵��")
+ private String currentState;
+
+ @ApiModelProperty("鑱岀О")
+ @ExcelProperty("鑱岀О")
+ private String professionalTitle;
+
+ @ApiModelProperty("鎬у埆")
+ private String sex;
+
+ @ApiModelProperty("浜哄憳鍒嗙被")
+ private String personnelClassification;
+
+ @ApiModelProperty("鍑虹敓鏃ユ湡")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime dateBirth;
+
+ @ApiModelProperty("韬唤璇佸彿")
+ @ExcelProperty("璇佷欢鍙风爜")
+ private String identityCard;
+
+ @ApiModelProperty("姘戞棌")
+ private String nation;
+
+ @ApiModelProperty("鏀挎不闈㈣矊")
+ private String politicalStatus;
+
+ @ApiModelProperty("鏈�楂樺鍘�")
+ @ExcelProperty("鏈�楂樺鍘�")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("姣曚笟鏃堕棿1")
+ @ExcelProperty("姣曚笟鏃堕棿")
+ private LocalDateTime graduationTime1;
+
+ @ApiModelProperty("姣曚笟闄㈡牎1")
+ @ExcelProperty("姣曚笟闄㈡牎")
+ private String graduatedInstitutions1;
+
+ @ApiModelProperty("涓撲笟1")
+ @ExcelProperty("鎵�瀛︿笓涓�")
+ private String major1;
+
+ @ApiModelProperty("姣曚笟鏃堕棿2")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime graduationTime2;
+
+ @ApiModelProperty("姣曚笟闄㈡牎2")
+ private String graduatedInstitutions2;
+
+ @ApiModelProperty("涓撲笟2")
+ private String major2;
+
+ @ApiModelProperty("鎵嬫満鍙�")
+ private String telephone;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+
+ @ApiModelProperty("鐢ㄦ埛琛紙user锛塱d")
+ private Integer userId;
+
+ @ApiModelProperty("鍏徃鍚嶇О")
+ private String corporateName;
+
+ @ApiModelProperty("宀椾綅鍚嶇О")
+ private String postName;
+
+ @ApiModelProperty("鍏ラ泦鍥㈡椂闂�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ @ExcelProperty("鍏ラ泦鍥㈡椂闂�")
+ private LocalDateTime groupTime;
+
+ @ApiModelProperty("鍔冲姩鍏崇郴")
+ private Integer laborRelations;
+
+ @ApiModelProperty("宸ヤ綔鏃堕棿")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime workingTime;
+
+ @ApiModelProperty("鍚堝悓鏈夋晥鏈�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime contractLifeTime;
+
+ @ApiModelProperty("绫嶈疮")
+ @ExcelProperty("绫嶈疮")
+ private String nativePlace;
+
+ @ApiModelProperty("璇佷欢鏈夋晥鏈�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime validityPeriod;
+
+ @ApiModelProperty("濠氬Щ鐘跺喌")
+ private Integer maritalStatus;
+
+ @ApiModelProperty("璇佷欢鍦板潃")
+ @ExcelProperty("璇佷欢鍦板潃")
+ private String idAddress;
+
+ @ApiModelProperty("璇佷欢璇︾粏鍦板潃")
+ private String idDetailAddress;
+
+ @ApiModelProperty("鍏ュ厷/鍥㈡椂闂�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+ private LocalDateTime dumplingTime;
+
+ @ApiModelProperty("鏈�楂樺浣�")
+ @ExcelProperty("鏈�楂樺浣�")
+ private String highestDegree;
+
+ @ApiModelProperty("鏈�鍚庢洿鏂版椂闂�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime lastUpdateTime;
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
new file mode 100644
index 0000000..0b366f8
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
@@ -0,0 +1,58 @@
+package com.ruoyi.personnel.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 2025-01-09 05:28:55
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_file")
+@ApiModel(value = "PersonBasicInfoFile瀵硅薄", description = "浜哄憳鍩烘湰淇℃伅闄勪欢")
+public class PersonBasicInfoFile implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "basic_info_file_id", type = IdType.AUTO)
+ private Integer basicInfoFileId;
+
+ @ApiModelProperty("浜哄憳鍩烘湰淇℃伅id")
+ private Integer userId;
+
+ @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-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
new file mode 100644
index 0000000..2d15afa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
@@ -0,0 +1,53 @@
+package com.ruoyi.personnel.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 2025-01-09 05:45:04
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_work")
+@ApiModel(value = "PersonBasicInfoWork瀵硅薄", description = "浜哄憳鍩烘湰淇℃伅")
+public class PersonBasicInfoWork implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "basic_info_work_id", type = IdType.AUTO)
+ private Integer basicInfoWorkId;
+
+ @ApiModelProperty("浜哄憳id")
+ private Integer userId;
+
+ @ApiModelProperty("宸ヤ綔缁忓巻")
+ private String workExperience;
+
+ @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-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
new file mode 100644
index 0000000..4df192d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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-10-09 12:00:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_communication_ability")
+@ApiModel(value = "PersonCommunicationAbility瀵硅薄", description = "娌熼�氳褰�")
+public class PersonCommunicationAbility implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("娌熼�氫汉id")
+ private String userId;
+
+ @ApiModelProperty("娌熼�氭椂闂�")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime communicationTime;
+
+ @ApiModelProperty("娌熼�氬湴鐐�")
+ private String communicationPlace;
+
+ @ApiModelProperty("娌熼�氬唴瀹�")
+ private String communicationContent;
+
+ @ApiModelProperty("鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
new file mode 100644
index 0000000..55536fb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
@@ -0,0 +1,78 @@
+package com.ruoyi.personnel.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-10-09 02:07:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_job_responsibilities")
+@ApiModel(value = "PersonJobResponsibilities瀵硅薄", description = "宀椾綅鑱岃矗")
+public class PersonJobResponsibilities implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("1宀椾綅鍚嶇О")
+ private String postName;
+
+ @ApiModelProperty("1宸ヤ綔鐩爣")
+ private String jobObjective;
+
+ @ApiModelProperty("1宀椾綅鑱岃矗")
+ private String jobResponsibilities;
+
+ @ApiModelProperty("1浠昏亴浜篿d")
+ private String incumbentId;
+
+ @ApiModelProperty("1 鎻愪氦鎿嶄綔浜�")
+ private String submittingOperator;
+
+ @ApiModelProperty("1鎻愪氦鏃ユ湡")
+ private LocalDateTime submittingDate;
+
+ @ApiModelProperty("2 浠昏亴浜� 涓荤id")
+ private Integer supervisorId;
+
+ @ApiModelProperty("2 浠昏亴浜� 鎿嶄綔浜�")
+ private String incumbentOperator;
+
+ @ApiModelProperty("2 浠昏亴浜� 鏃ユ湡")
+ private LocalDateTime incumbentDate;
+
+ @ApiModelProperty("3 涓荤 鎿嶄綔浜�")
+ private String supervisorOperator;
+
+ @ApiModelProperty("3 涓荤 鏃ユ湡")
+ private LocalDateTime supervisorDate;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("褰撳墠鐘舵��")
+ private String currentState;
+
+ @ApiModelProperty(value = "鍒涘缓鏃ユ湡 / 鎻愪氦鏃ユ湡", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("褰撳墠璐熻矗浜�")
+ private String currentResponsible;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
new file mode 100644
index 0000000..b7103f0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
@@ -0,0 +1,114 @@
+package com.ruoyi.personnel.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-10-10 11:26:18
+ */
+@Getter
+@Setter
+@TableName("cnas_person_personnel_capacity")
+@ApiModel(value = "PersonPersonnelCapacity瀵硅薄", description = "浜哄憳鑳藉姏")
+public class PersonPersonnelCapacity implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("瀛﹀巻")
+ private String academicDegree;
+
+ @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer academicConformNot;
+
+ @ApiModelProperty("瀛﹀巻 澶囨敞")
+ private String academicRemarks;
+
+ @ApiModelProperty("鐩稿叧骞撮檺")
+ private String relatedYears;
+
+ @ApiModelProperty("鐩稿叧骞撮檺 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer relatedYearsConformNot;
+
+ @ApiModelProperty("鐩稿叧骞撮檺 澶囨敞")
+ private String relatedYearsRemarks;
+
+ @ApiModelProperty("鐩稿叧鍩硅")
+ private String relatedTraining;
+
+ @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer relatedTrainingConformNot;
+
+ @ApiModelProperty("鐩稿叧鍩硅 澶囨敞")
+ private String relatedTrainingRemarks;
+
+ @ApiModelProperty("鐩稿叧缁忛獙")
+ private String relevantExperience;
+
+ @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer relevantExperienceConformNot;
+
+ @ApiModelProperty("鐩稿叧缁忛獙 澶囨敞")
+ private String relevantExperienceRemarks;
+
+ @ApiModelProperty("涓婂矖璇�")
+ private String workLicense;
+
+ @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer workLicenseConformNot;
+
+ @ApiModelProperty("涓婂矖璇� 澶囨敞")
+ private String workLicenseRemarks;
+
+ @ApiModelProperty("宀椾綅鑱岃矗")
+ private String jobResponsibilities;
+
+ @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+ private Integer jobResponsibilitiesConformNot;
+
+ @ApiModelProperty("宀椾綅鑱岃矗 澶囨敞")
+ private String jobResponsibilitiesRemarks;
+
+ @ApiModelProperty("缁煎悎璇勪环")
+ private String comprehensiveAssessment;
+
+ @ApiModelProperty("2 纭浜� userId涓婚敭")
+ private Integer confirmOperatingPersonnelId;
+
+ @ApiModelProperty("2 纭浜� 鏃ユ湡")
+ private LocalDateTime confirmDate;
+
+ @ApiModelProperty(value = "鍒涘缓鏃ユ湡", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏇存柊鏃ユ湡", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "鍒涘缓浜�", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "鏇存柊浜�", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "浜哄憳濮撳悕 id")
+ private Integer userId;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
new file mode 100644
index 0000000..f341b83
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
@@ -0,0 +1,74 @@
+package com.ruoyi.personnel.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-10-09 10:48:17
+ */
+@Getter
+@Setter
+@TableName("cnas_person_post_authorization_record")
+@ApiModel(value = "PersonPostAuthorizationRecord瀵硅薄", description = "浠昏亴鎺堟潈璁板綍")
+public class PersonPostAuthorizationRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("璇佷功缂栧彿")
+ private String certificateNumber;
+
+ @ApiModelProperty("琚换鑱屼汉鍛榠d")
+ private String userId;
+
+ @ApiModelProperty("浠昏亴宀椾綅")
+ private String post;
+
+ @ApiModelProperty("鎿嶄綔绫诲瀷")
+ private String operationType;
+
+ @ApiModelProperty("鍘熸枃浠跺悕绉�")
+ private String fileName;
+
+ @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+ private String systemFileName;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "鏇存柊浜篿d",hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鐞嗚鐭ヨ瘑鑰冭瘯鎴愮哗")
+ private String num1;
+
+ @ApiModelProperty("鎿嶄綔鎶�鑳借�冭瘯鎴愮哗")
+ private String num2;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
new file mode 100644
index 0000000..ab8bea1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.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-10-08 11:25:02
+ */
+@Getter
+@Setter
+@TableName("cnas_person_reward_punishment_record")
+@ApiModel(value = "PersonRewardPunishmentRecord瀵硅薄", description = "濂栨儵璁板綍")
+public class PersonRewardPunishmentRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("濂栨儵绾у埆")
+ private String rewardPunishLevel;
+
+ @ApiModelProperty("濂栨儵鍚嶇О")
+ private String rewardPunishName;
+
+ @ApiModelProperty("濂栨儵鏃堕棿")
+ private LocalDateTime rewardPunishTime;
+
+ @ApiModelProperty("濂栨儵鍗曚綅")
+ private String rewardPunishWorkUnit;
+
+ @ApiModelProperty("濂栨儵鍐呭")
+ private String rewardPunishContent;
+
+ @ApiModelProperty("鐢ㄦ埛id")
+ private Integer userId;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "鍒涘缓浜�", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
new file mode 100644
index 0000000..526d947
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
@@ -0,0 +1,83 @@
+package com.ruoyi.personnel.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-10-11 01:11:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training")
+@ApiModel(value = "PersonTraining瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTraining implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鏂囦欢鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("璁″垝骞翠唤")
+ private String planYear;
+
+ @ApiModelProperty("缂栧埗浜篿d")
+ private Integer compilerId;
+
+ @ApiModelProperty("缂栧埗鏃ユ湡")
+ private LocalDateTime compilationDate;
+
+ @ApiModelProperty("瀹℃牳浜篿d")
+ private Integer reviewerId;
+
+ @ApiModelProperty("瀹℃牳鏃ユ湡")
+ private LocalDateTime auditDate;
+
+ @ApiModelProperty("瀹℃牳鐘舵��")
+ private Integer reviewerStatus;
+
+ @ApiModelProperty("瀹℃牳澶囨敞")
+ private String auditRemarks;
+
+ @ApiModelProperty("鎵瑰噯浜篿d")
+ private Integer approverId;
+
+ @ApiModelProperty("鎵瑰噯澶囨敞")
+ private String approvalRemarks;
+
+ @ApiModelProperty("鎵瑰噯鐘舵��(1锛氭壒鍑嗭紱2锛氫笉鎵瑰噯)")
+ private Integer approvalStatus;
+
+ @ApiModelProperty("鎵瑰噯鏃ユ湡")
+ private LocalDateTime approvalDate;
+
+ @ApiModelProperty("鍒涘缓鏃ユ湡")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鏇存柊鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鏇存柊浜篿d")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
new file mode 100644
index 0000000..cac8233
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,99 @@
+package com.ruoyi.personnel.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.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_detailed")
+@ApiModel(value = "PersonTrainingDetailed瀵硅薄", description = "鍩硅璁″垝璇︽儏")
+public class PersonTrainingDetailed implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("鍩硅璁″垝")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鍩硅鐩爣")
+ private String trainingObjectives;
+
+ @ApiModelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ApiModelProperty("鍩硅鏂瑰紡")
+ private String trainingMode;
+
+ @ApiModelProperty("鐘舵��(1锛氬凡瀹屾垚锛�2锛氬緟璇勪环锛�3: 鏈紑濮�)")
+ private Integer state;
+
+ @ApiModelProperty("鍙傚姞瀵硅薄")
+ private String participants;
+
+ @ApiModelProperty("涓惧姙閮ㄩ棬")
+ private String holdingDepartment;
+
+ @ApiModelProperty("鍩硅鍦扮偣")
+ private String placeTraining;
+
+ @ApiModelProperty("鍩硅璁插笀_id")
+ private Integer trainingLecturerId;
+
+ @ApiModelProperty("璁″垝鍩硅鏃ユ湡")
+ private String trainingDate;
+
+ @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+ private LocalDate openingTime;
+
+ @ApiModelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+
+ @ApiModelProperty("鍩硅璁″垝id")
+ private Integer planId;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鑰冩牳鏂瑰紡")
+ private String assessmentMethod;
+
+ @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+ private String comprehensiveAssessment;
+
+ @ApiModelProperty("璇勪环浜�")
+ private Integer assessmentUserId;
+
+ @ApiModelProperty("璇勪环鏃堕棿")
+ private LocalDate assessmentDate;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
new file mode 100644
index 0000000..cb17cdb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
@@ -0,0 +1,49 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+@Data
+@TableName("cnas_person_training_detailed_file")
+public class PersonTrainingDetailedFile {
+
+ @TableId(type = IdType.AUTO)
+ private Integer detailedFileId;
+
+ @ApiModelProperty("浜哄憳浣犲煿璁鍒掕鎯卛d")
+ private Integer trainingDetailedId;
+
+ @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+ private Integer type;
+
+ @ApiModelProperty("闄勪欢璺緞")
+ private String fileUrl;
+
+ @ApiModelProperty("闄勪欢鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("鍒涘缓浜�")
+ private Integer createUser;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ private Date createTime;
+
+ @ApiModelProperty("淇敼浜�")
+ private Integer updateUser;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ private Date updateTime;
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
new file mode 100644
index 0000000..593941b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
@@ -0,0 +1,41 @@
+package com.ruoyi.personnel.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;
+
+/**
+ * <p>
+ * 鍩硅璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_record")
+@ApiModel(value = "PersonTrainingRecord瀵硅薄", description = "鍩硅璁板綍")
+public class PersonTrainingRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "training_record_id", type = IdType.AUTO)
+ private Integer trainingRecordId;
+
+ @ApiModelProperty("鐢ㄦ埛琛ㄦ牸锛坲ser锛変富閿�")
+ private Integer userId;
+
+ @ApiModelProperty("鍩硅璁″垝璇︽儏 - 瀛� id")
+ private Integer courseId;
+
+ @ApiModelProperty("鑰冩牳缁撴灉")
+ private String examinationResults;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java
new file mode 100644
index 0000000..8de7b15
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.Annex;
+
+public interface AnnexService extends IService<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java
new file mode 100644
index 0000000..1fb5ba6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+public interface PersonBasicInfoFileService extends IService<PersonBasicInfoFile> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
new file mode 100644
index 0000000..fcc4d69
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
@@ -0,0 +1,45 @@
+package com.ruoyi.personnel.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.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+public interface PersonBasicInfoService extends IService<PersonBasicInfo> {
+
+ List<DepartmentDto> selectCNSAPersonTree();
+
+ Map<String,Object> getCNASPersonnelInfo(Integer userId);
+
+ void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto);
+
+ IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId);
+
+ void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception;
+
+ String exportPersonBasicInfoById(Integer id, HttpServletResponse response);
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+ * @param basicInfoId
+ * @param file
+ * @return
+ */
+ boolean uploadBasicInfoFile(Integer basicInfoId, MultipartFile file);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java
new file mode 100644
index 0000000..cfd944f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+public interface PersonBasicInfoWorkService extends IService<PersonBasicInfoWork> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
new file mode 100644
index 0000000..a5186be
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+public interface PersonCommunicationAbilityService extends IService<PersonCommunicationAbility> {
+
+ IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page,
+ Integer departLimsId, Integer userId, String userName);
+
+ void exportPersonCommunicationAbility(Integer id, HttpServletResponse response)throws Exception;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java
new file mode 100644
index 0000000..2afa074
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+public interface PersonJobResponsibilitiesService extends IService<PersonJobResponsibilities> {
+
+ IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page,
+ String userId,
+ String departmentId,
+ String userName);
+
+ void exportPersonJobResponsibilities(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
new file mode 100644
index 0000000..dfff72a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+public interface PersonPersonnelCapacityService extends IService<PersonPersonnelCapacity> {
+
+ IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
+
+ /**
+ * 瀵煎嚭浜哄憳鑳藉姏
+ * @param id
+ * @param response
+ */
+ void exportPersonnelCapacity(Integer id, HttpServletResponse response);
+
+ /**
+ * submitConfirmPersonnelCapability
+ * @param personPersonnelCapacity
+ */
+ void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java
new file mode 100644
index 0000000..3c23bfe
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+public interface PersonPostAuthorizationRecordService extends IService<PersonPostAuthorizationRecord> {
+
+ IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page,
+ Integer departLimsId,
+ Integer userId,
+ String userName);
+
+ void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java
new file mode 100644
index 0000000..0f2dfdc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+public interface PersonRewardPunishmentRecordService extends IService<PersonRewardPunishmentRecord> {
+
+ IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page,
+ Integer userId,
+ String userName,
+ Date startTime,
+ Date endTime,
+ Integer departmentId);
+
+ List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
new file mode 100644
index 0000000..f5f52dc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
+
+ void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
+
+ void deleteAnnualPlanDetailTable(String ids);
+
+ IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName,
+ String courseCode, String trainingDate, Integer id, Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
new file mode 100644
index 0000000..265dca6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
@@ -0,0 +1,59 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordService extends IService<PersonTrainingRecord> {
+
+ List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
+
+ void deleteTrainingAndAssessmentRecords(String ids);
+
+ IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page,
+ String userName, Integer userId, Integer departLimsId);
+
+
+ void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
+
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+ * @param page
+ * @param userId
+ * @param year
+ * @return
+ */
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁板綍
+ * @param userId
+ * @param trainingDate
+ * @param response
+ */
+ void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response);
+
+ /**
+ * 鍩硅鎻愪氦
+ * @param personTrainingRecordSubmitDto
+ */
+ void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto);
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
new file mode 100644
index 0000000..046cf24
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.personnel.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.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingService extends IService<PersonTraining> {
+
+ IPage<PersonTrainingDto> personTrainingSelect(Page page,
+ String compilerName, String departmentId);
+
+ void personTrainingImport(MultipartFile file, PersonTraining training);
+
+ void personTrainingDelete(Integer id);
+
+ void reviewAnnualPersonnelTraining(PersonTraining training);
+
+ void approveAnnualPersonnelTraining(PersonTraining training);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @param id
+ * @param response
+ */
+ void exportPersonTraining(Integer id, HttpServletResponse response);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+ * @param id
+ * @param response
+ */
+ void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+ * @param trainingDetailedId
+ * @param file
+ * @return
+ */
+ boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file);
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java
new file mode 100644
index 0000000..d944b3b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java
@@ -0,0 +1,13 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.AnnexMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.service.AnnexService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AnnexServiceImpl extends ServiceImpl<AnnexMapper, Annex> implements AnnexService {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java
new file mode 100644
index 0000000..a70f196
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.service.PersonBasicInfoFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+@Service
+public class PersonBasicInfoFileServiceImpl extends ServiceImpl<PersonBasicInfoFileMapper, PersonBasicInfoFile> implements PersonBasicInfoFileService {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
new file mode 100644
index 0000000..0ae552c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -0,0 +1,340 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoWorkDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.mapper.AnnexMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
+
+ @Autowired
+ private DepartmentLimsMapper departmentMapper;
+ @Value("${file.path}")
+ private String imgUrl;
+ @Value("${wordUrl}")
+ private String wordUrl;
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private AnnexMapper annexMapper;
+ @Resource
+ private PersonBasicInfoFileMapper personBasicInfoFileMapper;
+ @Resource
+ private PersonBasicInfoWorkMapper personBasicInfoWorkMapper;
+
+ @Override
+ public List<DepartmentDto> selectCNSAPersonTree() {
+ List<DepartmentDto> departments = departmentMapper.selectDepartment();
+ List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
+ departments.addAll(limsUser);
+ //鑾峰彇鐖惰妭鐐�
+ return departments.stream().filter(m -> m.getFatherId() == null).peek(
+ (m) -> m.setChildren(getChildren(m, departments))
+ ).collect(Collectors.toList());
+ }
+
+ @Override
+ public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
+ Map<String, Object> map = new HashMap<>();
+ Map<Integer,List<DepartmentLims>> childrenMap = new HashMap<>();
+ List<DepartmentLims> deptS = departmentMapper.selectList(null);
+ for (DepartmentLims dept : deptS) {
+ if(!Objects.isNull(dept.getFatherId())) {
+ if(!childrenMap.containsKey(dept.getFatherId())) {
+ childrenMap.put(dept.getFatherId(),new ArrayList<>());
+ }
+ childrenMap.get(dept.getFatherId()).add(dept);
+ }
+ }
+ // 鐖惰妭鐐�
+ List<DepartmentLims> deptF = new ArrayList<>();
+ for (DepartmentLims dept : deptS) {
+ if(Objects.isNull(dept.getFatherId())) {
+ deptF.add(buildTree(dept,childrenMap));
+ }
+ }
+ map.put("department",deptF);
+ map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
+ map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
+ return map;
+ }
+
+ private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
+ if(childrenMap.containsKey(departmentLims.getId())) {
+ departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
+ for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
+ buildTree(departmentLims1,childrenMap);
+ }
+ }
+ return departmentLims;
+ }
+
+ @Override
+ public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
+ User user = new User();
+ user.setId(personBasicInfoDto.getUserId());
+ user.setAccount(personBasicInfoDto.getAccount());
+ user.setName(personBasicInfoDto.getName());
+ user.setNameEn(personBasicInfoDto.getNameEn());
+ user.setAge(personBasicInfoDto.getAge());
+ user.setPhone(personBasicInfoDto.getPhone());
+ user.setEmail(personBasicInfoDto.getEmail());
+ user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
+ user.setPictureUrl(personBasicInfoDto.getPictureUrl());
+ user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
+ userMapper.updateById(user);
+ PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
+ PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
+ .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
+ if(Objects.isNull(one)) {
+ baseMapper.insert(personBasicInfo);
+ }else {
+ baseMapper.updateById(personBasicInfo);
+ }
+ }
+
+ @Override
+ public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
+ return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
+ }
+
+ @Override
+ public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+ ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
+ List<User> list = userMapper.selectList(null);
+ for (User user : list) {
+ PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto();
+ PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+ if (ObjectUtils.isNotEmpty(personBasicInfo)) {
+ BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto);
+ }
+ personBasicInfoDto.setName(user.getName());
+ personBasicInfoDto.setAccount(user.getAccount());
+ personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " ");
+ data.add(personBasicInfoDto);
+ }
+ response.setContentType("application/vnd.ms-excel");
+ response.setCharacterEncoding("UTF-8");
+ String fileName = URLEncoder.encode("浜哄憳鍩烘湰淇℃伅鍒楄〃瀵煎嚭", "UTF-8");
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+ try {
+ // 鏂板缓ExcelWriter
+ ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+ WriteSheet mainSheet = EasyExcel.writerSheet(0, "浜哄憳鍩烘湰淇℃伅瀵煎嚭").head(PersonBasicInfoDto.class).build();
+ excelWriter.write(data, mainSheet);
+ // 鍏抽棴娴�
+ excelWriter.finish();
+ } catch (IOException e) {
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+ }
+
+ @Override
+ public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+ Map<String, Object> userMap = baseMapper.selectexportPersonBasic(id);
+ User user = userMapper.selectById(id);
+ PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+ if (ObjectUtils.isEmpty(personBasicInfo)){
+ throw new ErrorException("璇ョ敤鎴风殑鍩烘湰淇℃伅娌℃湁褰曞叆,鏆傛棤娉曞鍑�");
+ }
+ // 璇佷欢
+ List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery()
+ .eq(Annex::getUserId, id));
+ // 宸ヤ綔缁忓巻
+ List<PersonBasicInfoWork> personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+ .eq(PersonBasicInfoWork::getUserId, id));
+
+ List<PersonBasicInfoWorkDto> workList = personBasicInfoWorks.stream().map(basicInfoWork -> {
+ PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto();
+ personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience());
+ personBasicInfoWorkDto.setFill("涓昏宸ヤ綔缁忓巻\nMain work experience鈭�1");
+ return personBasicInfoWorkDto;
+ }).collect(Collectors.toList());
+
+ // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+ while (annexList.size() < 10) {
+ annexList.add(new Annex());
+ }
+
+ // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+ while (workList.size() < 4) {
+ workList.add(new PersonBasicInfoWorkDto());
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx");
+ Configure configure = Configure.builder()
+ .bind("annexList", new HackLoopTableRenderPolicy())
+ .bind("workList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("user", userMap);
+ put("annexList", annexList);
+ put("workList", workList);
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ userMap.get("name") + "浜哄憳妗f", "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("瀵煎嚭澶辫触");
+ }
+
+ return null;
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+ * @param userId
+ * @param file
+ * @return
+ */
+ @Override
+ public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) {
+ if (userId == null) {
+ throw new ErrorException("缂哄皯浜哄憳id");
+ }
+
+ String urlString;
+ String pathName;
+ String path;
+ String filename = file.getOriginalFilename();
+ String contentType = file.getContentType();
+ PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile();
+ personBasicInfoFile.setUserId(userId);
+ personBasicInfoFile.setFileName(filename);
+ if (contentType != null && contentType.startsWith("image/")) {
+ // 鏄浘鐗�
+ path = imgUrl;
+ personBasicInfoFile.setType(1);
+ } else {
+ // 鏄枃浠�
+ path = wordUrl;
+ personBasicInfoFile.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));
+ personBasicInfoFile.setFileUrl(pathName);
+ personBasicInfoFileMapper.insert(personBasicInfoFile);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("闄勪欢涓婁紶閿欒");
+ return false;
+ }
+ }
+
+ /**
+ * 閫掑綊鏌ヨ瀛愯妭鐐�
+ * @param root 鏍硅妭鐐�
+ * @param all 鎵�鏈夎妭鐐�
+ * @return 鏍硅妭鐐逛俊鎭�
+ */
+ private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
+ if (ObjectUtils.isNotEmpty(root.getId())) {
+ return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
+ (m) -> m.setChildren(getChildren(m, all))
+ ).collect(Collectors.toList());
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ // 姘村钩鍚堝苟鍗曞厓鏍�
+ 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/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java
new file mode 100644
index 0000000..3ed8882
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+@Service
+public class PersonBasicInfoWorkServiceImpl extends ServiceImpl<PersonBasicInfoWorkMapper, PersonBasicInfoWork> implements PersonBasicInfoWorkService {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
new file mode 100644
index 0000000..2c1a227
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
@@ -0,0 +1,113 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.deepoove.poi.config.ConfigureBuilder;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Service
+public class PersonCommunicationAbilityServiceImpl extends ServiceImpl<PersonCommunicationAbilityMapper, PersonCommunicationAbility> implements PersonCommunicationAbilityService {
+
+ @Resource
+ private UserMapper userMapper;
+
+ @Override
+ public IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, Integer departLimsId, Integer userId, String userName) {
+ IPage<PersonCommunicationAbilityDto> personCommunicationAbilityDtoIPage = baseMapper.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName);
+ List<PersonCommunicationAbilityDto> collect = personCommunicationAbilityDtoIPage.getRecords().stream().map(personCommunicationAbilityDto -> {
+ if (ObjectUtils.isNotEmpty(personCommunicationAbilityDto.getUserId())) {
+ List<String> account = new ArrayList<>();
+ List<String> name = new ArrayList<>();
+ for (String s : personCommunicationAbilityDto.getUserId().split(",")) {
+ User user = userMapper.selectById(Integer.parseInt(s));
+ account.add(user.getAccount());
+ name.add(user.getName());
+ }
+ personCommunicationAbilityDto.setAccount(account.stream().collect(Collectors.joining(",")));
+ personCommunicationAbilityDto.setUserName(name.stream().collect(Collectors.joining(",")));
+ }
+ return personCommunicationAbilityDto; // 杩欓噷鍙互瀵硅繑鍥炵殑鏁版嵁杩涜澶勭悊锛屽娣诲姞涓�浜涙柊鐨勫睘鎬ф垨杞崲绛夈��
+ }).collect(Collectors.toList());
+ personCommunicationAbilityDtoIPage.setRecords(collect);
+ return personCommunicationAbilityDtoIPage;
+ }
+
+ @Override
+ public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception {
+ PersonCommunicationAbility personCommunicationAbility = baseMapper.selectById(id);
+ //娌熼�氫汉
+ String collect = " ";
+ if (ObjectUtils.isNotEmpty(personCommunicationAbility.getUserId())) {
+ List<String> name = new ArrayList<>();
+ for (String s : personCommunicationAbility.getUserId().split(",")) {
+ User user = userMapper.selectById(Integer.parseInt(s));
+ name.add(user.getName());
+ }
+ collect = name.stream().collect(Collectors.joining(","));
+ }
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+
+ //鏃堕棿
+ String communicationTime = "";
+ if (ObjectUtils.isNotEmpty(personCommunicationAbility.getCommunicationTime())) {
+ communicationTime = personCommunicationAbility.getCommunicationTime().format(formatter);
+ }
+
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/communication-deal.docx");
+ ConfigureBuilder builder = Configure.builder();
+ builder.useSpringEL(true);
+ String finalCollect = collect;
+ String finalCommunicationTime = communicationTime;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+ new HashMap<String, Object>() {{
+ put("userName", finalCollect);
+ put("communicationTime", finalCommunicationTime);
+ put("communicationPlace", personCommunicationAbility.getCommunicationPlace());
+ put("communicationContent", personCommunicationAbility.getCommunicationContent());
+ }});
+
+ 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("瀵煎嚭澶辫触");
+ }
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
new file mode 100644
index 0000000..d55a3f0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -0,0 +1,113 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.deepoove.poi.config.ConfigureBuilder;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Service
+@AllArgsConstructor
+public class PersonJobResponsibilitiesServiceImpl extends ServiceImpl<PersonJobResponsibilitiesMapper, PersonJobResponsibilities> implements PersonJobResponsibilitiesService {
+
+ @Resource
+ private UserMapper userMapper;
+
+
+ @Override
+ public IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+ return baseMapper.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+ }
+
+ @Override
+ public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response) {
+ PersonJobResponsibilities personJobResponsibilities = baseMapper.selectById(id);
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+ //宀椾綅鍚嶇О
+ String name = personJobResponsibilities.getPostName();
+ //鎵�灞為儴闂�
+ String departLims = userMapper.selectUserDepartmentLimsName(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
+ //宸ヤ綔鐩爣
+ String objective = personJobResponsibilities.getJobObjective();
+ //宀椾綅鑱岃矗
+ String responsibilities = personJobResponsibilities.getJobResponsibilities();
+ //浠昏亴浜�
+ User user = userMapper.selectById(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
+ String incumbent = user.getName();
+ //浠昏亴鏃堕棿
+ String incumbentDate = "";
+ if (ObjectUtils.isNotEmpty(personJobResponsibilities.getIncumbentDate())) {
+ incumbentDate = personJobResponsibilities.getIncumbentDate().format(formatter);
+ }
+ //涓荤
+ String supervisor = "";
+ if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorId())) {
+ supervisor = userMapper.selectById(personJobResponsibilities.getSupervisorId()).getName();
+ }
+ //涓荤鏃堕棿
+ String supervisorDate = "";
+ if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorDate())) {
+ supervisorDate = personJobResponsibilities.getSupervisorDate().format(formatter);
+ }
+
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/explain-deal.docx");
+ ConfigureBuilder builder = Configure.builder();
+ builder.useSpringEL(true);
+ String finalIncumbentDate = incumbentDate;
+ String finalSupervisor = supervisor;
+ String finalSupervisorDate = supervisorDate;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+ new HashMap<String, Object>() {{
+ put("name", name);
+ put("account", user.getAccount());
+ put("departLims", departLims);
+ put("objective", objective);
+ put("responsibilities", responsibilities);
+ put("incumbent", incumbent);
+ put("incumbentDate", finalIncumbentDate);
+ put("supervisor", finalSupervisor);
+ put("supervisorDate", finalSupervisorDate);
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ name + "鐨勪换鑱屽矖浣嶈鏄庝功", "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-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
new file mode 100644
index 0000000..0c056f1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -0,0 +1,158 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Service
+public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
+
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+
+ @Value("${file.path}")
+ private String imgUrl;
+
+ @Override
+ public IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName) {
+ return baseMapper.personPersonnelCapacityPage(page, departLimsId, userId, userName);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鑳藉姏
+ * @param id
+ * @param response
+ */
+ @Override
+ public void exportPersonnelCapacity(Integer id, HttpServletResponse response) {
+ PersonPersonnelCapacityExportDto capacityExportDto = baseMapper.selectExportPersonnelCapacity(id);
+
+ // 纭浜�
+ String confirmUrl = null;
+ if (capacityExportDto.getConfirmOperatingPersonnelId() != null) {
+ confirmUrl = userMapper.selectById(capacityExportDto.getConfirmOperatingPersonnelId()).getSignatureUrl();
+ if (StringUtils.isBlank(confirmUrl)) {
+ throw new ErrorException("缂哄皯纭浜虹鍚�");
+ }
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/personnel-capacity.docx");
+ ConfigureBuilder builder = Configure.builder();
+ builder.useSpringEL(true);
+ String finalConfirmUrl = confirmUrl;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+ new HashMap<String, Object>() {{
+ put("capacity", capacityExportDto);
+ put("confirmUrl", StringUtils.isNotBlank(finalConfirmUrl) ? Pictures.ofLocal(imgUrl + "/" + finalConfirmUrl).create() : null);
+ put("confirmDateUrl", capacityExportDto.getConfirmDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(capacityExportDto.getConfirmDate())).create() : null);
+ }});
+
+ 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 personPersonnelCapacity
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity) {
+ if (personPersonnelCapacity.getConfirmOperatingPersonnelId() == null) {
+ throw new ErrorException("缂哄皯纭浜�");
+ }
+ User formUser = userMapper.selectById(personPersonnelCapacity.getUserId());
+
+ 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(formUser.getName() + "鐨勪汉鍛樿兘鍔涘緟纭");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(personPersonnelCapacity.getConfirmOperatingPersonnelId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+ this.saveOrUpdate(personPersonnelCapacity);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(personPersonnelCapacity.getConfirmOperatingPersonnelId());
+
+ String message = "";
+ message += "CNAS浜哄憳鑳藉姏纭閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-浜哄憳鑳藉姏濉啓";
+ message += "\n" + formUser.getName() + "鐨勪汉鍛樿兘鍔涘緟纭";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ }
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
new file mode 100644
index 0000000..68f2961
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -0,0 +1,132 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Service
+public class PersonPostAuthorizationRecordServiceImpl extends ServiceImpl<PersonPostAuthorizationRecordMapper, PersonPostAuthorizationRecord> implements PersonPostAuthorizationRecordService {
+
+ @Resource
+ private UserMapper userMapper;
+
+ @Value("${file.path}")
+ private String imgUrl;
+
+ @Override
+ public IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, String userName) {
+ return baseMapper.personPostAuthorizationRecordPage(page, departLimsId, userId, userName);
+ }
+
+ @Override
+ public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response) {
+ PersonPostAuthorizationRecord personPostAuthorizationRecord = baseMapper.selectById(id);
+ //濮撳悕
+ User user = userMapper.selectById(personPostAuthorizationRecord.getUserId());
+ String name = user.getName();
+ //todo: 浜哄憳浠昏亴鎺堟潈璁板綍濮撳悕鑻辨枃
+// HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
+// format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+// format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+// StringBuilder pinyinBuilder = new StringBuilder();
+// for (int i = 0; i < name.length(); i++) {
+// char c = name.charAt(i);
+// // 鍒ゆ柇鏄惁鏄眽瀛�
+// if (Character.toString(c).matches("[\\u4E00-\\u9FFF]")) {
+// // 鑾峰彇姹夊瓧鐨勬嫾闊虫暟缁�
+// String[] pinyinArray = new String[0];
+// try {
+// pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
+// } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
+//
+// }
+// if (pinyinArray!= null && pinyinArray.length > 0) {
+// pinyinBuilder.append(pinyinArray[0]);
+// }
+// } else {
+// pinyinBuilder.append(c);
+// }
+// }
+// String nameEn = pinyinBuilder.toString();
+ String nameEn = user.getNameEn();
+ //鐞嗚鐭ヨ瘑鑰冭瘯鎴愮哗
+ String num1=personPostAuthorizationRecord.getNum1();
+ //鎿嶄綔鎶�鑳借�冭瘯鎴愮哗
+ String num2=personPostAuthorizationRecord.getNum2();
+ //璇佷功缂栧彿
+ String code = personPostAuthorizationRecord.getCertificateNumber();
+ //鍙戣瘉鏃堕棿
+ LocalDateTime createTime = personPostAuthorizationRecord.getCreateTime();
+ String year = createTime.getYear() + "";
+ String mon = createTime.getMonth().getValue() + "";
+ String day = createTime.getDayOfMonth() + "";
+ //涓汉鐓х墖
+ if (ObjectUtils.isEmpty(user.getPictureUrl())) {
+ throw new ErrorException(name+"鐨勪釜浜虹収鐗囨病鏈変笂浼�");
+ }
+ String pictureUrl = user.getPictureUrl();
+
+
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/credentials-deal.docx");
+ ConfigureBuilder builder = Configure.builder();
+ builder.useSpringEL(true);
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+ new HashMap<String, Object>() {{
+ put("name", name);
+ put("nameEn", nameEn);
+ put("num1", num1);
+ put("num2", num2);
+ put("code", code);
+ put("year", year);
+ put("mon", mon);
+ put("day", day);
+ put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + pictureUrl));
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ name+"鐨勫矖浣嶈亴涓氳祫鏍兼寮�", "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-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java
new file mode 100644
index 0000000..9393bbd
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java
@@ -0,0 +1,36 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.mapper.PersonRewardPunishmentRecordMapper;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+@Service
+public class PersonRewardPunishmentRecordServiceImpl extends ServiceImpl<PersonRewardPunishmentRecordMapper, PersonRewardPunishmentRecord> implements PersonRewardPunishmentRecordService {
+
+ @Override
+ public IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, Integer userId, String userName, Date startTime, Date endTime, Integer departmentId) {
+ return baseMapper.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId);
+ }
+
+ @Override
+ public List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime) {
+ return baseMapper.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
new file mode 100644
index 0000000..3eaf942
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
@@ -0,0 +1,85 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
+public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
+
+
+ private UserMapper userMapper;
+
+ @Override
+ public void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId) {
+ List<PersonTrainingDetailed> personTrainingDetailedList = new ArrayList<>();
+ list.forEach(i -> {
+ PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
+ BeanUtils.copyProperties(i, personTrainingDetailed);
+
+ // 鍖归厤璁插笀
+ User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, i.getTrainingLecturerName()));
+ if (ObjectUtils.isEmpty(user)) {
+ throw new ErrorException("鏈壘鍒拌璁插笀锛�" + i.getTrainingLecturerName());
+ }
+ personTrainingDetailed.setTrainingLecturerId(user.getId());
+ personTrainingDetailed.setPlanId(planId);
+ personTrainingDetailed.setState(3);
+
+ personTrainingDetailed.setTrainingDate(i.getTrainingDate());
+
+
+ personTrainingDetailedList.add(personTrainingDetailed);
+ });
+ // 鎵归噺鏂板
+ if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
+ baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
+ }
+ }
+
+ @Override
+ public void deleteAnnualPlanDetailTable(String ids) {
+ String[] split = ids.split(",");
+ if (split.length > 0) {
+ for (String s : split) {
+ baseMapper.deleteById(s);
+ }
+ }
+ }
+
+ @Override
+ public IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate, Integer id, Integer userId) {
+ return baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, null);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
new file mode 100644
index 0000000..4b11bb5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,177 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+ @Resource
+ private UserMapper userMapper;
+
+ @Override
+ public List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName) {
+ return baseMapper.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+ }
+
+ @Override
+ public void deleteTrainingAndAssessmentRecords(String ids) {
+ String[] split = ids.split(",");
+ if (split.length > 0) {
+ for (String s : split) {
+ baseMapper.deleteById(s);
+ }
+ }
+ }
+
+ @Override
+ public IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId) {
+ return baseMapper.personnelTrainingPersonnel(page, userName, userId, departLimsId);
+ }
+
+ @Override
+ public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
+
+ }
+
+
+ @Override
+ public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year) {
+ return baseMapper.queryPersonnelDetailsOfUserIdAndYear(page, userId, year);
+ }
+
+ @Override
+ public void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response) {
+ // 鏌ヨ浜哄憳浜轰俊鎭�
+ PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
+
+ // 鏌ヨ鍩硅璁板綍
+ List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtosByTrainingDate(userId, trainingDate);
+
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
+ Configure configure = Configure.builder()
+ .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("traning", trainingRecordListDto);
+ put("personnelDetailsLisat", personDetailedDtos);
+ }});
+ 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 personTrainingRecordSubmitDto
+ */
+ @Override
+ public void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+ .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+ .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod())
+ .set(PersonTrainingDetailed::getPlaceTraining, personTrainingRecordSubmitDto.getPlaceTraining())
+ .set(PersonTrainingDetailed::getOpeningTime, personTrainingRecordSubmitDto.getOpeningTime())
+ .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId())
+ .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+
+ // 鍙戦�佹秷鎭�氱煡
+ if (personTrainingRecordSubmitDto.getState().equals(2)) {
+ PersonTrainingDetailed personPersonnelCapacity = personTrainingDetailedService.getById(personTrainingRecordSubmitDto.getTrainingDetailedId());
+
+ 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("鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(personTrainingRecordSubmitDto.getAssessmentUserId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(personTrainingRecordSubmitDto.getAssessmentUserId());
+
+ String message = "";
+ message += "CNAS浜哄憳鍩硅璁″垝寰呰瘎浠�";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-浜哄憳鍩硅璁″垝";
+ message += "\n" + "鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+ }
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
new file mode 100644
index 0000000..3463126
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,429 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+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.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.TrainingRecordExportDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+ @Autowired
+ private PersonTrainingRecordMapper personTrainingRecordMapper;
+ @Autowired
+ private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+ @Value("${file.path}")
+ private String imgUrl;
+
+ @Value("${wordUrl}")
+ private String wordUrl;
+
+ @Override
+ public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departmentId) {
+
+ return baseMapper.personTrainingSelect(page, compilerName, departmentId);
+ }
+
+ @Override
+ public void personTrainingImport(MultipartFile file, PersonTraining training) {
+
+ Integer userId = SecurityUtils.getUserId().intValue();
+ // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+ PersonTraining personSupervisePlan = new PersonTraining();
+ String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+ personSupervisePlan.setFileName(fileName);
+ personSupervisePlan.setPlanYear(training.getPlanYear());
+ personSupervisePlan.setCompilerId(userId);
+ personSupervisePlan.setReviewerId(training.getReviewerId());
+ personSupervisePlan.setCompilationDate(LocalDateTime.now());
+ baseMapper.insert(personSupervisePlan);
+ User user = userMapper.selectById(userId);
+ // 娑堟伅鍙戦��
+ InformationNotification info = new InformationNotification();
+ // 鍙戦�佷汉
+ info.setCreateUser(user.getName());
+ info.setMessageType("6");
+ info.setTheme("CNAS鍩硅璁″垝瀹℃牳閫氱煡");
+ info.setContent("鎮ㄦ湁涓�鏉″煿璁鍒掑緟瀹℃牳");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(training.getApproverId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(training.getApproverId());
+
+ String message = "";
+ message += "CNAS鍩硅璁″垝瀹℃牳閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+ message += "\n" + fileName + "鐨勫煿璁鍒掑緟瀹℃牳";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ // 骞村害璁″垝璇︽儏 鏂板
+ try {
+ PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService);
+ personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+ EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void personTrainingDelete(Integer id) {
+ personTrainingDetailedService.remove(Wrappers.<PersonTrainingDetailed>lambdaQuery()
+ .eq(PersonTrainingDetailed::getPlanId, id));
+ baseMapper.deleteById(id);
+ }
+
+ @Override
+ public void reviewAnnualPersonnelTraining(PersonTraining training) {
+ PersonTraining personTraining = new PersonTraining();
+ personTraining.setId(training.getId());
+ personTraining.setApproverId(training.getApproverId());// 娣诲姞鎵瑰噯浜�
+ personTraining.setAuditDate(LocalDateTime.now());
+ personTraining.setAuditRemarks(training.getAuditRemarks());
+ personTraining.setReviewerStatus(training.getReviewerStatus());
+
+ PersonTraining old = baseMapper.selectById(training.getId());
+
+ // 娑堟伅鍙戦��
+ 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("鎮ㄦ湁涓�鏉″煿璁鍒掑緟鎵瑰噯");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(training.getApproverId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(training.getApproverId());
+
+ String message = "";
+ message += "CNAS鍩硅璁″垝鎵瑰噯閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+ message += "\n" + old.getFileName() + "鐨勫煿璁鍒掑緟鎵瑰噯";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ baseMapper.updateById(personTraining);
+ }
+
+ @Override
+ public void approveAnnualPersonnelTraining(PersonTraining training) {
+ LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
+ .eq(PersonTraining::getId, training.getId())
+ .set(PersonTraining::getApprovalDate, LocalDateTime.now())
+ .set(PersonTraining::getApprovalRemarks, training.getApprovalRemarks())
+ .set(PersonTraining::getApprovalStatus, training.getApprovalStatus());
+ baseMapper.update(new PersonTraining(), wrapper);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @param id
+ * @param response
+ */
+ @Override
+ public void exportPersonTraining(Integer id, HttpServletResponse response) {
+
+ // 鏌ヨ璇︽儏
+ PersonTraining personTraining = baseMapper.selectById(id);
+
+ //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+ String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl();
+ if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+ throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+ }
+
+ //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+ String examineUrl = null;
+ if (personTraining.getReviewerId() != null) {
+ examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl();
+ if (StringUtils.isBlank(examineUrl)) {
+ throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+ }
+ }
+
+ //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+ String ratifyUrl = null;
+ if (personTraining.getApproverId() != null) {
+ ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl();
+ if (StringUtils.isBlank(ratifyUrl)) {
+ throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+ }
+ }
+
+ // 鏌ヨ璇︽儏
+ List<PersonTrainingDetailedDto> detailedDtos = personTrainingDetailedMapper.selectTrainingList(id);
+
+ int index = 1;
+ for (PersonTrainingDetailedDto detailedDto : detailedDtos) {
+ detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
+ detailedDto.setIndex(index);
+ index++;
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
+ String finalExamineUrl = examineUrl;
+ String finalRatifyUrl = ratifyUrl;
+ Configure configure = Configure.builder()
+ .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("year", personTraining.getPlanYear());
+ put("trainingDetailedList", detailedDtos);
+ put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+ put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+ put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+ put("writeDateUrl", personTraining.getCompilationDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null);
+ put("examineDateUrl", personTraining.getAuditDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null);
+ put("ratifyDateUrl", personTraining.getApprovalDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).create() : null);
+ }});
+ 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 id
+ * @param response
+ */
+ @Override
+ public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) {
+ // 鏌ヨ浜哄憳鍩硅鏄庣粏
+ PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id);
+
+ // 鏌ヨ鍩硅鐨勪汉鍛�
+ List<PersonTrainingRecordDto> recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id);
+
+ List<TrainingRecordExportDto> exportDtoList = new ArrayList<>();
+ TrainingRecordExportDto exportDto = new TrainingRecordExportDto();
+
+ int count = 0;
+ for (PersonTrainingRecordDto recordDto : recordDtos) {
+ switch (count) {
+ case 0:
+ exportDto.setUserName1(recordDto.getUserName());
+ exportDto.setDepartment1(recordDto.getDepartment());
+ exportDto.setExaminationResults1(recordDto.getExaminationResults());
+ count ++;
+ break;
+ case 1:
+ exportDto.setUserName2(recordDto.getUserName());
+ exportDto.setDepartment2(recordDto.getDepartment());
+ exportDto.setExaminationResults2(recordDto.getExaminationResults());
+ exportDtoList.add(exportDto);
+ exportDto = new TrainingRecordExportDto();
+ count = 0;
+ break;
+ }
+ }
+ exportDtoList.add(exportDto);
+
+ // 璐ㄩ噺璐熻矗浜�
+ String assessmentUserUrl = null;
+ if (detailedDto.getAssessmentUserId() != null) {
+ assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl();
+ if (StringUtils.isBlank(assessmentUserUrl)) {
+ throw new ErrorException("鎵句笉鍒拌瘎浠蜂汉鐨勭鍚�");
+ }
+ }
+
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx");
+ Configure configure = Configure.builder()
+ .bind("trainingRecordsList", new HackLoopTableRenderPolicy())
+ .build();
+ String finalAssessmentUserUrl = assessmentUserUrl;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("trainingDetail", detailedDto);
+ put("trainingRecordsList", exportDtoList);
+ put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).create() : null);
+ }});
+ 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 trainingDetailedId
+ * @param file
+ * @return
+ */
+ @Override
+ public boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+ if (trainingDetailedId == null) {
+ throw new ErrorException("缂哄皯楠屾敹id");
+ }
+
+ String urlString;
+ String pathName;
+ String path;
+ String filename = file.getOriginalFilename();
+ String contentType = file.getContentType();
+ PersonTrainingDetailedFile detailedFile = new PersonTrainingDetailedFile();
+ detailedFile.setTrainingDetailedId(trainingDetailedId);
+ detailedFile.setFileName(filename);
+ if (contentType != null && contentType.startsWith("image/")) {
+ // 鏄浘鐗�
+ path = imgUrl;
+ detailedFile.setType(1);
+ } else {
+ // 鏄枃浠�
+ path = wordUrl;
+ detailedFile.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));
+ detailedFile.setFileUrl(pathName);
+ personTrainingDetailedFileMapper.insert(detailedFile);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("闄勪欢涓婁紶閿欒");
+ return false;
+ }
+ }
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ @Override
+ public List<PersonTrainingDetailed> getThisYearTrainingDetailed() {
+ return personTrainingDetailedMapper.getThisYearTrainingDetailed();
+ }
+}
diff --git a/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
new file mode 100644
index 0000000..206013d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
@@ -0,0 +1,65 @@
+<?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.personnel.mapper.PersonBasicInfoMapper">
+
+ <select id="selectLimsUser" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
+ SELECT u.id userId, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1) AS fatherId
+ FROM user u
+ where u.is_custom = 0
+ and u.depart_lims_id is not null
+ and u.depart_lims_id != ''
+ </select>
+
+ <select id="getCNASPersonnelInfo" resultType="com.ruoyi.personnel.dto.PersonBasicInfoDto">
+ SELECT *
+ FROM user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ where u.id = #{userId}
+ </select>
+
+ <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
+ select
+ u.id userId,
+ u.`name` name,
+ u.account account,
+ DATE_FORMAT(cpbi.group_time, '%Y-%m-%d') groupTime,
+ cpbi.native_place nativePlace,
+ cpbi.identity_card identityCard,
+ cpbi.id_address idAddress,
+ u.phone telephone,
+ cpbi.graduated_institutions1 graduatedInstitutions1,
+ cpbi.major1 major1,
+ DATE_FORMAT(cpbi.graduation_time1, '%Y-%m-%d') graduationTime1,
+ cpbi.official_academic_redentials officialAcademicRedentials,
+ cpbi.highest_degree highestDegree,
+ cpbi.professional_title professionalTitle
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join user u1 on u1.id = u.create_user
+ <where>
+ FIND_IN_SET(#{departmentId},u.depart_lims_id)
+ <if test="name != null and name != ''">
+ and u.name like concat('%',#{name},'%')
+ </if>
+ </where>
+ </select>
+
+ <!-- 瀵煎嚭鏌ヨ浜哄憳淇℃伅 -->
+ <select id="selectexportPersonBasic" resultType="java.util.Map">
+ select DATE_FORMAT(cpbi.last_update_time, '%Y骞�%m鏈�%d鏃�') lastUpdateTimeString,
+ u.account,
+ u.`name`,
+ cpbi.sex,
+ cpbi.post_name postName,
+ u.age,
+ DATE_FORMAT(cpbi.working_time, '%Y骞�%m鏈�') workingTimeString,
+ cpbi.major1,
+ DATE_FORMAT(cpbi.graduation_time1, '%Y骞�%m鏈�') graduationTime1string,
+ cpbi.official_academic_redentials officialAcademicRedentials,
+ cpbi.graduated_institutions1 graduatedInstitutions1,
+ cpbi.remarks
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ where u.id = #{userId}
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
new file mode 100644
index 0000000..2ea0c72
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
@@ -0,0 +1,19 @@
+<?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.personnel.mapper.PersonCommunicationAbilityMapper">
+
+
+ <select id="personPersonCommunicationAbilityPage" resultType="com.ruoyi.personnel.dto.PersonCommunicationAbilityDto">
+ select cpca.*, us.name create_user_name
+ from cnas_person_communication_ability cpca
+ left join user us on cpca.create_user = us.id
+ <where>
+ <if test="userId != null and userId != ''">
+ and FIND_IN_SET(#{userId},cpca.user_id)
+ </if>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId},us.depart_lims_id)
+ </if>
+ </where>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
new file mode 100644
index 0000000..ace613b
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
@@ -0,0 +1,24 @@
+<?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.personnel.mapper.PersonJobResponsibilitiesMapper">
+
+
+ <select id="personJobResponsibilitiesSelect" resultType="com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto">
+ select cpt.*, u.name incumbent_name, su.name supervisor_name, dl.name depart_lims_name, u.account
+ from cnas_person_job_responsibilities cpt
+ left join user u on cpt.incumbent_id = u.id
+ left join user su on cpt.supervisor_id = su.id
+ left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+ <where>
+ <if test="userId != null and userId != ''">
+ and cpt.incumbent_id = #{userId}
+ </if>
+ <if test="departmentId != null and departmentId != ''">
+ and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
+ </if>
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ </where>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
new file mode 100644
index 0000000..96e0358
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
@@ -0,0 +1,118 @@
+<?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.personnel.mapper.PersonPersonnelCapacityMapper">
+
+ <select id="personPersonnelCapacityPage" resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto">
+ select cppc.*,
+ u2.name confirm_operating_personnel_name,
+ u3.name user_name,
+ cpbi.post_name,
+ ecp.responsibilities,
+ cpbi.professional_title,
+ TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
+ from cnas_person_personnel_capacity cppc
+ left join user u2 on cppc.confirm_operating_personnel_id = u2.id
+ left join user u3 on cppc.user_id = u3.id
+ -- 鍙栧矖浣�
+ left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
+ -- 鍙栦汉鍛樿兘鍔涚殑宀椾綅鑱岃矗
+ left join (SELECT GROUP_CONCAT(e.label) responsibilities, cppc.id
+ from cnas_person_personnel_capacity cppc
+ left join enums e on FIND_IN_SET(e.value, cppc.job_responsibilities)
+ where e.category = '宀椾綅鑱岃矗'
+ GROUP BY cppc.id) ecp on ecp.id = cppc.id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cppc.user_id = #{userId}
+ </if>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId}, u3.depart_lims_id)
+ </if>
+ <if test="userName != null and userName != ''">
+ and u3.name like concat('%', #{userName}, '%')
+ </if>
+ </where>
+ </select>
+
+ <!-- 鏌ヨ浜哄憳鑳藉姏鎺ュ彛 -->
+ <select id="selectExportPersonnelCapacity"
+ resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto">
+ select cppc.*,
+ cpbi.post_name,
+ u1.name userName,
+ cpbi.official_academic_redentials,
+ cpbi.major1,
+ cpbi.professional_title,
+ p.place_work,
+ TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major,
+ case when cppc.academic_conform_not = 1 then '鈽�'
+ else '鈻�' end academicConformNot1,-- 瀛﹀巻
+ case when cppc.academic_conform_not = 2 then '鈽�'
+ else '鈻�' end academicConformNot2,
+ case when cppc.academic_conform_not = 3 then '鈽�'
+ else '鈻�' end academicConformNot3,
+ case when cppc.related_years_conform_not = 1 then '鈽�'
+ else '鈻�' end relatedYearsConformNot1,-- 鐩稿叧骞撮檺
+ case when cppc.related_years_conform_not = 2 then '鈽�'
+ else '鈻�' end relatedYearsConformNot2,
+ case when cppc.related_years_conform_not = 3 then '鈽�'
+ else '鈻�' end relatedYearsConformNot3,
+ case when cppc.related_training_conform_not = 1 then '鈽�'
+ else '鈻�' end relatedTrainingConformNot1,-- 鐩稿叧鍩硅
+ case when cppc.related_training_conform_not = 2 then '鈽�'
+ else '鈻�' end relatedTrainingConformNot2,
+ case when cppc.related_training_conform_not = 3 then '鈽�'
+ else '鈻�' end relatedTrainingConformNot3,
+ case when cppc.relevant_experience_conform_not = 1 then '鈽�'
+ else '鈻�' end relevantExperienceConformNot1,-- 鐩稿叧缁忛獙
+ case when cppc.relevant_experience_conform_not = 2 then '鈽�'
+ else '鈻�' end relevantExperienceConformNot2,
+ case when cppc.relevant_experience_conform_not = 3 then '鈽�'
+ else '鈻�' end relevantExperienceConformNot3,
+ case when cppc.work_license_conform_not = 1 then '鈽�'
+ else '鈻�' end workLicenseConformNot1,-- 涓婂矖璇�
+ case when cppc.work_license_conform_not = 2 then '鈽�'
+ else '鈻�' end workLicenseConformNot2,
+ case when cppc.work_license_conform_not = 3 then '鈽�'
+ else '鈻�' end workLicenseConformNot3,
+ case when cppc.job_responsibilities_conform_not = 1 then '鈽�'
+ else '鈻�' end jobResponsibilitiesConformNot1,-- 宀椾綅鑱岃矗
+ case when cppc.job_responsibilities_conform_not = 2 then '鈽�'
+ else '鈻�' end jobResponsibilitiesConformNot2,
+ case when cppc.job_responsibilities_conform_not = 3 then '鈽�'
+ else '鈻�' end jobResponsibilitiesConformNot3,
+ case when cppc.comprehensive_assessment = 'Qualified this position' then '鈽�'
+ else '鈻�' end comprehensiveAssessment1,-- 缁煎悎璇勪环
+ case when cppc.comprehensive_assessment = 'You can work while training' then '鈽�'
+ else '鈻�' end comprehensiveAssessment2,
+ case when cppc.comprehensive_assessment = 'Iconpetent for the position' then '鈽�'
+ else '鈻�' end comprehensiveAssessment3,
+ case when find_in_set(1, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities1,
+ case when find_in_set(2, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities2,
+ case when find_in_set(3, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities3,
+ case when find_in_set(4, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities4,
+ case when find_in_set(5, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities5,
+ case when find_in_set(6, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities6,
+ case when find_in_set(7, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities7,
+ case when find_in_set(8, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities8,
+ case when find_in_set(9, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities9,
+ case when find_in_set(10, cppc.job_responsibilities) then '鈽�'
+ else '鈻�' end jobResponsibilities10
+ from cnas_person_personnel_capacity cppc
+ left join user u1 on cppc.user_id = u1.id
+ left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
+ left join (select GROUP_CONCAT(cptr.work_experience) place_work, cptr.user_id
+ from cnas_person_basic_info_work cptr
+ GROUP BY cptr.user_id) p on u1.id = p.user_id
+ where cppc.id = #{id}
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml
new file mode 100644
index 0000000..bb3ef16
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml
@@ -0,0 +1,23 @@
+<?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.personnel.mapper.PersonPostAuthorizationRecordMapper">
+
+
+ <select id="personPostAuthorizationRecordPage" resultType="com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto">
+ select cppar.*, us.name create_user_name, u.account account, u.name user_name
+ from cnas_person_post_authorization_record cppar
+ left join user u on cppar.user_id = u.id
+ left join user us on cppar.create_user = us.id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cppar.user_id = #{userId}
+ </if>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
+ </if>
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ </where>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
new file mode 100644
index 0000000..d92a163
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
@@ -0,0 +1,47 @@
+<?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.personnel.mapper.PersonRewardPunishmentRecordMapper">
+
+
+ <select id="rewardPunishmentPage" resultType="com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto">
+ select cprpr.*, us.name create_user_name, u.account account, u.name user_name
+ from cnas_person_reward_punishment_record cprpr
+ left join user u on cprpr.user_id = u.id
+ left join user us on cprpr.create_user = us.id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cprpr.user_id = #{userId}
+ </if>
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ <if test="startTime != null and endTime != null">
+ AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
+ </if>
+ <if test="departmentId != null and departmentId != ''">
+ and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
+ </if>
+ </where>
+ </select>
+
+ <select id="rewardPunishmentExport" resultType="com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel">
+ select cprpr.*, us.name create_user_name, u.account account, u.name user_name
+ from cnas_person_reward_punishment_record cprpr
+ left join user u on cprpr.user_id = u.id
+ left join user us on cprpr.create_user = us.id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cprpr.user_id = #{userId}
+ </if>
+ <if test="departmentId != null and departmentId != ''">
+ and FIND_IN_SET(#{departmentId},u.depart_lims_id)
+ </if>
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ <if test="startTime != null and endTime != null">
+ AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
+ </if>
+ </where>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
new file mode 100644
index 0000000..147b493
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
@@ -0,0 +1,46 @@
+<?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.personnel.mapper.PersonTrainingMapper">
+
+ <!-- 鏍规嵁鍒涘缓浜虹殑閮ㄩ棬绛涢�夋暟鎹紝鍙槸鍒涘缓浜哄彲鑳芥湭鍒嗛厤閮ㄩ棬涔熼渶瑕佹煡鐪� -->
+ <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
+ SELECT
+ cpt.*,
+ u1.name compiler_name,
+ u2.name reviewer_name,
+ u3.name approver_name,
+ u4.name create_user_name
+ FROM
+ cnas_person_training cpt
+ LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+ LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+ LEFT JOIN user u3 ON cpt.approver_id = u3.id
+ LEFT JOIN user u4 ON cpt.create_user = u4.id
+ <where>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)
+ </if>
+ <if test="compilerName != null and compilerName != ''">
+ and u4.name like concat('%', #{compilerName}, '%')
+ </if>
+ </where>
+ union
+ SELECT
+ cpt.*,
+ u1.name compiler_name,
+ u2.name reviewer_name,
+ u3.name approver_name,
+ u4.name create_user_name
+ FROM
+ cnas_person_training cpt
+ LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+ LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+ LEFT JOIN user u3 ON cpt.approver_id = u3.id
+ LEFT JOIN user u4 ON cpt.create_user = u4.id
+ WHERE
+ u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
+ <if test="compilerName != null and compilerName != ''">
+ and u4.name like concat('%', #{compilerName}, '%')
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
new file mode 100644
index 0000000..c57dd3d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,126 @@
+<?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.personnel.mapper.PersonTrainingRecordMapper">
+
+ <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+ select cptr.*, u.account, u.name user_name, u.phone, r.name role_name
+ from cnas_person_training_record cptr
+ left join user u on u.id = cptr.user_id
+ left join role r on r.id = u.role_id
+ where cptr.course_id = #{trainingDetailedId}
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ </select>
+
+ <select id="personnelTrainingPersonnel" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+ select u.name, u.account, dl.name depart_lims_name, cpbi.professional_title,
+ cpbi.official_academic_redentials, u.id user_id
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+ where u.is_custom = 0
+ <if test="userName != '' and userName != null and userName != 'null'">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ <if test="userId != null and userId != ''">
+ and u.id = #{userId}
+ </if>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId}, u.depart_lims_id)
+ </if>
+ </select>
+
+ <select id="queryPersonnelDetails" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cptr.user_id = #{userId}
+ </if>
+ </where>
+ </select>
+
+ <!-- 鏍规嵁璇︽儏id鏌ヨ鍩硅淇℃伅 -->
+ <select id="selectListByTrainingDetailedId" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+ select cptr.*,
+ u.name userName,
+ dl.name department
+ from cnas_person_training_record cptr
+ left join user u on u.id = cptr.user_id
+ left join department_lims dl on find_in_set(dl.id, u.depart_lims_id) and dl.id != 1
+ where cptr.course_id = #{trainingDetailedId}
+ </select>
+
+ <!-- 鏍规嵁id鏌ヨ浜哄憳淇℃伅 -->
+ <select id="selectUserTraining" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+ select u.name,
+ u.account,
+ dl.name depart_lims_name,
+ cpbi.professional_title,
+ cpbi.official_academic_redentials,
+ cpbi.unit_time,
+ cpbi.major1,
+ u.id user_id,
+ DATE_FORMAT(cpbi.unit_time, '%Y-%m-%d') AS unitTimeSting
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+ where u.is_custom = 0
+ and u.id = #{userId}
+ </select>
+
+ <!-- 鏍规嵁鐢ㄦ埛id鏌ヨ浜哄憳璁板綍 -->
+ <select id="selectPersonDetailedDtos" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date,
+ cptd.training_content,
+ cptd.class_hour,
+ cptr.examination_results,
+ cptd.remarks,
+ DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ and cptr.user_id = #{userId}
+ <where>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+
+ <!--鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍-->
+ <select id="queryPersonnelDetailsOfUserIdAndYear"
+ resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cptr.user_id = #{userId}
+ </if>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+
+ <!-- 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭 -->
+ <select id="selectPersonDetailedDtosByTrainingDate"
+ resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date,
+ cptd.training_content,
+ cptd.class_hour,
+ cptr.examination_results,
+ cptd.remarks,
+ DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ and cptr.user_id = #{userId}
+ <where>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/static/communication-deal.docx b/cnas-personnel/src/main/resources/static/communication-deal.docx
new file mode 100644
index 0000000..9045072
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/communication-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/credentials-deal.docx b/cnas-personnel/src/main/resources/static/credentials-deal.docx
new file mode 100644
index 0000000..2fda5fd
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/credentials-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/explain-deal.docx b/cnas-personnel/src/main/resources/static/explain-deal.docx
new file mode 100644
index 0000000..7333bec
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/explain-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-basic-info.docx b/cnas-personnel/src/main/resources/static/person-basic-info.docx
new file mode 100644
index 0000000..6d1739a
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-basic-info.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-training-record.docx b/cnas-personnel/src/main/resources/static/person-training-record.docx
new file mode 100644
index 0000000..3bbf0bc
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-training-record.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-training.docx b/cnas-personnel/src/main/resources/static/person-training.docx
new file mode 100644
index 0000000..0a6bf24
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-training.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/personnel-capacity.docx b/cnas-personnel/src/main/resources/static/personnel-capacity.docx
new file mode 100644
index 0000000..e7ad3b9
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/personnel-capacity.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/super-vise-plan.docx b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
new file mode 100644
index 0000000..8e5a56f
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
new file mode 100644
index 0000000..dc398e3
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
new file mode 100644
index 0000000..16775b0
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-record.docx b/cnas-personnel/src/main/resources/static/supervision-record.docx
new file mode 100644
index 0000000..ede4555
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-record.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/training-record.docx b/cnas-personnel/src/main/resources/static/training-record.docx
new file mode 100644
index 0000000..1e6955d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/training-record.docx
Binary files differ
diff --git a/pom.xml b/pom.xml
index 9d36e98..0dbf825 100644
--- a/pom.xml
+++ b/pom.xml
@@ -278,6 +278,13 @@
<version>${ruoyi.version}</version>
</dependency>
+ <!--cnas浜哄憳-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>cnas-personnel</artifactId>
+ <version>${ruoyi.version}</version>
+ </dependency>
+
<!-- minio -->
<dependency>
<groupId>io.minio</groupId>
@@ -392,6 +399,7 @@
<module>cnas-manage</module>
<module>cnas-device</module>
<module>cnas-process</module>
+ <module>cnas-personnel</module>
</modules>
<packaging>pom</packaging>
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 751aec5..485e28d 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -103,6 +103,13 @@
<artifactId>cnas-process</artifactId>
</dependency>
+ <!--cnas浜哄憳-->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>cnas-personnel</artifactId>
+ </dependency>
+
+
</dependencies>
<build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
new file mode 100644
index 0000000..854d84a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
@@ -0,0 +1,29 @@
+package com.ruoyi.web;
+
+import com.ruoyi.device.mqtt.MQClient;
+import com.ruoyi.device.mqtt.MQConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MqttApplicationRunner implements ApplicationRunner {
+
+ @Autowired
+ private MQConfig mqConfig;
+
+ @Value("${mqtt.client}")
+ private Boolean client;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ if (client) {
+ MQClient mqttPushClient = new MQClient();
+ mqttPushClient.connect(mqConfig);
+ }
+ }
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index f32dbe2..33a491d 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -98,3 +98,16 @@
custorder: http://192.168.20.47/PurchService.ashx?
custorder-port: http://192.168.20.47:8008/PurchService.ashx?
erp-services: http://192.168.20.47:8081
+
+# 澶囨敞 18083瀵嗙爜锛歾ttZTT123!@
+mqtt:
+ url: tcp://mqtt-ztt.zttiot.com:1883 # 鏈嶅姟鍣╥p
+ username: forwarder # MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍鍚�
+ password: ZTlink12345 # MQTT-鏈嶅姟绔�-瀵嗙爜锛�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍瀵嗙爜
+ timeout: 100 # 瓒呮椂鏃堕棿 锛堝崟浣嶏細绉掞級
+ keepalive: 60 # 蹇冭烦 锛堝崟浣嶏細绉掞級
+ qos: 1 # 蹇冭烦鍖呯骇鍒�
+ completion-timeout: 3000 # 杩炴帴瓒呮椂鏃堕棿锛堝崟浣嶏細绉掞級
+ clientId: javaPublish # clientId
+ subscribe: /ztt/v3/2443521/publish # 璁㈤槄涓婚
+ client: false # 濡傛灉寮�鍙戦渶瑕佸惎鍔ㄦ祴璇曪紝闇�瑕佹敼涓篺alse涓嶇劧浼氫竴鐩存姤閿�
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java
new file mode 100644
index 0000000..9fa947a
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.core.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DepartmentDto {
+
+ private Integer id;
+
+ private String name;
+
+ private Integer userId;
+
+ private Integer fatherId;
+
+ private List<DepartmentDto> children;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java
new file mode 100644
index 0000000..4ec52e2
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java
@@ -0,0 +1,42 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 閮ㄩ棬鏄庣粏
+ * @TableName department_lims
+ */
+@TableName(value ="department_lims")
+@Data
+public class DepartmentLims implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鍚嶇О")
+ private String name;
+
+ @ApiModelProperty("鐖剁骇id")
+ private Integer fatherId;
+
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @TableField(exist = false)
+ private List<DepartmentLims> children;
+}
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> {
+
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
new file mode 100644
index 0000000..3e2a51e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+
+import java.util.List;
+
+/**
+* @author z1292
+* @description 閽堝琛ㄣ�恉epartment_lims(閮ㄩ棬鏄庣粏)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-05-22 14:08:17
+* @Entity com.yuanchu.mom.pojo.DepartmentLims
+*/
+public interface DepartmentLimsMapper extends BaseMapper<DepartmentLims> {
+
+ //鑾峰彇閮ㄩ棬鏍�
+ List<DepartmentDto> selectDepartment();
+
+ //鏍规嵁閮ㄩ棬id,鏌ヨ浠栫殑鎵�鏈夊瓙绫籭d
+ List<Integer> selectSonById(Integer id);
+
+}
+
+
+
+
diff --git a/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml
new file mode 100644
index 0000000..48c7d39
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml
@@ -0,0 +1,25 @@
+<?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.system.mapper.DepartmentLimsMapper">
+
+
+ <select id="selectDepartment" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
+ SELECT id, name, father_id
+ FROM department_lims
+ </select>
+
+ <select id="selectSonById" resultType="java.lang.Integer">
+ SELECT au.id
+ FROM (SELECT * FROM department_lims WHERE father_id IS NOT NULL) au,
+ (SELECT @father_id := #{id}) pd
+ WHERE FIND_IN_SET(father_id, @father_id) > 0
+ AND @father_id := concat(@father_id, ',', id)
+ UNION
+ SELECT id
+ FROM department_lims
+ WHERE id = #{id}
+ ORDER BY id
+ </select>
+</mapper>
--
Gitblit v1.9.3