| .gitignore | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/ExcelRequired.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/RequiredHeaderWriteHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/patrol/MesQcPatrolController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/patrol/PatrolMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.gitignore
@@ -1,5 +1,7 @@ ###################################################################### # Build Tools .playwright-mcp .tmp .gradle /build/ yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/ExcelRequired.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package cn.iocoder.yudao.framework.excel.core.handler; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** 表æå¯¼å ¥æ¨¡æ¿è¯¥åæ æ¡ä»¶å¿ å¡«ï¼ä» æ¹åæ¨¡æ¿æ ·å¼ï¼ä¸æ¹ååæ®µåç§°ææ ¡éªé»è¾ã */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ExcelRequired {} yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/RequiredHeaderWriteHandler.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ package cn.iocoder.yudao.framework.excel.core.handler; import cn.idev.excel.write.handler.CellWriteHandler; import cn.idev.excel.write.handler.context.CellWriteHandlerContext; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.apache.poi.ss.usermodel.*; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** ä» ä¿®æ¹å¿ 填表头åä½é¢è²ï¼ä¸æ¹åè¡¨å¤´ææ¬ï¼ä»¥å ç ´åå¯¼å ¥å¹é ã */ public class RequiredHeaderWriteHandler implements CellWriteHandler { private final Map<Short, CellStyle> redStyles = new HashMap<>(); @Override public int order() { return 50000; } @Override public void afterCellDispose(CellWriteHandlerContext context) { if (!Boolean.TRUE.equals(context.getHead()) || context.getHeadData() == null) return; Field field = context.getHeadData().getField(); if (field == null || !required(field)) return; Cell cell = context.getCell(); Workbook workbook = cell.getSheet().getWorkbook(); CellStyle old = cell.getCellStyle(); CellStyle style = redStyles.computeIfAbsent(old.getIndex(), index -> { CellStyle copy = workbook.createCellStyle(); copy.cloneStyleFrom(old); Font source = workbook.getFontAt(old.getFontIndex()); Font font = workbook.createFont(); font.setFontName(source.getFontName()); font.setFontHeight(source.getFontHeight()); font.setBold(source.getBold()); font.setItalic(source.getItalic()); font.setUnderline(source.getUnderline()); font.setStrikeout(source.getStrikeout()); font.setTypeOffset(source.getTypeOffset()); font.setCharSet(source.getCharSet()); font.setColor(IndexedColors.RED.getIndex()); copy.setFont(font); return copy; }); cell.setCellStyle(style); } private boolean required(Field field) { if (field.isAnnotationPresent(ExcelRequired.class) || field.isAnnotationPresent(NotNull.class) || field.isAnnotationPresent(NotBlank.class) || field.isAnnotationPresent(NotEmpty.class)) return true; // Import VO ä¸å¸¸ç¨ OpenAPI ç requiredMode æ æå¿ å¡«ï¼é¿å Excel 模åä¾èµ Swaggerã for (Annotation annotation : field.getAnnotations()) { if (!annotation.annotationType().getName().equals("io.swagger.v3.oas.annotations.media.Schema")) continue; try { if ("REQUIRED".equals(String.valueOf(annotation.annotationType().getMethod("requiredMode").invoke(annotation)))) return true; } catch (ReflectiveOperationException ignored) { return false; } } return false; } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/patrol/MesQcPatrolController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.patrol; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import jakarta.annotation.Resource; import jakarta.validation.Valid; import jakarta.validation.constraints.*; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.annotations.Mapper; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @RestController @RequestMapping("/mes/qc/patrol") @Validated public class MesQcPatrolController { @Resource private PatrolMapper mapper; @Resource private cn.iocoder.yudao.module.mdm.api.item.MdmItemApi itemApi; @Resource private cn.iocoder.yudao.module.system.api.user.AdminUserApi userApi; @TableName("mes_qc_patrol") @Data @EqualsAndHashCode(callSuper = true) public static class Patrol extends BaseDO { @TableId private Long id; @NotBlank @Size(max=100) private String code; @NotBlank @Size(max=255) private String name; @NotNull private Long itemId; @Size(max=128) private String reelNo; @Size(max=128) private String batchCode; @NotNull @DecimalMin("0") private BigDecimal qualifiedQuantity; @NotNull @DecimalMin("0") private BigDecimal unqualifiedQuantity; @NotNull private LocalDateTime inspectDate; @NotNull private Long inspectorUserId; @Size(max=1000) private String remark; } @Data @EqualsAndHashCode(callSuper=true) public static class Query extends PageParam { private String code; private String reelNo; private Long itemId; } @GetMapping("/page") @PreAuthorize("@ss.hasPermission('mes:qc-patrol:query')") public CommonResult<PageResult<Patrol>> page(@Valid Query query) { return success(mapper.selectPage(query, new LambdaQueryWrapperX<Patrol>() .likeIfPresent(Patrol::getCode, query.getCode()).likeIfPresent(Patrol::getReelNo, query.getReelNo()) .eqIfPresent(Patrol::getItemId, query.getItemId()).orderByDesc(Patrol::getId))); } @GetMapping("/get") @PreAuthorize("@ss.hasPermission('mes:qc-patrol:query')") public CommonResult<Patrol> get(@RequestParam Long id) { return success(require(id)); } @PostMapping("/create") @PreAuthorize("@ss.hasPermission('mes:qc-patrol:create')") public CommonResult<Long> create(@Valid @RequestBody Patrol row) { row.setId(null); validate(row); mapper.insert(row); return success(row.getId()); } @PutMapping("/update") @PreAuthorize("@ss.hasPermission('mes:qc-patrol:update')") public CommonResult<Boolean> update(@Valid @RequestBody Patrol row) { if(row.getId()==null) throw new ServiceException(400,"è®°å½ç¼å·ä¸è½ä¸ºç©º"); require(row.getId()); validate(row); mapper.updateById(row); return success(true); } @DeleteMapping("/delete") @PreAuthorize("@ss.hasPermission('mes:qc-patrol:delete')") public CommonResult<Boolean> delete(@RequestParam Long id) { require(id); mapper.deleteById(id); return success(true); } private Patrol require(Long id) { Patrol p=mapper.selectById(id); if(p==null) throw new ServiceException(400,"å·¡æ£è®°å½ä¸åå¨"); return p; } private void validate(Patrol row) { itemApi.validateItemExists(row.getItemId()); userApi.validateUser(row.getInspectorUserId()); if(row.getQualifiedQuantity().add(row.getUnqualifiedQuantity()).signum()<=0) throw new ServiceException(400,"å·¡æ£æ°éå¿ é¡»å¤§äºé¶"); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/patrol/PatrolMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.patrol; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import org.apache.ibatis.annotations.Mapper; @Mapper public interface PatrolMapper extends BaseMapperX<MesQcPatrolController.Patrol> { }