From 0b6ffa350002f657bd9b708ce04ea8a5b525d0f7 Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Fri, 28 Jun 2024 18:52:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=99=E6=96=99=E5=BA=93=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E6=9F=9C=E4=BD=93=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/order/OrderController.java | 78 +++++++------ .../dal/dataobject/plate/PlateDO.java | 4 + .../service/order/OrderServiceImpl.java | 7 +- .../admin/api/webcad/ApiDataAchieve.java | 16 ++- .../admin/api/webcad/ApiTypeRealize.java | 55 +++++---- .../admin/files/excel/ExcelReadUtil.java | 107 ++++++++++++------ .../admin/files/excel/ExcelTypeRealize.java | 14 ++- .../files/excel/OrderPlateImportExcelVO.java | 12 ++ .../resources/mapper/goods/GoodsMapper.xml | 5 +- .../type/生产单Excel导入错误导出模板.xlsx | Bin 24381 -> 24631 bytes .../resources/type/生产单新增Excel模板.xlsx | Bin 28163 -> 28637 bytes .../module/manage/enums/DeletedCodeEnum.java | 23 ++++ .../manage/enums/RemainPlateUseTypeEnum.java | 7 +- .../admin/plate/RemainPlateController.java | 6 +- .../plate/vo/remain/RemainPlateUptReqVO.java | 6 +- .../dal/dataobject/plate/OrderPlateDO.java | 3 + .../mysql/remainplaten/RemainPlateMapper.java | 46 +++++++- .../remainplaten/RemainPlateService.java | 4 +- .../remainplaten/RemainPlateServiceImpl.java | 65 ++++++++--- .../system/enums/ErrorCodeConstants.java | 5 +- 20 files changed, 324 insertions(+), 139 deletions(-) create mode 100644 cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/enums/DeletedCodeEnum.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java index 957ec5462..4fd7102d5 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java @@ -31,11 +31,13 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.pojo.CommonResult.success; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLATE_PLAN_DATA_ERROR; import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.service.order.OrderService; @@ -153,8 +155,8 @@ public class OrderController { @Operation(summary = "生产单详情-数量信息") @Parameter(name = "orderId", description = "生产单编号", example = "1024") @PreAuthorize("@ss.hasPermission('production:manager-list:detail')") - public CommonResult>> getModule(@RequestParam("orderId") Long orderId) { - Map> moduleDOList = orderService.getModule(orderId); + public CommonResult>> getModule(@RequestParam("orderId") Long orderId) { + Map> moduleDOList = orderService.getModule(orderId); return success(moduleDOList); } @@ -173,7 +175,7 @@ public class OrderController { @RequestParam(value = "bodyId", required = false) Long bodyId, @RequestParam(value = "groupId", required = false) Long groupId, @RequestParam(value = "groupName", required = false) String groupName) { - List moduleDOList = orderService.getPlatesDetail(orderId, roomId, bodyId,groupId,groupName); + List moduleDOList = orderService.getPlatesDetail(orderId, roomId, bodyId, groupId, groupName); return success(moduleDOList); } @@ -208,10 +210,13 @@ public class OrderController { @PreAuthorize("@ss.hasPermission('production:manager-list:create')") public CommonResult test(@RequestParam(value = "orderNo", required = false, defaultValue = "20230809027818") String orderNo) throws InterruptedException, ExecutionException { -// return success(orderService.importApiData(orderNo)); + Long organId = SecurityFrameworkUtils.getLoginUser().getOrganId(); String token = apiDataAchieve.getApiToken(organId); JSONObject dataPlates = apiDataAchieve.getApiPlateProData(token, orderNo).get(); + if (!dataPlates.getString("err_code").equals("0")) { + throw exception(PLATE_PLAN_DATA_ERROR); + } JSONObject dataParts = apiDataAchieve.getApiPartsMessage(token, orderNo).get(); JSONObject dataBody = apiDataAchieve.getApiBodyMessage(token, orderNo).get(); JSONObject dataGoods = apiDataAchieve.getApiGoodsMessage(token, orderNo).get(); @@ -240,41 +245,44 @@ public class OrderController { @OperateLog(type = IMPORT) public void exportTest(@RequestPart("file") MultipartFile file, @RequestParam(value = "type", required = false, defaultValue = "true") Integer type, - HttpServletResponse response) throws IOException { - System.out.println("kkkkkkkk"); + HttpServletResponse response) throws IOException { + try { - List list = null; - OrderDO orderDO = new OrderDO(); - if (type == 0) { //excel - // 读取文件 - excelReadUtil.setErr(0); - Map map = excelReadUtil.read(file); + List list = null; + OrderDO orderDO = new OrderDO(); + if (type == 0) { //excel + // 读取文件 + excelReadUtil.setErr(0); + Map map = excelReadUtil.read(file); // System.out.println(" map " + map); - System.err.println(excelReadUtil.isErr()); - // 判断是否读取有误 - if (excelReadUtil.isErr() == -1) { // 文件为空 - ExcelWriterUtil.writeErr(response, "生产单内容为空", orderService.getSavePath() + File.separator + "错误文件.xlsx"); - return; - }else if (excelReadUtil.isErr() > 0) { - // 返回文件 + System.err.println(excelReadUtil.isErr()); + // 判断是否读取有误 + if (excelReadUtil.isErr() == -1) { // 文件为空 + ExcelWriterUtil.writeErr(response, "生产单内容为空", orderService.getSavePath() + File.separator + "错误文件.xlsx"); + return; + } else if (excelReadUtil.isErr() > 0) { + // 返回文件 // System.out.println("(Map) " + (Map) map.get("order")+ " , (List)" +(List) map.get("plate")); - ExcelWriterUtil.write(response, (Map) map.get("order"), (List) map.get("plate"), orderService.getSavePath() + File.separator + "生产单Excel导入错误导出模板.xlsx"); - return; - } else { - // 获取数据 - list = (List) map.get("plate"); - orderDO = excelReadUtil.changeOrderDO((Map) map.get("order")).setOrderType(0).setStatus(1); - if (!orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())){ - ExcelWriterUtil.writeErr(response, "自定义生产单号存在", orderService.getSavePath() + File.separator + "错误文件.xlsx"); + ExcelWriterUtil.write(response, (Map) map.get("order"), (List) map.get("plate"), orderService.getSavePath() + File.separator + "生产单Excel导入错误导出模板.xlsx"); + return; + } else { + // 获取数据 + list = (List) map.get("plate"); + orderDO = excelReadUtil.changeOrderDO((Map) map.get("order")).setOrderType(0).setStatus(1); + if (!orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { + ExcelWriterUtil.writeErr(response, "自定义生产单号存在", orderService.getSavePath() + File.separator + "错误文件.xlsx"); + } } + } else if (type == 1) { // json + + } else if (type == 2) { // xml + } - } else if (type == 1) { // json - - }else if (type == 2) { // xml - + orderService.importExcelData(orderDO, list); + } catch (Exception e) { + ExcelWriterUtil.writeErr(response, "系统出现未知错误,请下载模板,按照模板重新上传文件", orderService.getSavePath() + File.separator + "错误文件.xlsx"); } - orderService.importExcelData(orderDO,list); } @GetMapping("/get-goodsList") @@ -294,8 +302,8 @@ public class OrderController { }) @PreAuthorize("@ss.hasPermission('production:manager-list:create')") public CommonResult uploadOrderType(@RequestPart("file") MultipartFile file, - @RequestParam(value = "type", required = false, defaultValue = "false") Boolean type) { - return success(orderService.importTemplate(file,type)); + @RequestParam(value = "type", required = false, defaultValue = "false") Boolean type) { + return success(orderService.importTemplate(file, type)); } @GetMapping("/printing") @@ -308,6 +316,6 @@ public class OrderController { @RequestParam("type") String type, HttpServletResponse response) { - return success(orderService.getPrintDataMap(orderId,type,response)); + return success(orderService.getPrintDataMap(orderId, type, response)); } } \ 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/dal/dataobject/plate/PlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java index e60348ecd..2ebaab1f9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java @@ -174,6 +174,10 @@ public class PlateDO extends BaseDO { * 是否造型 */ private Boolean isSculpt; + /** + * 是否造型 + */ + private Boolean isRowHole; /** * 排单过滤类型,1 有挖穿造型 2 有挖穿孔 4 有二维刀路 8 可叠 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java index d64ce8f15..fdf6cf77b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderServiceImpl.java @@ -339,8 +339,9 @@ public class OrderServiceImpl implements OrderService { } goodsIdDeleted.add(k); }); - goodsMapper.updateDeletedById(goodsIdDeleted, OrderDeletedEnum.DELETED.getStatus(), SecurityFrameworkUtils.getLoginUser().getOrganId()); - + if (goodsIdDeleted.size()>0){ + goodsMapper.updateDeletedById(goodsIdDeleted, OrderDeletedEnum.DELETED.getStatus(), SecurityFrameworkUtils.getLoginUser().getOrganId()); + } List partsList = orderPartsMapper.selectPartsIdListByBodyId(bodyId, SecurityFrameworkUtils.getLoginUser().getOrganId()); orderPartsMapper.updateDeletedById(partsList, OrderDeletedEnum.DELETED.getStatus(), SecurityFrameworkUtils.getLoginUser().getOrganId()); }); @@ -379,6 +380,7 @@ public class OrderServiceImpl implements OrderService { List orderModelDOs = BeanUtils.toBean(plateDetail, OrderModelDO.class); orderModelDOs.forEach(orderModelDO -> orderModelDO.setOrderId(order.get(0).getId())); orderInputProcessor.batchSaveModel(orderModelDOs); + orderInputProcessor.batchSaveOrderPartsModel(partsRemark); return order.get(0).getId(); } @@ -561,6 +563,7 @@ public class OrderServiceImpl implements OrderService { validateCustomOrderNoExists(orderDO.getCustomOrderNo()); orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, orderDO, goodsDO, plateGoodDOS); orderInputProcessor.batchSaveModel(orderModelDOS); + orderInputProcessor.batchSaveOrderPartsModel(orderPartsRemarks); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiDataAchieve.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiDataAchieve.java index 2fed9a3f0..3b06cb73a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiDataAchieve.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiDataAchieve.java @@ -47,20 +47,18 @@ public class ApiDataAchieve { } // 获取板件生产数据信息 -// @Async + @Async public Future getApiPlateProData(String token, String orderNo) { JSONObject jsonPlatesData = new JSONObject(); jsonPlatesData.put("order_no", orderNo);//生产单号需要传入赋值 jsonPlatesData.put("format", "json"); JSONObject dataPlates = apiDataProduction.getApiOrderMessage(token, jsonPlatesData); - if (!dataPlates.getString("err_code").equals("0")) { - throw exception(PLATE_PLAN_DATA_ERROR); - } + return new AsyncResult<>(dataPlates); } // 获取配件信息 分页获取 -// @Async + @Async public Future getApiPartsMessage(String token, String orderNo) { JSONObject jsonParts = new JSONObject(); jsonParts.put("curr_page", 1); @@ -80,7 +78,7 @@ public class ApiDataAchieve { } // 柜体信息转换 -// @Async + @Async public Future getApiBodyMessage(String token, String orderNo) { JSONObject jsonBody = new JSONObject(); jsonBody.put("curr_page", 1); @@ -100,7 +98,7 @@ public class ApiDataAchieve { } // 商品信息转换 -// @Async + @Async public Future getApiGoodsMessage(String token, String orderNo) { JSONObject jsonGoods = new JSONObject(); jsonGoods.put("curr_page", 1); @@ -120,7 +118,7 @@ public class ApiDataAchieve { } // 板材明细信息转换 -// @Async + @Async public Future getApiPlateDetailMessage(String token, String orderNo) { JSONObject jsonPlates = new JSONObject(); jsonPlates.put("curr_page", 1); @@ -140,7 +138,7 @@ public class ApiDataAchieve { } // 加工组信息转换 -// @Async + @Async public Future getApiGroupMessage(String token, String orderNo) { JSONObject jsonModule = new JSONObject(); jsonModule.put("order_no", orderNo); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java index c672551e4..b4e90cd13 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeRealize.java @@ -25,6 +25,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -44,11 +45,11 @@ public class ApiTypeRealize { @Resource SnowflakeIdWorker3rd idWorker; - private Integer num = 0; +// private Integer num = 0; - private Integer specialShapedNum = 0; +// private Integer specialShapedNum = 0; - private Integer groupNum = 0; +// private Integer groupNum = 0; private final static Integer X = 0; private final static Integer Y = 1; @@ -147,6 +148,7 @@ public class ApiTypeRealize { public Map orderPartsChange(Map orderGroupDO, Map> groupLists, Map items) { + AtomicInteger groupNum = new AtomicInteger(0); groupLists.forEach((k, v) -> { v.forEach(v1 -> { if (items.get(v1) != null) { @@ -171,11 +173,11 @@ public class ApiTypeRealize { } if (items.get(v1).getPlateId() != null) - groupNum++; + groupNum.getAndIncrement(); } }); - orderGroupDO.get(k).setPlateNum(groupNum); - groupNum = 0; + orderGroupDO.get(k).setPlateNum(groupNum.get()); + groupNum.set(0); }); return items; @@ -192,21 +194,22 @@ public class ApiTypeRealize { List orderGroupDOList = orderGroupDO.values().stream().collect(Collectors.toList()); Map orderGroupDOMap = orderGroupDOList.stream().collect(Collectors.toMap(OrderGroupDO::getId, v -> v)); + AtomicInteger specialShapedNum = new AtomicInteger(0); groupPlate.forEach((k, v) -> { // k 加工组id v.forEach(item -> { if (plateDOMap.get(item.getPlateId()) != null) { if (plateDOMap.get(item.getPlateId()).getIsSpecialShaped()) { // 异形相加 - specialShapedNum++; + specialShapedNum.getAndIncrement(); // System.out.println(k + " 对应 " + specialShapedNum); } } }); if (orderGroupDOMap.get(k) != null) {// m 加工组 - orderGroupDOMap.get(k).setUnregularNum(specialShapedNum); + orderGroupDOMap.get(k).setUnregularNum(specialShapedNum.get()); } ; - specialShapedNum = 0; + specialShapedNum.set(0); }); return orderGroupDO; } @@ -341,7 +344,7 @@ public class ApiTypeRealize { .goodsName(goods.getString("GoodsName")) .material(goods.getString("Material")) .color(goods.getString("Color")) - .texture(false) + .texture(getTexture( goods.getJSONObject("ExtraProp"))) .thickness(goods.getDouble("Thickness")) .price(goods.getDouble("Price")) .brand(goods.getString("Brand")) @@ -357,7 +360,7 @@ public class ApiTypeRealize { .goodsName(goods.getString("GoodsName")) .material(goods.getString("Material")) .color(goods.getString("Color")) - .texture(false) + .texture(getTexture( goods.getJSONObject("ExtraProp"))) .width(BigDecimal.valueOf(goods.getDouble("Width"))) .height(BigDecimal.valueOf(goods.getDouble("Height"))) .thickness(BigDecimal.valueOf(goods.getDouble("Thickness"))) @@ -612,7 +615,8 @@ public class ApiTypeRealize { plateInfo.setHeight(BigDecimal.valueOf(jsonObject.getDouble("Height"))) .setWidth(BigDecimal.valueOf(jsonObject.getDouble("Width"))) .setThickness(BigDecimal.valueOf(jsonObject.getDouble("Thickness"))) - .setArea(BigDecimal.valueOf(jsonObject.getDouble("Area"))); + .setArea(BigDecimal.valueOf(jsonObject.getDouble("Area"))) + .setIsRowHole(jsonObject.getBoolean("IsHole")); plateDetail.get(plate.getLong("BlockNo")) .setRemarkJson(jsonObject.getString("RemarkJson")) .setSpecialRemark(jsonObject.getString("SpecialRemark")); @@ -633,24 +637,25 @@ public class ApiTypeRealize { .collect(Collectors.toMap(PlateDO::getId, plate -> plate)); // 板件id为key // 遍历platesDetail - + AtomicInteger NUM = new AtomicInteger(0); + AtomicInteger specialShapedNum = new AtomicInteger(0); platesDetail.forEach((k, v) -> { v.forEach(item -> { - num++; + NUM.getAndIncrement(); if (plateDOMap.get(item.getPlateId()).getIsSpecialShaped()) { // 异形相加 - specialShapedNum++; + specialShapedNum.getAndIncrement(); } }); bodyInfos.forEach((n, m) -> { if (k == m.getId()) { - m.setPlateNum(num); - m.setUnregularNum(specialShapedNum); + m.setPlateNum(NUM.get()); + m.setUnregularNum(specialShapedNum.get()); } }); - num = 0; - specialShapedNum = 0; + NUM.set(0); + specialShapedNum.set(0); }); map.put("platesInfos", platesInfos); map.put("platesItems", platesItem); @@ -934,4 +939,16 @@ public class ApiTypeRealize { } return map; } + + // 纹理解析 + public Boolean getTexture(JSONObject extraProp) { + JSONObject jsonObject = new JSONObject(extraProp); + if (jsonObject.getString("HasWave") != null){ + String hasWave = jsonObject.getString("HasWave").trim(); + if (hasWave.equals("0")){ + return false; + } + } + return true; + } } \ 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/util/fileConversion/admin/files/excel/ExcelReadUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java index 734550347..1aa09c2b8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java @@ -53,7 +53,7 @@ public class ExcelReadUtil { // 文件读取 } if (index.get()) { orderMap.put(item.get(0), item.get(1)); - orderMap.put(item.get(13), item.get(14)); + orderMap.put(item.get(16), item.get(17)); } else { if (!(item.get(0).equals("序号") || item.get(0).equals("###"))) { list.add(changeValue(item)); @@ -145,97 +145,106 @@ public class ExcelReadUtil { // 文件读取 case 9:// 型号 vo.setModel(value); break; - case 10:// 规格 + case 10:// 板材长 + vo.setGoodsHeight(value); + break; + case 11:// 板材宽 + vo.setGoodsWidth(value); + break; + case 12:// 板材厚 + vo.setGoodsThickness(value); + break; + case 13:// 规格 vo.setSpec(value); break; - case 11:// 单位 + case 14:// 单位 vo.setUnit(value); break; - case 12:// 数量 + case 15:// 数量 vo.setGoodsNumber(value); break; - case 13:// 房间 + case 16:// 房间 vo.setRoomsName(value); break; - case 14:// 柜体 + case 17:// 柜体 vo.setCabinetsName(value); break; - case 15:// 加工组类型 + case 18:// 加工组类型 vo.setSynthesisTypeName(value); break; - case 16:// 加工组名称 + case 19:// 加工组名称 vo.setCombinationName(value); break; - case 17://板名称 + case 20://板名称 vo.setName(value); break; - case 18:// 自定义板编号 + case 21:// 自定义板编号 vo.setPlateNo(value); break; - case 19:// 成品长 + case 22:// 成品长 vo.setHeight(value); break; - case 20:// 成品宽 + case 23:// 成品宽 vo.setWidth(value); break; - case 21:// 拆单长 + case 24:// 拆单长 vo.setSplitHeight(value); break; - case 22:// 拆单宽 + case 25:// 拆单宽 vo.setSplitWidth(value); break; - case 23:// 厚 + case 26:// 厚 vo.setThickness(value); break; - case 24:// 左封边 + case 27:// 左封边 vo.setSealLeft(value); break; - case 25:// 右封边 + case 28:// 右封边 vo.setSealRight(value); break; - case 26:// 上封边 + case 29:// 上封边 vo.setSealUp(value); break; - case 27:// 下封边 + case 30:// 下封边 vo.setSealDown(value); break; - case 28:// 排版面 + case 31:// 排版面 vo.setTypographicFace(value); break; - case 29:// 纹路 + case 32:// 纹路 vo.setTexture(value); break; - case 30:// 开门方向 + case 33:// 开门方向 vo.setOpenDoorType(value); break; - case 31://备注1 + case 34://备注1 vo.setRemark1(value); break; - case 32://备注2 + case 35://备注2 vo.setRemark2(value); break; - case 33://备注3 + case 36://备注3 vo.setRemark3(value); break; - case 34://备注4 + case 37://备注4 vo.setRemark4(value); break; - case 35://备注5 + case 38://备注5 vo.setRemark5(value); break; - case 36://备注6 + case 39://备注6 vo.setRemark6(value); break; - case 37://备注7 + case 40://备注7 vo.setRemark7(value); break; - case 38://备注8 + case 41://备注8 vo.setRemark8(value); break; - case 39://备注9 + case 42://备注9 vo.setRemark9(value); break; - case 40://备注10 + case 43://备注10 vo.setRemark10(value); break; default: @@ -274,6 +283,40 @@ public class ExcelReadUtil { // 文件读取 errList.add("纹理无效"); } } + // 大板长宽厚数据不可为空 + if (StringUtils.isEmpty(vo.getGoodsHeight()) && StringUtils.isEmpty(vo.getGoodsWidth()) && StringUtils.isEmpty(vo.getGoodsThickness())) { + flag = false; + errList.add("板材长宽厚数据不能为空"); + }else { + // 大板长宽厚数据不为空,检查数据格式 + if (!convertToDouble(vo.getGoodsHeight())) { + flag = false; + errList.add("板材长数据类型错误"); + } else { + if (!checkPrecision(vo.getGoodsHeight())) { + flag = false; + errList.add("板材长数据长度错误"); + } + } + if (!convertToDouble(vo.getGoodsWidth())) { + flag = false; + errList.add("板材宽数据类型错误"); + } else { + if (!checkPrecision(vo.getGoodsWidth())) { + flag = false; + errList.add("板材宽数据长度错误"); + } + } + if (!convertToDouble(vo.getGoodsThickness())) { + flag = false; + errList.add("板材厚数据类型错误"); + } else { + if (!checkPrecision(vo.getGoodsThickness())) { + flag = false; + errList.add("板材厚数据长度错误"); + } + } + } if (StringUtils.isEmpty(vo.getRoomsName()) && StringUtils.isEmpty(vo.getCabinetsName()) && StringUtils.isEmpty(vo.getName())) { flag = false; errList.add("房间、柜体、板名称不能为空"); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java index 59c603e6b..5ea91a3a4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java @@ -90,6 +90,9 @@ public class ExcelTypeRealize { p.getColor(), p.getSpec(), p.getWave(), // 纹理 + p.getGoodsHeight(), + p.getGoodsWidth(), + p.getGoodsThickness(), // p.getModel(), p.getBrand()), Collectors.toList() @@ -97,14 +100,14 @@ public class ExcelTypeRealize { goodsMap.forEach((goodKey, goodValue) -> { // 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods -// 规格分解 - List specList = spec(goodValue.get(0).getSpec()); RawGoodsDO rawGoodsDO = setRawGoodsDO(goodValue.get(0)).setId((Long) snowFlakeGenerator.nextId(null)).setOrderId(orderId); rawGoodsDOS.add(rawGoodsDO); Long goodId = (Long) snowFlakeGenerator.nextId(null); GoodsDO plateDO = setGoodsDO(goodValue.get(0)).setId(goodId).setOrderId(orderId) .setRawGoodsId(String.valueOf(rawGoodsDO.getId())) - .setHeight(BigDecimal.valueOf(specList.get(0))).setWidth(BigDecimal.valueOf(specList.get(1))); // 在good_id为空的时候,首先赋值为空值 + .setHeight(BigDecimal.valueOf(Double.parseDouble(goodValue.get(0).getGoodsHeight()))) + .setWidth(BigDecimal.valueOf(Double.parseDouble(goodValue.get(0).getGoodsWidth()))) + .setThickness(BigDecimal.valueOf(Double.parseDouble(goodValue.get(0).getGoodsThickness()))); // 在good_id为空的时候,首先赋值为空值 goodsDOS.add(plateDO); // 赋值给板件未对应前order_raw_goods的id for (OrderPlateImportExcelVO reqVO : goodValue) { @@ -112,14 +115,15 @@ public class ExcelTypeRealize { } }); } else { // 商品编码有的 - List specList = spec(value.get(0).getSpec()); // 板材信息合集,添加生产单id,添加生产单板材设计端商品编码,板材信息写入order_raw_goods RawGoodsDO rawGoodsDO = setRawGoodsDO(value.get(0)).setId((Long) snowFlakeGenerator.nextId(null)).setOrderId(orderId); rawGoodsDOS.add(rawGoodsDO); Long goodId = (Long) snowFlakeGenerator.nextId(null); GoodsDO plateDO = setGoodsDO(value.get(0)).setId(goodId).setOrderId(orderId) .setRawGoodsId(String.valueOf(rawGoodsDO.getId())).setGoodsId(String.valueOf(rawGoodsDO.getRawGoodsId())) - .setHeight(BigDecimal.valueOf(specList.get(0))).setWidth(BigDecimal.valueOf(specList.get(1))); + .setHeight(BigDecimal.valueOf(Double.parseDouble(value.get(0).getGoodsHeight()))) + .setWidth(BigDecimal.valueOf(Double.parseDouble(value.get(0).getGoodsWidth()))) + .setThickness(BigDecimal.valueOf(Double.parseDouble(value.get(0).getGoodsThickness()))); goodsDOS.add(plateDO); // 赋值给板件未对应前order_raw_goods的id for (OrderPlateImportExcelVO reqVO : value) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java index 049f65965..1359180e0 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderPlateImportExcelVO.java @@ -69,6 +69,18 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String model; + @ExcelProperty(value = "板材长") + @JsonIgnore + private String goodsHeight; + + @ExcelProperty(value = "板材宽") + @JsonIgnore + private String goodsWidth; + + @ExcelProperty(value = "板材厚") + @JsonIgnore + private String goodsThickness; + @ExcelProperty(value = "规格") @JsonIgnore private String spec; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index c9c8cdac7..f5ae792a3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -47,8 +47,9 @@ UPDATE order_goods SET deleted = #{deleted} WHERE id IN - + #{id} - AND organ_id = #{organId} + + AND organ_id = #{organId} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单Excel导入错误导出模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单Excel导入错误导出模板.xlsx index 643be051e218f0f92d7d312f459967ce0e2bb15b..e09ec97b87c53e5000b22969bdcb440daadf55bc 100644 GIT binary patch delta 12392 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 Dpqtot diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单新增Excel模板.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/生产单新增Excel模板.xlsx index 9aa231dbcd4679915a339b1bdc8bdbcbacdc2080..22a672f7545f052a9302e70c9fa7b1050fb62eae 100644 GIT binary patch delta 16473 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 delta 16542 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 createRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO createReqVO) { + public CommonResult createRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO createReqVO) { return success(remainPlateService.createRemainPlate(createReqVO)); } @@ -66,7 +66,7 @@ public class RemainPlateController { @Operation(summary = "余料板批量核销") @PreAuthorize("@ss.hasPermission('placeorder:remain')") public CommonResult updateRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { - remainPlateService.updateRemainPlateStatus(updateReqVO.getIds(), + remainPlateService.updateRemainPlateStatus(updateReqVO.getId(), updateReqVO.getStatus(), updateReqVO.getUseType(), updateReqVO.getPlanId()); @@ -77,7 +77,7 @@ public class RemainPlateController { @Operation(summary = "余料板批量释放") @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") public CommonResult revertRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { - remainPlateService.revertRemainPlateStatus(updateReqVO.getIds(),updateReqVO.getStatus()); + remainPlateService.revertRemainPlateStatus(updateReqVO.getId(),updateReqVO.getStatus()); return success(true); } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java index 45081e13f..800bc1cdb 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/remain/RemainPlateUptReqVO.java @@ -9,13 +9,13 @@ import java.util.Set; @Data public class RemainPlateUptReqVO { - @Schema(description = "余料板集", requiredMode = Schema.RequiredMode.REQUIRED, example = "16470") - private Set ids; + @Schema(description = "余料板集", example = "16470") + private Set id; @Schema(description = "余料板状态,0未使用,1使用中", example = "1") private Integer status; - @Schema(description = "使用类型,0核销,1排单,2补板", example = "0") + @Schema(description = "使用类型,1核销,2排单,3补板", example = "0") private Integer useType; @Schema(description = "排单 ID", example = "6628") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/OrderPlateDO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/OrderPlateDO.java index 460c89f75..5f811e46e 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/OrderPlateDO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/OrderPlateDO.java @@ -116,6 +116,9 @@ public class OrderPlateDO extends BaseDO { // 是否孤形对角 private Boolean isArcAcross; + // 是否排孔 + private Boolean isRowHole; + // 模块类型 ID private Long moduleTypeId; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java index 3cdc618b0..a68f95b92 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/remainplaten/RemainPlateMapper.java @@ -1,5 +1,6 @@ package com.cf.imes.module.manage.dal.mysql.remainplaten; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -8,6 +9,7 @@ import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlatePag import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; import java.util.Set; /** @@ -20,20 +22,21 @@ public interface RemainPlateMapper extends BaseMapperX { default PageResult selectPage(RemainPlatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RemainPlateDO::getId, reqVO.getId()) .eqIfPresent(RemainPlateDO::getPlanId, reqVO.getPlanId()) .eqIfPresent(RemainPlateDO::getInitPlanId, reqVO.getInitPlanId()) .eqIfPresent(RemainPlateDO::getStatus, reqVO.getStatus()) .eqIfPresent(RemainPlateDO::getGoodsId, reqVO.getGoodsId()) .eqIfPresent(RemainPlateDO::getIsCutting, reqVO.getIsCutting()) .likeIfPresent(RemainPlateDO::getName, reqVO.getName()) - .eqIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) - .eqIfPresent(RemainPlateDO::getColor, reqVO.getColor()) + .likeIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(RemainPlateDO::getColor, reqVO.getColor()) .eqIfPresent(RemainPlateDO::getThickness, reqVO.getThickness()) .eqIfPresent(RemainPlateDO::getBrand, reqVO.getBrand()) .eqIfPresent(RemainPlateDO::getPlaceStyle, reqVO.getPlaceStyle()) - .eqIfPresent(RemainPlateDO::getStore, reqVO.getStore()) + .likeIfPresent(RemainPlateDO::getStore, reqVO.getStore()) .eqIfPresent(RemainPlateDO::getCount, reqVO.getCount()) - .eqIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) + .likeIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) .eqIfPresent(RemainPlateDO::getUseType, reqVO.getUseType()) .eqIfPresent(RemainPlateDO::getOrganId, reqVO.getOrganId()) .eqIfPresent(RemainPlateDO::getOutLineJson, reqVO.getOutLineJson()) @@ -52,4 +55,39 @@ public interface RemainPlateMapper extends BaseMapperX { .eq("organ_id",organId) .in("id", ids)); } + + // 查询该排单是否已经添加余料 + default List selectRemainPlatesByInitPlanId(Long initPlanId, Integer deleted, Long organId) { + return selectList(new LambdaUpdateWrapper() + .eq(RemainPlateDO::getInitPlanId, initPlanId) + .eq(RemainPlateDO::getDeleted, deleted) + .eq(RemainPlateDO::getOrganId, organId)); + } + + // 判断该排单是否存在以使用的余料 + default List selectRemainPlatesByPlanId(Long planId, Integer status, Integer deleted, Long organId) { + return selectList(new LambdaUpdateWrapper() + .eq(RemainPlateDO::getPlanId, planId) + .eq(RemainPlateDO::getStatus, status) + .eq(RemainPlateDO::getDeleted, deleted) + .eq(RemainPlateDO::getOrganId, organId)); + } + + // 通过排单id批量余料板 + default void deleteRemainPlate(Long initPlanId, Long organId) { + update(new UpdateWrapper() + .set("deleted", 1) + .eq("init_plan_id", initPlanId) + .eq("organ_id", organId)); + } + + // 根据使用排单id批量还原状态 + default void updateRemainPlateStatusByPlanId(Integer status, Integer useType,Long organId,Long planId) { + update(new UpdateWrapper() + .set("status", status) + .set("use_type", useType) + .set("plan_id","") + .eq("organ_id",organId) + .eq("plan_id", planId)); + } } \ No newline at end of file diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java index d6ece6124..029fc6723 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateService.java @@ -21,12 +21,12 @@ public interface RemainPlateService { * @param createReqVO 创建信息 * @return 编号 */ - Long createRemainPlate(@Valid RemainPlateSaveReqVO createReqVO); + Boolean createRemainPlate(@Valid RemainPlateSaveReqVO createReqVO); /** * 创建生产单余料板表 * - * @param createReqVOS 创建信息 + * @param createReqVOS 创建信息 多个 * @return 编号 */ Boolean createRemainPlateMultiple(@Valid Set createReqVOS); diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java index a195597bb..e785eafee 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/remainplaten/RemainPlateServiceImpl.java @@ -5,6 +5,7 @@ import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlatePag import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateSaveReqVO; import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.manage.dal.mysql.remainplaten.RemainPlateMapper; +import com.cf.imes.module.manage.enums.DeletedCodeEnum; import com.cf.imes.module.manage.enums.RemainPlateStatusEnum; import com.cf.imes.module.manage.enums.RemainPlateUseTypeEnum; import org.springframework.stereotype.Service; @@ -35,18 +36,29 @@ public class RemainPlateServiceImpl implements RemainPlateService { private RemainPlateMapper remainPlateMapper; @Override - public Long createRemainPlate(RemainPlateSaveReqVO createReqVO) { + public Boolean createRemainPlate(RemainPlateSaveReqVO createReqVO) { + List remainPlates = new ArrayList<>(); // 插入 - RemainPlateDO remainPlate = BeanUtils.toBean(createReqVO, RemainPlateDO.class); - remainPlateMapper.insert(remainPlate); - // 返回 - return remainPlate.getId(); + if (createReqVO.getCount() > 1) { + for (int i = 0; i < createReqVO.getCount(); i++) { + RemainPlateDO remainPlate = BeanUtils.toBean(createReqVO, RemainPlateDO.class).setCount(1); + remainPlates.add(remainPlate); + } + } + // 批量增加 + return remainPlateMapper.insertBatch(remainPlates); } @Override + @Transactional(rollbackFor = Exception.class) public Boolean createRemainPlateMultiple(Set createReqVOS) { Collection remainPlates = new ArrayList<>(); createReqVOS.forEach(createReqVO -> { + // 判断该排单是否已经添加过余料 + if (remainPlateMapper.selectRemainPlatesByInitPlanId(createReqVO.getInitPlanId(), DeletedCodeEnum.NOT_DELETED.getStatus(), OrganContextHolder.getOrganId()).size() > 0) { + // 删除余料 + remainPlateMapper.deleteRemainPlate(createReqVO.getInitPlanId(), OrganContextHolder.getOrganId()); + } RemainPlateDO remainPlate = BeanUtils.toBean(createReqVO, RemainPlateDO.class); remainPlates.add(remainPlate); }); @@ -55,25 +67,39 @@ public class RemainPlateServiceImpl implements RemainPlateService { @Override @Transactional(rollbackFor = Exception.class) - public void updateRemainPlateStatus(Set ids, Integer status, Integer useType,Long planId) { - //判断是否符合核销标准 - validateRemainPlateStatus(ids,RemainPlateStatusEnum.IN_USE.getStatus()); - //以id为条件批量修改余料库中的状态 - remainPlateMapper.updateRemainPlateStatus(ids, status, useType, OrganContextHolder.getOrganId(),planId); + public void updateRemainPlateStatus(Set ids, Integer status, Integer useType, Long planId) { + if (useType != RemainPlateUseTypeEnum.TYPE_ONE.getStatus() && useType != RemainPlateUseTypeEnum.TYPE_ZERO.getStatus()) { //余料使用状态为2或3 + // 判断该排单是否存在以使用的余料 + if (remainPlateMapper.selectRemainPlatesByPlanId(planId, RemainPlateStatusEnum.IN_USE.getStatus(), + DeletedCodeEnum.NOT_DELETED.getStatus(), OrganContextHolder.getOrganId()).size() > 0) { + // 余料状态还原 + remainPlateMapper.updateRemainPlateStatusByPlanId(RemainPlateStatusEnum.UNUSED.getStatus(), RemainPlateUseTypeEnum.TYPE_ZERO.getStatus(), + OrganContextHolder.getOrganId(), planId); + } + } + if (ids != null){ + //判断是否符合核销标准 + validateRemainPlateStatus(ids, RemainPlateStatusEnum.IN_USE.getStatus()); + //以id为条件批量修改余料库中的状态 + remainPlateMapper.updateRemainPlateStatus(ids, status, useType, OrganContextHolder.getOrganId(), planId); + } } @Override @Transactional(rollbackFor = Exception.class) public void revertRemainPlateStatus(Set ids, Integer status) { + if (ids == null) { + throw exception(REMAIN_PLATE_ID_NOT_EXISTS); + } // 判断余料的状态是否存在使用中 - validateRemainPlateStatus(ids,RemainPlateStatusEnum.UNUSED.getStatus()); + validateRemainPlateStatus(ids, RemainPlateStatusEnum.UNUSED.getStatus()); // 判断使用类型是否为核销 for (Long id : ids) { - if (validateRemainPlateUseType(id).equals( RemainPlateUseTypeEnum.TYPE_ONE.getStatus())) { + if (!validateRemainPlateUseType(id).equals(RemainPlateUseTypeEnum.TYPE_ONE.getStatus())) { throw exception(REMAIN_PLATE_USR_TYPE); } } - remainPlateMapper.updateRemainPlateStatus(ids, status, null, OrganContextHolder.getOrganId(),0L); + remainPlateMapper.updateRemainPlateStatus(ids, status, null, OrganContextHolder.getOrganId(), 0L); } @Override @@ -81,14 +107,14 @@ public class RemainPlateServiceImpl implements RemainPlateService { // 校验存在 validateRemainPlateExists(updateReqVO.getId()); // 是否使用 - if (validateRemainPlateStatus(updateReqVO.getId()) == RemainPlateStatusEnum.IN_USE.getStatus()){ + if (validateRemainPlateStatus(updateReqVO.getId()) == RemainPlateStatusEnum.IN_USE.getStatus()) { throw exception(REMAIN_PLATE_STATUS_USED); } // 判断是否为开料添加 RemainPlateDO updateObj = new RemainPlateDO(); - if (validateRemainPlateIsCutting(updateReqVO.getId())){ + if (validateRemainPlateIsCutting(updateReqVO.getId())) { updateObj.setRemark(updateReqVO.getRemark()); - }else { + } else { // 更新 updateObj = BeanUtils.toBean(updateReqVO, RemainPlateDO.class); } @@ -98,8 +124,11 @@ public class RemainPlateServiceImpl implements RemainPlateService { @Override @Transactional(rollbackFor = Exception.class) public void deleteRemainPlate(Set ids) { + if (ids == null) { + throw exception(REMAIN_PLATE_ID_NOT_EXISTS); + } // 判断余料的状态是否存在使用中 - validateRemainPlateStatus(ids,RemainPlateStatusEnum.IN_USE.getStatus()); + validateRemainPlateStatus(ids, RemainPlateStatusEnum.IN_USE.getStatus()); // 删除 remainPlateMapper.deleteBatchIds(ids); } @@ -123,7 +152,7 @@ public class RemainPlateServiceImpl implements RemainPlateService { } private boolean validateRemainPlateIsCutting(Long id) { - return remainPlateMapper.selectById(id).getIsCutting(); + return remainPlateMapper.selectById(id).getIsCutting(); } private Integer validateRemainPlateStatus(Long id) { 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 4f373d206..0733861d8 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 @@ -269,6 +269,7 @@ public interface ErrorCodeConstants { ErrorCode ERR = new ErrorCode(1_002_038_001, "未知错误"); ErrorCode REMAIN_PLATE_STATUS_USED = new ErrorCode(1_002_038_001, "余料板正在使用中,禁止修改"); - ErrorCode REMAIN_PLATE_STATUS_NO_USED = new ErrorCode(1_002_038_001, "余料板未使用"); - ErrorCode REMAIN_PLATE_USR_TYPE = new ErrorCode(1_002_038_001, "余料板使用类型为不可核销类型"); + ErrorCode REMAIN_PLATE_STATUS_NO_USED = new ErrorCode(1_002_038_002, "余料板未使用"); + ErrorCode REMAIN_PLATE_USR_TYPE = new ErrorCode(1_002_038_003, "余料板使用类型为不可核销类型"); + ErrorCode REMAIN_PLATE_ID_NOT_EXISTS = new ErrorCode(1_002_038_004, "未选中余料板,请选择余料板"); }