From b7ee75e9e4ab23a155c62316afb132592274cda7 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 3 Jul 2025 16:17:12 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=9D=BF=E6=9D=90=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E4=B8=80=E6=AC=A1=E6=80=A7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=95=86=E5=93=81=E7=BC=96=E5=8F=B7=E3=80=81=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=BB=84=E5=90=88=E5=94=AF=E4=B8=80=E6=80=A7=E5=9C=A8?= =?UTF-8?q?=E5=86=85=E5=AD=98=E4=B8=AD=E6=8E=92=E9=87=8D=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=E6=9D=BF=E6=9D=90?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E3=80=81=E6=9D=90=E8=B4=A8=E3=80=81=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E3=80=81=E5=8E=9A=E5=BA=A6=E3=80=81=E5=93=81=E7=89=8C?= =?UTF-8?q?=E3=80=81=E7=BA=B9=E8=B7=AF=E5=9C=A8=E7=BB=84=E7=BB=87=E5=86=85?= =?UTF-8?q?=E5=94=AF=E4=B8=80=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/plate/PlateManageController.java | 22 +------- .../manage/plate/vo/plate/PlateRespVO.java | 12 ++-- .../dal/mysql/plate/PlateGoodMapper.java | 8 +++ .../manage/plate/PlateExcelListener.java | 47 ++++++++++++++-- .../manage/plate/PlateManageService.java | 23 ++++++++ .../manage/plate/PlateManageServiceImpl.java | 53 +++++++++++++++++- .../mapper/plate/PlateGoodMapper.xml | 7 +++ .../main/resources/type/excel_plate_add.xlsx | Bin 12065 -> 11163 bytes .../system/enums/ErrorCodeConstants.java | 4 +- 9 files changed, 140 insertions(+), 36 deletions(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java index 9ed139763..cc4bad40f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java @@ -124,26 +124,9 @@ public class PlateManageController { @Operation(summary = "获得导入用户模板") @PreAuthorize("@ss.hasAnyPermissions('system:plate:export-template','base:plate:export-template')") public void importTemplate(HttpServletResponse response) throws IOException { -// // 手动创建导出 demo -// List list = Arrays.asList( -// PlateImportExcelVO.builder().goodsId("BD10010001").goodsName("18mm-多层板-暖白").material("多层板").width(String.valueOf(1220)).height(String.valueOf(2440)) -// .thickness(String.valueOf(18)).brand("AAA").spec("2440*1220*18").color("暖白").price("120").texture("无").build(), -// PlateImportExcelVO.builder().goodsId("BD10010002").goodsName("18mm-颗粒板-高级灰").material("多层板").width(String.valueOf(1220)).height(String.valueOf(2750)) -// .thickness(String.valueOf(18)).brand("鸿达树").spec("2750*1220*18").color("高级灰").price("120").texture("无").build() -// ); -// // 输出 -// ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list); - plateService.exportTemplate(response, "excel_plate_add.xlsx"); } -// @GetMapping("/get-import-template") -// @Operation(summary = "获得导入板材模板") -// @Parameter(name = "value", description = "文件类型", required = true, example = "0") -// public void importTemplate(HttpServletResponse response, @RequestParam("value") @NotEmpty(message = "文件路径不能为空") String value) { -// plateService.exportTemplate(response, value); -// } - @PostMapping("/import") @Operation(summary = "导入板材") @Parameters({ @@ -152,14 +135,13 @@ public class PlateManageController { @Parameter(name = "organId", description = "板材所属组织ID") }) @OperateLog(type = IMPORT) -// @PreAuthorize("@ss.hasPermission('manage:plate:import')") @PreAuthorize("@ss.hasAnyPermissions('manage:plate:import','base:plate:import')") public void importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport, @RequestParam(value = "organId") Long organId, HttpServletResponse response) throws Exception { ExcelReadUtil excelReadUtil = new ExcelReadUtil(); - PlateExcelListener listener = new PlateExcelListener(updateSupport, plateService); + PlateExcelListener listener = new PlateExcelListener(updateSupport, plateService, organId); List list = excelReadUtil.read(file, PlateImportExcelVO.class, listener); // 判断文件是否导入成功 @@ -174,8 +156,6 @@ public class PlateManageController { plateService.importPlateList(list, updateSupport, organId);// 成功,批量导入 } } - -// plateExcelUtil.clear(); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java index f3a770f18..1f29836d2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.convert.DictConvert; import com.cf.imes.module.executor.enums.DictTypeConstants; @@ -21,19 +22,19 @@ public class PlateRespVO { private Long id; @Schema(description = "客户的商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("商品编号") + @ExcelProperty("*商品编号") private String goodsId; @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") - @ExcelProperty("商品名称") + @ExcelProperty("*商品名称") private String goodsName; @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("材质") + @ExcelProperty("*材质") private String material; @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("颜色") + @ExcelProperty("*颜色") private String color; @Schema(description = "纹理", example = "有") @@ -50,7 +51,8 @@ public class PlateRespVO { private Double height; @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("厚度") + @ExcelProperty("*厚度") + @ColumnWidth(10) private Double thickness; @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java index 7374e17d3..02444a80f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java @@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.LinkedHashMap; import java.util.List; /** @@ -179,4 +180,11 @@ public interface PlateGoodMapper extends BaseMapperX { .eq(PlateGoodDO::getDeleted, 0)); } + /** + * 查询机构下名称、材质、颜色、厚度、品牌、纹路的分组 + * + * @param organId + * @return + */ + List> getOrgAttrGroup(@Param("organId") Long organId); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java index 830b97ba4..72144579b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java @@ -10,8 +10,11 @@ import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; @Slf4j public final class PlateExcelListener extends ExcelListener { @@ -30,9 +33,24 @@ public final class PlateExcelListener extends ExcelListener plateGoodsId; + + private List orgAttrGroupList; + + public PlateExcelListener(boolean updateSupport, PlateManageService plateManageService, Long organId) { this.updateSupport = updateSupport; this.plateManageService = plateManageService; + // 查询机构下的所有板材商品编号 + plateGoodsId = plateManageService.getOrgPlateGoodsId(organId); + + // 查询机构下名称、材质、颜色、厚度、品牌、纹路的分组 + List> orgAttrGroup = plateManageService.getOrgAttrGroup(organId); + + orgAttrGroupList = orgAttrGroup.stream() + .map(map -> map.values().stream() + .map(String::valueOf) // 确保都转为字符串 + .collect(Collectors.joining("-"))) + .collect(Collectors.toList()); } /** @@ -60,6 +78,8 @@ public final class PlateExcelListener extends ExcelListener extends ExcelListener getPlateAll(); + + /** + * 查询机构下所有商品编号 + * + * @param organId + * @return + */ + Set getOrgPlateGoodsId(Long organId); + + /** + * 查询机构下名称、材质、颜色、厚度、品牌、纹路的分组 + * + * @param organId + * @return + */ + List> getOrgAttrGroup(Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java index a2b2ca3c8..e80f3d576 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java @@ -7,6 +7,7 @@ import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportExcelVO; @@ -28,9 +29,11 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -43,6 +46,7 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLATE_IMPORT_INTERRUPT_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLATE_IMPORT_QUERY_INTERRUPT_ERROR; import static com.cf.imes.module.executor.framework.executor.config.ExecutorThreadPoolConfiguration.EXECUTOR_IMPOT_THREAD_POOL_TASK_EXECUTOR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_ATTR_GROUP_EXISTS; import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_GOODS_ID_NOT_SAME; import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_NOT_EXISTS; @@ -85,9 +89,12 @@ public class PlateManageServiceImpl implements PlateManageService { public Long createPlate(PlateSaveReqVO createReqVO) { PlateGoodDO plate = BeanUtils.toBean(createReqVO, PlateGoodDO.class); + Long organId = getOrganId(BASE_PLATE_CREATE_PERMISSION, getLoginUser().getId(), plate.getOrganId()); // 判断板材是否存在 - validateGoodExists(plate.getGoodsId(), - getOrganId(BASE_PLATE_CREATE_PERMISSION, getLoginUser().getId(), plate.getOrganId())); + validateGoodExists(plate.getGoodsId(), organId); + + // 校验板材名称、材质、颜色、厚度、品牌、纹路在组织内唯一 + validateGoodAttr(plate, organId); plateGoodMapper.insert(plate);// 组织id未传输 // 返回 @@ -110,9 +117,35 @@ public class PlateManageServiceImpl implements PlateManageService { if (plateGoodMapper.isByGoodIDAndId(updateReqVO.getGoodsId(), organId, Long.valueOf(updateReqVO.getId()))) { throw exception(PLATE_GOODS_ID_NOT_SAME); } + + // 校验板材名称、材质、颜色、厚度、品牌、纹路在组织内唯一 + validateGoodAttr(updateObj, organId); plateGoodMapper.updateById(updateObj); } + /** + * 校验板材名称、材质、颜色、厚度、品牌、纹路在组织内唯一 + * + * @param plate + */ + private void validateGoodAttr(PlateGoodDO plate, Long organId) { + if (ObjectUtil.isNull(plate.getTexture())) { + plate.setTexture(false); + } + Long count = plateGoodMapper.selectCount(new LambdaQueryWrapperX() + .eq(PlateGoodDO::getGoodsName, plate.getGoodsName()) + .eq(PlateGoodDO::getOrganId, organId) + .eq(PlateGoodDO::getMaterial, plate.getMaterial()) + .eq(PlateGoodDO::getColor, plate.getColor()) + .eq(PlateGoodDO::getThickness, plate.getThickness()) + .eqIfPresent(PlateGoodDO::getBrand, plate.getBrand()) + .neIfPresent(PlateGoodDO::getId, plate.getId()) + .eq(PlateGoodDO::getTexture, plate.getTexture())); + if (count > 0) { + throw exception(PLATE_ATTR_GROUP_EXISTS); + } + } + @Override @OrganIgnore @Transactional(rollbackFor = Exception.class) @@ -367,6 +400,22 @@ public class PlateManageServiceImpl implements PlateManageService { return plateGoodMapper.getAllByOrganId(OrganContextHolder.getOrganId()); } + @Override + @OrganIgnore + public Set getOrgPlateGoodsId(Long organId) { + return plateGoodMapper.selectList(new LambdaQueryWrapper() + .eq(PlateGoodDO::getOrganId, getOrganId(BASE_PLATE_IMPORT_PERMISSION, getLoginUser().getId(), organId)) + .eq(PlateGoodDO::getDeleted, false) + .select(PlateGoodDO::getGoodsId)) + .stream().map(PlateGoodDO::getGoodsId).collect(Collectors.toSet()); + } + + @Override + @OrganIgnore + public List> getOrgAttrGroup(Long organId) { + return plateGoodMapper.getOrgAttrGroup(organId); + } + private void validateOrganExists(Long organId) { CommonResult index = organApi.validOrgan(organId); if (!index.isSuccess()) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml index 3c708a400..e618d689a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml @@ -27,4 +27,11 @@ where organ_id = #{organId} and id = #{id} and deleted = 0 + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_plate_add.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_plate_add.xlsx index 299136115aa08d8e652cfac9124c9ed669296092..3fefad028222dd74b9a95f3da5eaca08fedde56e 100644 GIT binary patch literal 11163 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 DHCK@| diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index 09a46f128..d05117af7 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -268,9 +268,7 @@ public class ErrorCodeConstants { public static final ErrorCode PLATE_NOT_EXISTS = new ErrorCode(1_002_033_008, "板材标识代号禁止空"); public static final ErrorCode PLATE_GOODS_ID_NOT_SAME = new ErrorCode(1_002_033_009, "板材商品编号存在,请重新命名商品编号"); public static final ErrorCode PLATE_IS_SOURCE = new ErrorCode(1_002_033_010, "小板:{} 为源小板,无法删除"); - public static final ErrorCode PLAN_GOODS_IS_FILTER_DATA_ERROR = new ErrorCode(1_002_033_011, "当前排单为非混单,无法添加颜色的筛选条件"); - public static final ErrorCode PLAN_STATUS_ERROR = new ErrorCode(1_002_033_012, "当前排单未投产,无法进行开料"); - + public static final ErrorCode PLATE_ATTR_GROUP_EXISTS = new ErrorCode(1_002_033_011, "当前名称、材质、颜色、厚度、品牌、纹路的组合已存在,请检查后提交"); //=========== 工序信息 1-002-034-000 ============