From a2249848664d0cf1857671d5ae47c18d6bee339e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Mon, 25 May 2026 16:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A5=E4=BB=B6=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desk/basic/pojo/entity/UrgentPart.java | 115 +++++++++ .../desk/basic/pojo/vo/UrgentPartVO.java | 36 +++ .../controller/UrgentPartController.java | 114 +++++++++ .../desk/basic/excel/UrgentPartExcel.java | 74 ++++++ .../desk/basic/mapper/UrgentPartMapper.java | 32 +++ .../desk/basic/mapper/UrgentPartMapper.xml | 19 ++ .../basic/service/IUrgentPartService.java | 64 +++++ .../service/impl/UrgentPartServiceImpl.java | 235 ++++++++++++++++++ .../Excel/BA/急件维护导入模板.xls | Bin 0 -> 9959 bytes 9 files changed, 689 insertions(+) create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/UrgentPart.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/UrgentPartVO.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/UrgentPartController.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/excel/UrgentPartExcel.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IUrgentPartService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/UrgentPartServiceImpl.java create mode 100644 blade-service/blade-desk/src/main/resources/Excel/BA/急件维护导入模板.xls diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/UrgentPart.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/UrgentPart.java new file mode 100644 index 000000000..266b5550e --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/UrgentPart.java @@ -0,0 +1,115 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.pojo.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import org.springblade.core.mp.base.BaseEntity; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringPool; + +import java.io.Serial; +import java.util.Arrays; +import java.util.Date; + +/** + * [急件维护] 实体类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Data +@TableName("BS_URGENT_PART") +@Schema(description = "UrgentPart Entity对象") +@EqualsAndHashCode(callSuper = true) +public class UrgentPart extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + public static final String COL_PLAN_NO = "PLAN_NO"; + public static final String COL_PART_CODE = "PART_CODE"; + public static final String COL_BATCH_NO = "BATCH_NO"; + public static final String COL_REQUIRE_DATE = "REQUIRE_DATE"; + public static final String COL_EXPIRE_DATE = "EXPIRE_DATE"; + public static final String COL_STATUS = "STATUS"; + public static final String COL_MAINTAIN_MAN = "MAINTAIN_MAN"; + public static final String COL_MAINTAIN_TIME = "MAINTAIN_TIME"; + + @Schema(description = "计划单号") + private String planNo; + + @Schema(description = "零件号") + private String partCode; + + @Schema(description = "批次号") + private String batchNo; + + @Schema(description = "需求交期") + private Date requireDate; + + @Schema(description = "到期日期") + private Date expireDate; + + @Schema(description = "状态:0-生效,1-作废") + private Integer status; + + @Schema(description = "维护人") + private Long maintainMan; + + @Schema(description = "维护时间") + private Date maintainTime; + + + @Getter + @AllArgsConstructor + public enum UrgentPartStatusEnum { + EMPTY(StringPool.EMPTY, -1), + + /** + * 状态:0-生效,1-作废 + */ + EFFECTIVE("生效", 0), + VOID("作废", 1), + ; + + final String name; + final int code; + + /** + * 匹配枚举值 + * + * @param name 名称 + * @return UrgentPartStatusEnum + */ + public static UrgentPartStatusEnum of(String name) { + return Arrays.stream(UrgentPartStatusEnum.values()) + .filter(enumItem -> enumItem.getName().equalsIgnoreCase(name != null ? name : "web")) + .findFirst() + // 在没有找到匹配项时返回默认值 + .orElse(UrgentPartStatusEnum.EMPTY); + } + + /** + * 根据值获取名称 + * + * @param code 状态码 + * @return 状态名称 + */ + public static String getName(int code) { + UrgentPartStatusEnum item = Arrays.stream(UrgentPartStatusEnum.values()) + .filter(enumItem -> enumItem.getCode() == code) + .findFirst() + .orElse(null); + return ObjectUtil.isEmpty(item) ? StringPool.EMPTY : item.getName(); + } + } + +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/UrgentPartVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/UrgentPartVO.java new file mode 100644 index 000000000..e1e921281 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/vo/UrgentPartVO.java @@ -0,0 +1,36 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.basic.pojo.entity.UrgentPart; + +import java.io.Serial; + +/** + * [急件维护] 视图实体类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UrgentPartVO extends UrgentPart { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "维护人名称") + private String maintainManName; + + @Schema(description = "创建人名称") + private String createUserName; + + @Schema(description = "修改人名称") + private String updateUserName; + + @Schema(description = "状态名称") + private String statusName; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/UrgentPartController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/UrgentPartController.java new file mode 100644 index 000000000..f79f226c6 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/UrgentPartController.java @@ -0,0 +1,114 @@ +package org.springblade.desk.basic.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.core.io.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.constant.BAModuleConst; +import org.springblade.desk.basic.excel.UrgentPartExcel; +import org.springblade.desk.basic.pojo.entity.UrgentPart; +import org.springblade.desk.basic.pojo.vo.UrgentPartVO; +import org.springblade.desk.basic.service.IUrgentPartService; +import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * [急件维护] 控制器 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@RestController +@RequestMapping(BAModuleConst.CONTROLLER_PREFIX + "/UrgentPart") +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +@Tag(name = "[BA][急件维护]", description = "[急件维护]接口") +public class UrgentPartController extends BladeController { + + private final IUrgentPartService service; + + /** + * [急件维护] 分页查询 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 20) + @Operation(summary = "分页查询", description = "传入UrgentPartVO Obj") + public R> page(UrgentPartVO urgentPart, Query query) { + IPage page = Condition.getPage(query); + IPage pagesVO = service.selectUrgentPartPage( + page, urgentPart + ); + return R.data(pagesVO); + } + + /** + * [急件维护] 导入Excel + */ + @PostMapping("/importExcel") + @ApiOperationSupport(order = 70) + @ApiLog("急件维护导入") + @Operation(summary = "导入Excel", description = "MultipartFile") + public R importExcel(@RequestParam("file") MultipartFile file) { + return service.importExcel(file); + } + + /** + * [急件维护] 作废 + */ + @PostMapping("/voidRecords") + @ApiOperationSupport(order = 71) + @ApiLog("急件维护作废") + @Operation(summary = "作废", description = "传入ids") + public R voidRecords(@Parameter(description = "主键集合", required = true) @RequestBody List ids) { + return service.voidRecords(ids); + } + + /** + * [急件维护] 导出Excel + */ + @GetMapping("/exportExcel") + @ApiOperationSupport(order = 72) + @Operation(summary = "导出Excel", description = "传入UrgentPart") + public void exportExcel(@Parameter(hidden = true) @RequestParam Map urgentPart, + HttpServletResponse response) { + List list = service.exportUrgentPart(Condition.getQueryWrapper(urgentPart, UrgentPart.class)); + ExcelUtil.export(response, "[急件维护]数据" + DateUtil.time(), + "[急件维护]数据表", list, UrgentPartExcel.class); + } + + /** + * [急件维护] 下载Excel模板 + */ + @GetMapping("/downloadExcelTemplate") + @ApiOperationSupport(order = 73) + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity downloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/BA/急件维护导入模板.xls", + "导入模版-急件维护.xls"); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/excel/UrgentPartExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/excel/UrgentPartExcel.java new file mode 100644 index 000000000..f32202663 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/excel/UrgentPartExcel.java @@ -0,0 +1,74 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.excel; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * [急件维护] Excel实体类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class UrgentPartExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 计划单号 + */ + @ColumnWidth(20) + @ExcelProperty("计划单号") + private String planNo; + + /** + * 零件号 + */ + @ColumnWidth(20) + @ExcelProperty("零件号") + private String partCode; + + /** + * 批次号 + */ + @ColumnWidth(20) + @ExcelProperty("批次号") + private String batchNo; + + /** + * 需求交期 + */ + @ColumnWidth(20) + @ExcelProperty("需求交期") + private Date requireDate; + + /** + * 到期日期 + */ + @ColumnWidth(20) + @ExcelProperty("到期日期") + private Date expireDate; + + /** + * 状态 + */ + @ColumnWidth(20) + @ExcelProperty("状态") + private String status; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.java new file mode 100644 index 000000000..1327315b7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.java @@ -0,0 +1,32 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.basic.excel.UrgentPartExcel; +import org.springblade.desk.basic.pojo.entity.UrgentPart; +import org.springblade.desk.basic.pojo.vo.UrgentPartVO; + +import java.util.List; + +/** + * [急件维护] Mapper 接口 + * + * @author AI Assistant + * @since 2026-05-22 + */ +public interface UrgentPartMapper extends BaseMapper { + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportUrgentPart(@Param("ew") Wrapper queryWrapper); + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.xml new file mode 100644 index 000000000..698de8d1a --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/UrgentPartMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IUrgentPartService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IUrgentPartService.java new file mode 100644 index 000000000..b7d7e79ad --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IUrgentPartService.java @@ -0,0 +1,64 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.excel.UrgentPartExcel; +import org.springblade.desk.basic.pojo.entity.UrgentPart; +import org.springblade.desk.basic.pojo.vo.UrgentPartVO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * [急件维护] 服务类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +public interface IUrgentPartService extends BaseService { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param urgentPart 查询参数 + * @return IPage + */ + IPage selectUrgentPartPage(IPage page, UrgentPartVO urgentPart); + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportUrgentPart(Wrapper queryWrapper); + + /** + * 检查并更新过期数据 + * + * @return 更新的记录数 + */ + void checkAndUpdateExpiredRecords(); + + /** + * 导入Excel + * + * @param file Excel文件 + * @return R + */ + R importExcel(MultipartFile file); + + /** + * 作废 + * + * @param ids 主键ID集合 + * @return R + */ + R voidRecords(List ids); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/UrgentPartServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/UrgentPartServiceImpl.java new file mode 100644 index 000000000..59942ceb7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/UrgentPartServiceImpl.java @@ -0,0 +1,235 @@ +/** + * Author: AI Assistant + */ +package org.springblade.desk.basic.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import cn.hutool.core.bean.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.excel.UrgentPartExcel; +import org.springblade.desk.basic.mapper.UrgentPartMapper; +import org.springblade.desk.basic.pojo.entity.UrgentPart; +import org.springblade.desk.basic.pojo.vo.UrgentPartVO; +import org.springblade.desk.basic.service.IUrgentPartService; +import org.springblade.system.cache.UserCache; +import org.springblade.system.feign.IUserClient; +import org.springblade.system.pojo.entity.User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * [急件维护] 服务实现类 + * + * @author AI Assistant + * @since 2026-05-22 + */ +@Service +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +public class UrgentPartServiceImpl extends BaseServiceImpl implements IUrgentPartService { + @Resource + IUserClient userClient; + + @Override + public IPage selectUrgentPartPage(IPage page, UrgentPartVO urgentPart) { + // 查询前先检查并更新过期数据 + checkAndUpdateExpiredRecords(); + // 使用IService的page方法查询 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper + .eq(UrgentPart::getIsDeleted, 0) + .like(StrUtil.isNotEmpty(urgentPart.getPlanNo()), UrgentPart::getPlanNo, urgentPart.getPlanNo()) + .like(StrUtil.isNotEmpty(urgentPart.getPartCode()), UrgentPart::getPartCode, urgentPart.getPartCode()) + .like(StrUtil.isNotEmpty(urgentPart.getBatchNo()), UrgentPart::getBatchNo, urgentPart.getBatchNo()) + .eq(Objects.nonNull(urgentPart.getStatus()), UrgentPart::getStatus, urgentPart.getStatus()) + .eq(Objects.isNull(urgentPart.getStatus()),UrgentPart::getStatus, 0) + .orderByDesc(UrgentPart::getUpdateTime); + IPage iPage = page(page, queryWrapper); + String userIdSet = iPage.getRecords().stream().map(s -> { + ArrayList userIds = new ArrayList<>(); + if (Objects.nonNull(s.getCreateUser())) { + userIds.add(s.getCreateUser().toString()); + } + if (Objects.nonNull(s.getUpdateUser())) { + userIds.add(s.getUpdateUser().toString()); + } + if (Objects.nonNull(s.getMaintainMan())) { + userIds.add(s.getMaintainMan().toString()); + } + return userIds; + }).flatMap(Collection::stream).collect(Collectors.joining( ",")); + List users = userClient.userListByIds(userIdSet); + Map userMap = users.stream().collect(Collectors.toMap(User::getId, User::getName)); + + List collect = iPage.getRecords().stream().map(s -> { + UrgentPartVO urgentPartVO = BeanUtil.copyProperties(s, UrgentPartVO.class); + // 设置状态名称 + if (s.getStatus() != null) { + urgentPartVO.setStatusName(UrgentPart.UrgentPartStatusEnum.getName(s.getStatus())); + } + // 设置用户名称 + if (CollUtil.isNotEmpty(userMap)) { + urgentPartVO.setMaintainManName(userMap.getOrDefault(s.getMaintainMan(), null)); + urgentPartVO.setCreateUserName(userMap.getOrDefault(s.getCreateUser(), null)); + urgentPartVO.setUpdateUserName(userMap.getOrDefault(s.getUpdateUser(), null)); + } + return urgentPartVO; + }).collect(Collectors.toList()); + + IPage voPage = new Page<>(); + + BeanUtil.copyProperties(iPage, voPage, "records"); + + voPage.setRecords(collect); + + return voPage; + } + + @Override + public List exportUrgentPart(Wrapper queryWrapper) { + List urgentPartList = baseMapper.exportUrgentPart(queryWrapper); + return urgentPartList; + } + + @Override + public void checkAndUpdateExpiredRecords() { + update(Wrappers.lambdaUpdate(UrgentPart.class) + .lt(UrgentPart::getExpireDate, new Date()) + .set(UrgentPart::getStatus, 1) + .set(UrgentPart::getMaintainTime,new Date())); + } + + /** + * 设置VO的用户名称 + * + * @param vo 视图对象 + */ + private void setVOValue(UrgentPartVO vo) { + // 设置维护人名称 + if (vo.getMaintainMan() != null) { + User maintainMan = UserCache.getUser(vo.getMaintainMan()); + if (maintainMan != null) { + vo.setMaintainManName(maintainMan.getRealName()); + } + } + + // 设置创建人名称 + if (vo.getCreateUser() != null) { + User createUser = UserCache.getUser(vo.getCreateUser()); + if (createUser != null) { + vo.setCreateUserName(createUser.getRealName()); + } + } + + // 设置修改人名称 + if (vo.getUpdateUser() != null) { + User updateUser = UserCache.getUser(vo.getUpdateUser()); + if (updateUser != null) { + vo.setUpdateUserName(updateUser.getRealName()); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R importExcel(MultipartFile file) { + try { + List excelList = ExcelUtil.read(file, UrgentPartExcel.class); + if (excelList == null || excelList.isEmpty()) { + return R.fail("导入数据不能为空"); + } + + Long userId = AuthUtil.getUserId(); + Date now = new Date(); + List urgentPartList = excelList.stream().map(excel -> { + // 校验必填字段 + if (StrUtil.isEmpty(excel.getPlanNo()) || StrUtil.isEmpty(excel.getPartCode())) { + throw new RuntimeException("计划单号和零件号为必填项"); + } + UrgentPart urgentPart = BeanUtil.copyProperties(excel, UrgentPart.class); + if (BeanUtil.isEmpty(urgentPart)){ + return null; + } + // 如果到期日期为空,默认为当前时间+60天 + if (Objects.isNull(urgentPart.getExpireDate())) { + urgentPart.setExpireDate(DateUtil.plusDays(now, 60)); + } + // 根据是否超过有效日期判断状态:未过期为生效(0),已过期为作废(1) + if (StrUtil.isNotEmpty(excel.getStatus())) { + urgentPart.setStatus(UrgentPart.UrgentPartStatusEnum.of(excel.getStatus()).getCode()); + } + + if (urgentPart.getStatus() == null) { + urgentPart.setStatus(urgentPart.getExpireDate().after(now) ? 0 : 1); + } + urgentPart.setMaintainTime(now); + urgentPart.setCreateUser(userId); + urgentPart.setCreateTime(now); + urgentPart.setUpdateUser(userId); + urgentPart.setUpdateTime(now); + return urgentPart; + }).filter(BeanUtil::isNotEmpty) + .collect(Collectors.toList()); + + boolean result = saveBatch(urgentPartList); + + if (result) { + return R.success("导入成功,共导入 " + urgentPartList.size() + " 条数据"); + } else { + return R.fail("导入失败"); + } + + } catch (Exception e) { + log.error("导入Excel失败", e); + return R.fail("导入失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R voidRecords(List ids) { + if (CollUtil.isEmpty(ids)) { + return R.fail("请选择要作废的记录"); + } + + Long userId = AuthUtil.getUserId(); + Date now = new Date(); + + // 批量更新状态为作废 + LambdaUpdateWrapper queryWrapper = Wrappers.lambdaUpdate(UrgentPart.class) + .in(UrgentPart::getId, ids) + .set(UrgentPart::getStatus,1) + .set(UrgentPart::getMaintainMan,userId) + .set(UrgentPart::getMaintainTime,now); + boolean result = update(queryWrapper); + if (result) { + log.info("作废急件记录成功,IDs: {}", ids); + return R.success("作废成功"); + } else { + return R.fail("作废失败"); + } + } +} diff --git a/blade-service/blade-desk/src/main/resources/Excel/BA/急件维护导入模板.xls b/blade-service/blade-desk/src/main/resources/Excel/BA/急件维护导入模板.xls new file mode 100644 index 0000000000000000000000000000000000000000..4857abf062774ae15916dc1933a5293d4b027b69 GIT binary patch literal 9959 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