From ae684dc6e5d0d1567e3540f1184f04b618c80c6c Mon Sep 17 00:00:00 2001 From: qinyulong Date: Wed, 14 Jan 2026 14:12:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B2=97=E4=BD=8D=E8=AF=81=E4=B9=A6=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../excel/CertificateMaintenanceImport.java | 54 +++++++++++++++++ .../CertificateMaintenanceController.java | 43 +++++++++++-- .../controller/CertificateTypeController.java | 2 +- .../controller/CultivateDetailController.java | 2 +- .../EquipmentMaintenanceController.java | 2 +- .../controller/PostHandleController.java | 4 +- .../mapper/CertificateMaintenanceMapper.xml | 2 +- .../mapper/EquipmentMaintenanceMapper.xml | 2 +- .../ICertificateMaintenanceService.java | 10 +++ .../CertificateMaintenanceServiceImpl.java | 57 +++++++++++++++++- .../jobTransfer/证书维护导入模板.xls | Bin 0 -> 20480 bytes 11 files changed, 166 insertions(+), 12 deletions(-) create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/CertificateMaintenanceImport.java create mode 100644 blade-service/blade-desk/src/main/resources/Excel/jobTransfer/证书维护导入模板.xls diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/CertificateMaintenanceImport.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/CertificateMaintenanceImport.java new file mode 100644 index 00000000..fc8ce960 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/CertificateMaintenanceImport.java @@ -0,0 +1,54 @@ +package org.springblade.desk.jobTransfer.pojo.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.util.Date; + +/** + * 证书维护导入 + * + * @author qyl + * @since 2026-01-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CertificateMaintenanceImport extends BaseEntity { + + /** + * 用户code + */ + @ExcelProperty(index = 0) + private String userCode; + /** + * 证书类型 + */ + @ExcelProperty(index = 1) + private String certificateType; + /** + * 证书编号 + */ + @ExcelProperty(index = 2) + private String certificateCode; + /** + * 证书日期 + */ + @ExcelProperty(index = 3) + @DateTimeFormat("yyyy/MM/dd") + private Date certificateDate; + /** + * 适航日期 + */ + @ExcelProperty(index = 4) + @DateTimeFormat("yyyy/MM/dd") + private Date airworthinessDate; + /** + * 宇航日期 + */ + @ExcelProperty(index = 5) + @DateTimeFormat("yyyy/MM/dd") + private Date astronautDate; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateMaintenanceController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateMaintenanceController.java index 139c6941..84321bfe 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateMaintenanceController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateMaintenanceController.java @@ -17,13 +17,20 @@ import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.util.ExcelExtUtil; import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceExcel; +import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceImport; import org.springblade.desk.jobTransfer.pojo.excel.CultivateDetailExcel; +import org.springblade.desk.jobTransfer.pojo.excel.PostHandleImport; import org.springblade.desk.jobTransfer.pojo.request.CertificateLedgerQuery; import org.springblade.desk.jobTransfer.pojo.vo.CertificateLedgerVO; import org.springblade.desk.jobTransfer.pojo.vo.CultivateDetailVO; import org.springblade.desk.jobTransfer.pojo.vo.PostHandleVO; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.UserInfo; import org.springframework.beans.BeanUtils; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -36,11 +43,10 @@ import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.excel.util.ExcelUtil; -import java.util.ArrayList; -import java.util.Map; -import java.util.List; +import java.util.*; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; /** * 证书维护 控制器 @@ -51,7 +57,7 @@ import jakarta.servlet.http.HttpServletResponse; @RestController @AllArgsConstructor @RequestMapping("/certificateMaintenance") -@Tag(name = "证书维护", description = "证书维护接口") +@Tag(name = "上岗证台账", description = "上岗证台账接口") public class CertificateMaintenanceController extends BladeController { private final ICertificateMaintenanceService certificateMaintenanceService; @@ -173,6 +179,35 @@ public class CertificateMaintenanceController extends BladeController { ExcelUtil.export(response, "证书维护数据" + DateUtil.time(), "证书维护数据表", excels, CertificateMaintenanceExcel.class); } + /** + * 下载Excel模板 + */ + @GetMapping("/downloadExcelTemplate") + @ApiOperationSupport(order = 10) + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity downloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/jobTransfer/证书维护导入模板.xls", + "证书维护导入模板.xls"); + } + + /** + * 导入Excel + */ + @PostMapping("/importExcel") + @ApiOperationSupport(order = 11) + @Operation(summary = "导入Excel", description = "MultipartFile") + public R importExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, CertificateMaintenanceImport.class + ); + return certificateMaintenanceService.saveExcelData(importList); + } + @PostConstruct // 项目启动后立即执行一次 public void init() { updateMaintenanceStatus(); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateTypeController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateTypeController.java index 33ed06f7..97b44fbf 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateTypeController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CertificateTypeController.java @@ -40,7 +40,7 @@ import jakarta.servlet.http.HttpServletResponse; @RestController @AllArgsConstructor @RequestMapping("/certificateType") -@Tag(name = "证书类型", description = "证书类型接口") +@Tag(name = "证书类型维护", description = "证书类型维护接口") public class CertificateTypeController extends BladeController { private final ICertificateTypeService certificateTypeService; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CultivateDetailController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CultivateDetailController.java index 0a8d9002..30bbbdf6 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CultivateDetailController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/CultivateDetailController.java @@ -49,7 +49,7 @@ import jakarta.servlet.http.HttpServletResponse; @RestController @AllArgsConstructor @RequestMapping("/cultivateDetail") -@Tag(name = "培训安排", description = "培训安排接口") +@Tag(name = "培训记录管理", description = "培训记录管理接口") public class CultivateDetailController extends BladeController { private final ICultivateDetailService cultivateDetailService; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/EquipmentMaintenanceController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/EquipmentMaintenanceController.java index d3437a40..019f5f9e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/EquipmentMaintenanceController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/EquipmentMaintenanceController.java @@ -50,7 +50,7 @@ import jakarta.servlet.http.HttpServletResponse; @RestController @AllArgsConstructor @RequestMapping("/equipmentMaintenance") -@Tag(name = "岗位设备维护", description = "岗位设备维护接口") +@Tag(name = "人员设备台账", description = "人员设备台账接口") public class EquipmentMaintenanceController extends BladeController { private final IEquipmentMaintenanceService equipmentMaintenanceService; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java index c6a5f332..1663826f 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java @@ -52,7 +52,7 @@ import org.springframework.web.multipart.MultipartFile; @RestController @AllArgsConstructor @RequestMapping("/postHandle") -@Tag(name = "岗位处理", description = "岗位处理接口") +@Tag(name = "人员岗位管理", description = "人员岗位管理接口") public class PostHandleController extends BladeController { private final IPostHandleService postHandleService; @@ -215,7 +215,7 @@ public class PostHandleController extends BladeController { public ResponseEntity downloadExcelTemplate() { return ExcelExtUtil.downloadXlsTemplate( "Excel/jobTransfer/岗位处理导入模板下载.xls", - "岗位处理导入模板下载.xls"); + "岗位处理导入模板.xls"); } /** diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/CertificateMaintenanceMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/CertificateMaintenanceMapper.xml index 93194c53..0f99410e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/CertificateMaintenanceMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/CertificateMaintenanceMapper.xml @@ -131,7 +131,7 @@ LEFT JOIN BA_TEAM_SET bd ON ph.DEPT_ID = bd.ID LEFT JOIN MES_CERTIFICATE_MAINTENANCE cm ON ph.id = cm.ph_id AND cm.is_deleted = 0 LEFT JOIN MES_CERTIFICATE_TYPE ct ON cm.certificate_id = ct.id AND ct.is_deleted = 0 - WHERE ph.is_deleted = 0 + WHERE ph.is_deleted = 0 and ph.staff_type != 1 AND ph.name LIKE CONCAT(CONCAT('%', #{query.name}), '%') diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/EquipmentMaintenanceMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/EquipmentMaintenanceMapper.xml index 5c5d66f2..485ff45d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/EquipmentMaintenanceMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/mapper/EquipmentMaintenanceMapper.xml @@ -110,7 +110,7 @@ LEFT JOIN BA_TEAM_SET bd ON ph.DEPT_ID = bd.ID LEFT JOIN MES_EQUIPMENT_MAINTENANCE em ON ph.id = em.ph_id AND em.is_deleted = 0 LEFT JOIN MES_EQUIPMENT equipment ON em.equipment_id = equipment.id AND equipment.is_deleted = 0 - WHERE ph.is_deleted = 0 + WHERE ph.is_deleted = 0 and ph.staff_type != 1 AND ph.name LIKE CONCAT(CONCAT('%', #{query.name}), '%') diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/ICertificateMaintenanceService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/ICertificateMaintenanceService.java index a0e5d0b9..dba9d2d0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/ICertificateMaintenanceService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/ICertificateMaintenanceService.java @@ -1,8 +1,10 @@ package org.springblade.desk.jobTransfer.service; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import org.springblade.core.tool.api.R; import org.springblade.desk.jobTransfer.pojo.entity.CertificateMaintenanceEntity; import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceExcel; +import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceImport; import org.springblade.desk.jobTransfer.pojo.request.CertificateLedgerQuery; import org.springblade.desk.jobTransfer.pojo.vo.CertificateLedgerVO; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -47,4 +49,12 @@ public interface ICertificateMaintenanceService extends BaseService certificateMaintenances); + + /** + * 导入 + * + * @param certificateMaintenanceImports + * @return + */ + R saveExcelData(List certificateMaintenanceImports); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/CertificateMaintenanceServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/CertificateMaintenanceServiceImpl.java index df4c6118..89c27b2c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/CertificateMaintenanceServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/CertificateMaintenanceServiceImpl.java @@ -1,18 +1,30 @@ package org.springblade.desk.jobTransfer.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import jakarta.annotation.Resource; +import org.springblade.core.tool.api.R; +import org.springblade.desk.jobTransfer.mapper.CertificateTypeMapper; +import org.springblade.desk.jobTransfer.mapper.PostHandleMapper; import org.springblade.desk.jobTransfer.pojo.entity.CertificateMaintenanceEntity; +import org.springblade.desk.jobTransfer.pojo.entity.PostHandleEntity; +import org.springblade.desk.jobTransfer.pojo.enums.PostHandleStatusEnum; +import org.springblade.desk.jobTransfer.pojo.enums.StaffTypeEnum; import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceExcel; +import org.springblade.desk.jobTransfer.pojo.excel.CertificateMaintenanceImport; import org.springblade.desk.jobTransfer.pojo.request.CertificateLedgerQuery; import org.springblade.desk.jobTransfer.pojo.vo.CertificateLedgerVO; import org.springblade.desk.jobTransfer.mapper.CertificateMaintenanceMapper; import org.springblade.desk.jobTransfer.service.ICertificateMaintenanceService; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.UserInfo; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.transaction.annotation.Transactional; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 证书维护 服务实现类 @@ -23,6 +35,12 @@ import java.util.List; @Service public class CertificateMaintenanceServiceImpl extends BaseServiceImpl implements ICertificateMaintenanceService { + @Resource + private PostHandleMapper postHandleMapper; + + @Resource + private CertificateTypeMapper certificateTypeMapper; + @Override public IPage selectCertificateMaintenancePage(IPage page, CertificateLedgerQuery certificateLedgerQuery) { return page.setRecords(baseMapper.selectCertificateMaintenancePage(page, certificateLedgerQuery)); @@ -53,7 +71,44 @@ public class CertificateMaintenanceServiceImpl extends BaseServiceImpl certificateMaintenanceImports) { + //获取全部用户codes,通过code获取用户ID, + Set codes = certificateMaintenanceImports.stream().map(CertificateMaintenanceImport::getUserCode) + .collect(Collectors.toSet()); + Map idCodeMap = codes.stream() + .map(code -> { + UserInfo userInfo = UserCache.getUserByCode(code); + return (userInfo != null && userInfo.getUser() != null) ? + new AbstractMap.SimpleEntry<>(code, userInfo.getUser().getId()) : null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toMap(AbstractMap.SimpleEntry::getValue, AbstractMap.SimpleEntry::getKey)); + //根据用户id获取人员岗位数据 + Collection values = idCodeMap.keySet(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(PostHandleEntity::getUserId, values) + .eq(PostHandleEntity::getStaffType, StaffTypeEnum.FORMAL.getCode().shortValue()) + .ne(PostHandleEntity::getPhStatus, PostHandleStatusEnum.DEPART.getCode().shortValue()); // 使用实体类的get方法引用 + List postHandleEntities = postHandleMapper.selectList(lambdaQueryWrapper); + Map idMap = postHandleEntities.stream().collect(Collectors.toMap( + entity -> entity.getUserId(), + entity -> entity.getId())); + //整合成一个用户code和PostHandleEntityId的map + Map codePostHandleIdMap = new HashMap<>(); + for (Long l : idMap.keySet()) { + codePostHandleIdMap.put(idCodeMap.get(l), idMap.get(l)); + } + codes.removeAll(codePostHandleIdMap.keySet()); + if (codes.size() > 0) { + return R.fail("工号:" + String.join(",", codes) + "不存在。"); + } + //获取全部证书类型 + Set certificateType = certificateMaintenanceImports.stream().map(CertificateMaintenanceImport::getCertificateType) + .collect(Collectors.toSet()); + return null; + } } diff --git a/blade-service/blade-desk/src/main/resources/Excel/jobTransfer/证书维护导入模板.xls b/blade-service/blade-desk/src/main/resources/Excel/jobTransfer/证书维护导入模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..5cd5f217ca6662af48c0e0d04f3326ce7f6b2ea1 GIT binary patch literal 20480 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

0%CAAr zjOPvTdj>s_3V)8yqbLyKO{E(_vOD}bSlAviEd$pz05|GX8U!?iB#YYH@JMxwV2UP| z;Q)xNZ>cD2!7;hWyt}+!0K2#xGesFKQ)a3tgSmLs`XMwMKECTt?+EEVo{*0_HhgZ5 zMgv?Uf-o$wVW?X+49@$NV4q-@hAEVik1p|`gm`p`5C3a|)}TvT@LwnRvJ71kKnW9F z(uNYsaSDDvjrShZrzgRWHU&kARH4XA8F~lwSPReq*ngYDCy;MS4pDv_4A2C~Jt60V z$L2Gvl|Vw^-+_#X7LO8`Hnl*o3c6OU{|dUTP3?X6^Gu--8P{EG zo+B+I3~_sh4yNEJf8Us>{^_X+lSXHROd6Y!{48>L7$Kk|E*{S!10;Qs*0 Ck?ZCF literal 0 HcmV?d00001