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 bd4cad18d..90bce9097 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 @@ -6,7 +6,9 @@ import com.cf.imes.module.executor.dal.dataobject.orderModuleExtra.OrderModuleEx import com.cf.imes.module.executor.service.order.OrderInputProcessor; import com.cf.imes.module.executor.util.FileTypeChangeUtil; import com.cf.imes.module.executor.util.deviseData.Detail; +import com.cf.imes.module.executor.util.fileConversion.admin.files.excel.OrderPlateImportExcelVO; import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.util.ObjectUtils; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.*; @@ -170,35 +172,33 @@ public class OrderController { @Parameter(name = "orderSaveReqVO", description = "生产单新增参数", required = true) }) @PreAuthorize("@ss.hasPermission('executor:order:import')") - public CommonResult importExcel(@RequestPart("file") MultipartFile file, - @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, - @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, - @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO) throws IOException { - OrderImportRespVO orderImportRespVO = OrderImportRespVO.builder().createOrder(new ArrayList<>()) - .updateOrder(new ArrayList<>()).failureOrder(new LinkedHashMap<>()).build(); - + public CommonResult> importExcel(@RequestPart("file") MultipartFile file, + @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, + @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, + @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO) throws IOException { + Map map = new HashMap<>(); // 判断是否更新板材 - if(!isAddPlate){//不需要添加板材 - if(upload){ + if (!isAddPlate) {//不需要添加板材 + if (upload) { orderService.updateOrder(createReqVO);//更新 - orderImportRespVO.getUpdateOrder().add(createReqVO.getId()+"单独更新生产单成功"); - }else { + map.put(true, "单独更新生产单成功"); + } else { Long id = orderService.createOrder(createReqVO);//新建 - orderImportRespVO.getCreateOrder().add(id + "单独新增生产单成功"); + map.put(true, "单独新增生产单成功"); } - return success(orderImportRespVO); - }else { + return success(map); + } else { Long id = 0L; if (upload) { orderService.updateOrder(createReqVO);//更新 id = createReqVO.getId(); - orderImportRespVO.getUpdateOrder().add(id + "新增生产单成功"); + map.put(true, "单独更新生产单成功"); } else { id = orderService.createOrder(createReqVO);//新建 - orderImportRespVO.getCreateOrder().add(id + "新增生产单成功"); + map.put(true, "单独新增生产单成功"); } // 解析导入文件,生成统一格式 - List list = new ArrayList<>(); + List list = new ArrayList<>(); if (createReqVO.getDataType() == 1) {//CAD } else if (createReqVO.getDataType() == 2) {//WebCAD @@ -208,17 +208,70 @@ public class OrderController { list = fileTypeChangeUtil.fileDataChange(file); } if (list == null || list.size() == 0) { - orderImportRespVO.getFailureOrder().put("生产单导入错误", String.valueOf(fileTypeChangeUtil.getValue())); - return success(orderImportRespVO); + map.put(false, "导入文件有误"); + return success(map); } // OrderImportRespVO respVO = orderService.importOrderList(list , id , orderImportRespVO); - orderInputProcessor.input(list , id); - return success(orderImportRespVO); + orderInputProcessor.input((List) list, id); +// 是否新增成功需要返回 + map.putIfAbsent(true, "文件导入成功"); + return success(map); } } -// 清理生产单 + // 导出错误的excel + @PostMapping("/import-excel") + @Operation(summary = "生产单导入新增") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "isAddPlate", description = "是否为生产单新增板材", example = "false"), + @Parameter(name = "upload", description = "是 更新、否 新建", example = "false"), + @Parameter(name = "orderSaveReqVO", description = "生产单新增参数", required = true) + }) + @PreAuthorize("@ss.hasPermission('executor:order:importExcel')") + @OperateLog(type = EXPORT) + public void exportExcel(@RequestPart("file") MultipartFile file, + @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, + @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, + @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO, + HttpServletResponse response) throws IOException { +// 判断是否更新板材 + if (!isAddPlate) {//不需要添加板材 + if (upload) { + orderService.updateOrder(createReqVO);//更新 + } else { + Long id = orderService.createOrder(createReqVO);//新建 + } + } else { + Long id = 0L; + if (upload) { + orderService.updateOrder(createReqVO);//更新 + id = createReqVO.getId(); + } else { +// id = orderService.createOrder(createReqVO);//新建 + } +// 解析导入文件,生成统一格式 + List list = new ArrayList<>(); + if (createReqVO.getDataType() == 1) {//CAD + + } else if (createReqVO.getDataType() == 2) {//WebCAD + + } else if (createReqVO.getDataType() == 3) {//Excel +// 文件数据读取 + list = fileTypeChangeUtil.fileDataChange(file); + } + if (!fileTypeChangeUtil.getFlag()) { + // 导出 Excel + ExcelUtils.write(response, "生产单导入错误返回.xlsx", "数据", OrderPlateImportExcelVO.class, + BeanUtils.toBean(list, OrderPlateImportExcelVO.class)); + } + orderInputProcessor.input((List) list, id); + } + + } + + // 清理生产单 @DeleteMapping("/clean") @Operation(summary = "清理生产单") @Parameter(name = "orderId", description = "生产单编号", required = true, example = "1024") @@ -228,7 +281,7 @@ public class OrderController { return success(true); } -// 获取当前条件下所有生产单信息 + // 获取当前条件下所有生产单信息 @GetMapping("/allOrder") @Operation(summary = "获得所有生产单") @PreAuthorize("@ss.hasPermission('executor:order:query')") @@ -237,7 +290,7 @@ public class OrderController { return success(BeanUtils.toBean(pageResult, OrderRespVO.class)); } -// 获得 房间和柜体 信息 + // 获得 房间和柜体 信息 @GetMapping("/get-room") @Operation(summary = "获得房间——柜体 基本信息") @Parameter(name = "orderId", description = "生产单编号", required = true, example = "1024") @@ -248,7 +301,7 @@ public class OrderController { } -// 获得模组 —— 模块信息 + // 获得模组 —— 模块信息 @GetMapping("/get-moduleDetails") @Operation(summary = "获得模组——模块信息") @Parameters({ @@ -260,11 +313,11 @@ public class OrderController { public CommonResult> getModule(@RequestParam("orderId") Long orderId, @RequestParam(value = "roomId", required = false) Long roomId, @RequestParam(value = "bodyId", required = false) Long bodyId) { - List moduleDOList = orderService.getModule(orderId ,roomId ,bodyId); + List moduleDOList = orderService.getModule(orderId, roomId, bodyId); return success(moduleDOList); } -// 删除柜体 + // 删除柜体 @DeleteMapping("/delete-body") @Operation(summary = "删除柜体") @Parameters({ @@ -272,55 +325,47 @@ public class OrderController { @Parameter(name = "bodyIds", description = "柜体编号集合", required = true, example = "1,2") }) @PreAuthorize("@ss.hasPermission('executor:order:delete')") - public CommonResult deleteBody(@RequestParam("orderId")Long orderId , @RequestParam("bodyIds")Set bodyIds){ - orderService.deleteBodyByOrder(orderId,bodyIds); + public CommonResult deleteBody(@RequestParam("orderId") Long orderId, @RequestParam("bodyIds") Set bodyIds) { + orderService.deleteBodyByOrder(orderId, bodyIds); return success(true); } -// 柜体数据获取,需要加上柜体的属性 + // 柜体数据获取,需要加上柜体的属性 @GetMapping("/get-body") @Operation(summary = "生产单柜体数据获取") @Parameter(name = "orderId", description = "生产单编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('executor:order:query')") - public CommonResult> getBody(@RequestParam("orderId")Long orderId){ + public CommonResult> getBody(@RequestParam("orderId") Long orderId) { return success(BeanUtils.toBean(orderService.getBody(orderId), OrderBodyRespVO.class)); } - /** - * api获取数据接口(用户从其他应用点击数据传输,首先进行用户数据验证【用户传入token,本生产系统获得token之后,调用erp接口,进行用户账号数据 - * 获取,获取的数据进行本系统的登陆,获取本系统的token】,然后进行数据推送【redis首先缓存数据,生成唯一数据标识符,返回给应用用户】,再用户进入 - * 本系统的生产单新增页面,进行新增生产单数据的传入(有问题) - * 调用本系统的接口,进行数据传输, - * 传输成功之后,返回数据给用户,用户进行数据查看, - */ - - @GetMapping("api-import") - @Operation(summary = "api调用传入设计数据") + @PostMapping("file-import") + @Operation(summary = "文件上产接口") @Parameters({ - @Parameter(name = "body", description = "api传输数据", required = true) -// , -// @Parameter(name = "isAddPlate", description = "是否为生产单新增板材", example = "false"), -// @Parameter(name = "upload", description = "是 更新、否 新建", example = "false"), -// @Parameter(name = "orderSaveReqVO", description = "生产单新增参数", required = true) + @Parameter(name = "file", description = "文件", required = false), + @Parameter(name = "isAddPlate", description = "是否为生产单新增板材", example = "false"), + @Parameter(name = "upload", description = "是 更新、否 新建", example = "false"), + @Parameter(name = "orderSaveReqVO", description = "生产单新增参数", required = true), + @Parameter(name = "type", description = "文件类型", required = true) }) - @PreAuthorize("@ss.hasPermission('executor:order:import')") - public CommonResult apiImport(@RequestPart("data") String data -// , -// @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, -// @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, -// @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO - ) { + @PreAuthorize("@ss.hasPermission('executor:fileData:import')") + public CommonResult apiImport(@RequestPart(value = "file", required = false) MultipartFile file, + @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, + @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, + @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO, + @RequestParam(value = "type", required = false, defaultValue = "cf_cad") String type, + final HttpServletResponse respons) throws IOException { + OrderImportRespVO orderImportRespVO = OrderImportRespVO.builder().createOrder(new ArrayList<>()) .updateOrder(new ArrayList<>()).failureOrder(new LinkedHashMap<>()).build(); -// OrderImportRespVO respVO = orderService.importOrderList(list , id , orderImportRespVO); -// json转换 -// List list = fileDataChangeUtil.fileDataChange(data); -// orderInputProcessor.input(list , 1L); - System.out.println("webcad数据: " + data); +// 数据格式转换,返回转换完成的数据(传入文件类型,和文件类容),判断需要使用那种解析之后,进行数据的转换 + List list = fileTypeChangeUtil.chooseType(file, type); + if (fileTypeChangeUtil.getFlag()) {//文件数据转换成功,进行数据填入 + + } + return success(orderImportRespVO); - - } } \ 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/orderGroup/OrderGroupDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderGroup/OrderGroupDO.java index 0e83c1fbc..7f64ed0f2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderGroup/OrderGroupDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/orderGroup/OrderGroupDO.java @@ -37,11 +37,11 @@ public class OrderGroupDO extends BaseDO { /** * 加工组类型id,依据同一生产单的同一房间的同一柜体的相同加工组类型,由服务端生成 */ - private Long groupId; + private Long groupTypeId; /** * 加工组类型 */ - private String groupType; + private String groupTypeName; /** * 模块名称 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInputProcessor.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInputProcessor.java index ea6c2c14f..e04efe799 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInputProcessor.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderInputProcessor.java @@ -111,8 +111,8 @@ public class OrderInputProcessor { .build(), Collectors.groupingBy(e -> OrderGroupDO.builder() - .groupId((long) e.getIBoardProdInfo().getSynthesis()) - .groupType(e.getIBoardProdInfo().getCombinationName()) + .groupTypeId((long) e.getIBoardProdInfo().getSynthesis()) + .groupTypeName(e.getIBoardProdInfo().getCombinationName()) .name(e.getIBoardProdInfo().getSynthesisTypeName()) .build() ) @@ -148,7 +148,7 @@ public class OrderInputProcessor { .width(e.getIBoardProdInfo().getWidth()) .height(e.getIBoardProdInfo().getHeight()) .thickness(e.getIBoardProdInfo().getThickness()) - .groupType(orderGroupDO.getGroupType()) + .groupType(orderGroupDO.getGroupTypeName()) .build() ).toList(); List partsModuleExtras = k.getValue().stream().filter(e -> e.getIBoardProdInfo().getGoodType() == 1) 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 8b1ef34a3..936c5d56f 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 @@ -235,7 +235,7 @@ public class OrderServiceImpl implements OrderService { // 板数量 final Double[] plateCountByCombination = {0.0}; OrderGroupDO orderGroupDO = OrderGroupDO.builder().orderId(id).bodyId(bodyId) - .groupId(Long.valueOf(synthesis)).groupType(listCombinationName.get(0).getIBoardProdInfo().getSynthesisTypeName()).name(combinationName).build(); + .groupTypeId(Long.valueOf(synthesis)).groupTypeName(listCombinationName.get(0).getIBoardProdInfo().getSynthesisTypeName()).name(combinationName).build(); orderGroupMapper.insert(orderGroupDO); Long groupId = orderGroupDO.getId(); @@ -251,7 +251,7 @@ public class OrderServiceImpl implements OrderService { plateMapper.insert(plateDO); productRespVOS.add(new ProductRespVO().setRoomId(roomId).setRoomName(roomName).setBodyId(bodyId).setBodyName(cabinetName) - .setGroupId(groupId).setGroupTypeId(orderGroupDO.getGroupId()).setGroupTypeName(orderGroupDO.getName()) + .setGroupId(groupId).setGroupTypeId(orderGroupDO.getGroupTypeId()).setGroupTypeName(orderGroupDO.getName()) .setGoodType(1).setGoodName(plateDO.getName()).setUnits("片").setNum(1.0)); Long plateId = plateDO.getId(); orderImportRespVO.getCreateOrder().add(plateDO.getId() + "板材存入生成id"); @@ -275,7 +275,7 @@ public class OrderServiceImpl implements OrderService { .num(Double.valueOf(plateOrParts.getIBoardProdInfo().getGoodsNumber())).build(); orderItemMapper.insert(orderItemDO); productRespVOS.add(new ProductRespVO().setRoomId(roomId).setRoomName(roomName).setBodyId(bodyId).setBodyName(cabinetName) - .setGroupId(groupId).setGroupTypeId(orderGroupDO.getGroupId()).setGroupTypeName(orderGroupDO.getName()) + .setGroupId(groupId).setGroupTypeId(orderGroupDO.getGroupTypeId()).setGroupTypeName(orderGroupDO.getName()) .setGoodType(1).setGoodName(orderPartsDO.getName()).setUnits(orderPartsDO.getUnit()).setNum(orderItemDO.getNum())); } @@ -301,7 +301,7 @@ public class OrderServiceImpl implements OrderService { }); - fileTypeChangeUtil.fileDataChangeToJson(list, id); +// fileTypeChangeUtil.fileDataChangeToJson(list, id); return orderImportRespVO; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java index 5409e0b7b..296a2ee75 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java @@ -1,26 +1,29 @@ package com.cf.imes.module.executor.util; import com.cf.imes.module.executor.util.deviseData.Detail; -import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.web.multipart.MultipartFile; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; -import java.util.Map; /** * 生产单新增传入文件格式转换工具 */ public interface FileTypeChangeUtil { // 文件数据格式转换 - List fileDataChange(MultipartFile file) throws IOException; -// List转json,并且文件压缩存储 - void fileDataChangeToJson(List detailList , Long orderId) throws IOException; + List fileDataChange(MultipartFile file) throws IOException; // Api数据格式转换 // ds数据转换 - Map getValue(); +// 数据转换成功判断 + boolean getFlag(); + +// 根据文件类型判断使用那种方式进行数据转换 + default List chooseType(MultipartFile file,String type) throws IOException { + if (type.equals("cf_cad")) + return fileDataChange(file); + return null; + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java index 421d7a942..0507b6a7f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java @@ -13,12 +13,11 @@ import lombok.experimental.Accessors; @Builder @AllArgsConstructor @NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 public class HoleDetail { private Integer holeId; //孔ID - private float holeType;// 孔类型(0大孔, 10小孔, 20木削, 21木削大孔, 30层板钉, 40通孔, 50连接杆, -10造型孔) - private float faceType; // 孔面类型(0正面, 1反面, 2侧面) + private Integer holeType;// 孔类型(0大孔, 10小孔, 20木削, 21木削大孔, 30层板钉, 40通孔, 50连接杆, -10造型孔) + private Integer faceType; // 孔面类型(0正面, 1反面, 2侧面) private float pointX; private float pointY; private float pointZ; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/BasePosition.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/BasePosition.java new file mode 100644 index 000000000..f3c671684 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/BasePosition.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 基准位置,用于画图 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class BasePosition { + private String basePoint;// 基准点 + + private String basePointX;// 基准点X坐标 + + private String basePointY;// 基准点Y坐标 + + private String basePointZ;// 基准点Z坐标 + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/HoleDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/HoleDetail.java new file mode 100644 index 000000000..14f4eec4c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/HoleDetail.java @@ -0,0 +1,36 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 孔明细,板上的孔的明细 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class HoleDetail { + + private String faceType; // 打孔面(0正面, 1反面, 2侧面) + private String holeType;// 孔类型(0大孔, 10小孔, 20木削, 21木削大孔, 30层板钉, 40通孔, 50连接杆, -10造型孔) + private String holeName;// 孔名称,用于类型相同的孔,进行分组区分,一组的孔名称相同 + +// 孔的起点坐标 + private Double startX; + private Double startY; + private Double startZ; + +// 打孔的半径 + private float radius; //孔半径 + +// 孔的终点坐标 + private Double endX; + private Double endY; + private Double endZ; + + private float angle; //角度 + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java index d09c2b282..29d29b0e3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java @@ -17,21 +17,39 @@ import java.util.List; public class IBoardProdInfo { // 商品信息 - private String goodsId; // 商品编码 + private String goodsNo; // 商品编码 private String goodsName; //商品名称 - private int goodType; //商品类型,用于筛选是板材还是配件类,可传入文字(需做转换) + private String goodType; //商品类型,用于筛选是板材还是配件类,可传入文字(需做转换) private String material; //材质 private String color; //颜色 private String factory; //商品生产厂商 private String brand; //商品品牌 private String model; //商品型号 private String spec; //商品规格 - private Double thickness;//规格-板厚 板厚,成品和开料都是一样的 + private float thickness;//规格-板厚 板厚,成品和开料都是一样的 private String unit; //商品单位 // 当有板件时就有板件信息 private float goodsNumber; //产品数量为特殊处理,板件和配件都有数量 +// 板材中与造型和轮廓无关的信息 + private Long plateId; //板件Id,存入数据库之后的主键 + private Long goodsId;//商品Id,板材所用商品编号 + private String plateNo;//自定义板号 + private String name; //板件名称 + private Integer texture; //纹路 纹路(0正纹1可翻转2反纹) + private Integer typographicFace; //排版面 排钻类型(0正面1反面2随意面) + private Integer openDoorType; //开门类型 0非门板,1左开,2右开,3上翻,4下翻 + private Boolean isRect; //是否为矩形 +// 板件开料数据 + //封边数据,矩形存的顺序为左、右、上、下,非矩形存的顺序为从起始点开始,方向为顺时针 + private float[] sealDate; + +// 这里的数据都是矩形板件才有 + private float splitHeight; //开料长 + private float splitWidth; //开料宽 + private float splitThickness; //开料厚度 + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IContourData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IContourData.java new file mode 100644 index 000000000..50ab11f31 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IContourData.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import com.cf.imes.module.executor.controller.admin.plan.dto.Point; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + + +/** + * 轮廓数据 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class IContourData { + private List pts; //点集(二维向量(x,y)) + private Double[] buls; //凸度(0直线段 >0逆时针方向 <0顺时针方向) +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IOriginModelingData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IOriginModelingData.java new file mode 100644 index 000000000..f6dcef4b5 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IOriginModelingData.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 板的造型数据 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class IOriginModelingData { + + private float knifeRadius; // 刀半径 + + private float thickness;// 厚度 + private Integer dir;// 方向 + + private IContourData outline; // 轮廓,造型最外围的轮廓数据 + private List holes; //孔轮廓 + + + private float addLen; // 槽加长 + private float addWidth; // 槽加宽 + private float addDepth; // 槽加深 +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/ModelDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/ModelDetail.java new file mode 100644 index 000000000..b54016090 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/ModelDetail.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 造型明细 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class ModelDetail { + + private String typographicFace; //造型排版面 0正面, 1反面, 2侧面 + + private String knifeName; //造像使用刀具名称 + private float knifeRadius; //刀半径 + + private float depth; //造型深度 + + private IOriginModelingData originModeling;//造型数据 + private List pointList; //点列表 + private List offSetList; //偏移量列表 //模块偏移数据 +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/OffSetList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/OffSetList.java new file mode 100644 index 000000000..add9c6320 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/OffSetList.java @@ -0,0 +1,32 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 偏移量列表 模块偏移数据 + * 在有用到二维刀路的时候,需要这个数据 + * 注:1、有用到type之类需要转换类型的诗句,将type全部存原有的值,然后在接口这一块,通过字典进行进行转换 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class OffSetList { + + private String faceType;// 面向类型(0正面, 1反面, 2侧面) + +// 二维刀路的属性 + private float radius;//刀的半径 + private String name; //刀的名称 + private float angle;//角度 + +// 刀路的偏移值 + private float value; // 刀路的偏倚值 + private float deep;//下刀的深度 + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java index 73c8db7fc..ab38dc4b6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java @@ -16,22 +16,34 @@ import java.util.Map; @AllArgsConstructor @NoArgsConstructor public class PlateDetail { +// 柜体成倍拆单的倍数 + private Integer multiNum; // 板件所属信息 private String roomsName; //房间名称 private String cabinetsName; //柜体名 - // 柜体 长 宽 深 - private Double width; - private Double height; - private Double depth; - -// 柜体成倍拆单的倍数 - private Integer multiNum; - -// 板材所属加工组 + // 柜体信息 长 宽 深 + private float width; + private float height; + private float depth; + // 板材所属加工组 private List synthesis;// 板件加工组Group的名称,可以有多个 private String synthesisName;// 加工组中Group中每个小加工组的名称 +// 商品基本信息 + private IBoardProdInfo iBoardProdInfo; - private Map remark; +// 基准位置,用于画图 + private BasePosition basePosition; + +// 轮廓数据、造型数据 + private List pointDetail ; //点明细,表示小板外围轮廓的几个转折点 + private List holeDetail ; //孔明细,表示板上的孔 + private List contourDetail ; //造型明细 + + private List sideHoleDetail;//侧面孔明细 + private List sideModelDetail ; //侧面造型明细 + +// 备注 + private Map remark;// 板件备注 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointDetail.java new file mode 100644 index 000000000..870e9e29f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointDetail.java @@ -0,0 +1,29 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 点明细 , 表示小板外围轮廓的几个转折点 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class PointDetail { + +// 表明点的顺序,或是下一个点是哪个点 + private Integer pointId; + +// 点的位置信息 + private Double pointX; + private Double pointY; + private Double curve;//曲线 + +// 点的封边尺寸 + private float SealSize;//封边尺寸,封边的厚度,长同边长 +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointList.java new file mode 100644 index 000000000..ce059ce0f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PointList.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 点列表 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class PointList { + + private Integer lineId;//纹路Id + private Integer pointId;//点Id + +// 点的位置信息 + private Double pointX; + private Double pointY; + private Double radius; + + private float curve; // 曲线 + private float depth; //曲线深度 + +} 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/ExcelDataContentException.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelDataContentException.java deleted file mode 100644 index 2a3133d0d..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelDataContentException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; - -import com.alibaba.excel.exception.ExcelRuntimeException; - - -public class ExcelDataContentException extends ExcelRuntimeException { -} 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/ExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java index 781997d4d..e156649ef 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java @@ -5,24 +5,20 @@ import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelDataConvertException; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; @Slf4j -public final class ExcelListener extends AnalysisEventListener { +public final class ExcelListener extends AnalysisEventListener { /** * 自定义用于暂时存储data * 可以通过实例获取该值 */ - private List datas = new ArrayList<>(); + private List datas = new ArrayList<>(); private boolean flag = true; - private String value = null; - + private Map valueMap = new HashMap<>(); /** @@ -32,7 +28,24 @@ public final class ExcelListener extends AnalysisEventListener { * @param context 内容 */ @Override - public void invoke(T data, AnalysisContext context) { + public void invoke(OrderPlateImportExcelVO data, AnalysisContext context) { +// 根据列来确定是那一条的数据,然后将错误的数据插入其中 +// 这里要判断数据的合法性,不合法的数据直接插入到错误数据中 + if (data.getGoodType() == 0) { + data.setResult("商品类型未选择"); + flag = false; + } else { + if (!data.isValidGoods()){ + data.setResult("商品信息填写有误"); + flag = false; + } + if (data.getGoodType() == 1) { //板材 + if (!data.isValidRawGoods()) { + data.setResult("板材信息填写有误"); + flag = false; + } + } + } datas.add(data); } @@ -56,21 +69,13 @@ public final class ExcelListener extends AnalysisEventListener { */ @Override public void onException(Exception exception, AnalysisContext context) { - log.info("有异常"); this.flag = false; - // 如果是某一个单元格的转换异常 能获取到具体行号 - // 如果要获取头的信息 配合invokeHeadMap使用 if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; log.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex() + 1, excelDataConvertException.getCellData()); - value = value + String.valueOf(new RuntimeException("第" + (excelDataConvertException.getRowIndex() + 1) + "行" + - ",第" + (excelDataConvertException.getColumnIndex() + 1) + "列读取错误")) ; - } - if (exception instanceof RuntimeException) { - RuntimeException runtimeException = (RuntimeException) exception; - log.error("读取异常:{}", runtimeException.getMessage()); - value = value + runtimeException.getMessage(); + valueMap.put(excelDataConvertException.getRowIndex() + 1 , String.valueOf(new RuntimeException("第" + (excelDataConvertException.getRowIndex() + 1) + "行" + + ",第" + (excelDataConvertException.getColumnIndex() + 1) + "列数据格式有误,读取失败"))); } } @@ -79,7 +84,7 @@ public final class ExcelListener extends AnalysisEventListener { * * @return 返回读取的数据集合 **/ - public List getDatas() { + public List getDatas() { return datas; } @@ -97,7 +102,8 @@ public final class ExcelListener extends AnalysisEventListener { * * @return String **/ - public String getValue() { - return value; + public Map getValueMap() { + return valueMap; } + } \ 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/FileTypeChangeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java index 129f3015a..4be0e1790 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java @@ -1,16 +1,11 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; -import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.executor.util.FileTypeChangeUtil; -import com.cf.imes.module.executor.util.ZLibUtils; import com.cf.imes.module.executor.util.deviseData.Detail; import com.cf.imes.module.executor.util.deviseData.IBoardProdInfo; -import com.cf.imes.module.infra.api.file.FileApi; -import com.cf.imes.module.infra.api.file.dto.FileCreateReqDTO; import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.enums.DictTypeConstants; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; @@ -19,7 +14,6 @@ import javax.annotation.Resource; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * 实现数据格式转换 @@ -28,99 +22,48 @@ import java.util.Map; @Validated public class FileTypeChangeRealize implements FileTypeChangeUtil { - private String valueErr = ""; + @Resource + private DictDataApi dictDataApi; private Boolean flag = true; @Resource - private FileApi fileApi; - - @Resource - private DictDataApi dictDataApi; + private OrderExcelUtil orderExcelUtil; @Override - public List fileDataChange(MultipartFile file) throws IOException { + public List fileDataChange(MultipartFile file) throws IOException { + List orderPlateImportExcelVOS = orderExcelUtil.read(file, OrderPlateImportExcelVO.class); + +// 判断上传数据解析是否有误 + if (!orderExcelUtil.getFlag()){ + this.flag = false; + System.out.println(orderPlateImportExcelVOS); + orderExcelUtil.clear(); + return orderPlateImportExcelVOS; + } + List details = new ArrayList<>(); - List orderPlateImportExcelVOS = OrderExcelUtil.read(file, OrderPlateImportExcelVO.class); System.out.println(orderPlateImportExcelVOS); -// if (orderPlateImportExcelVOS == null || orderPlateImportExcelVOS.isEmpty()) { -// return details; -// } -// -// StringBuilder value = new StringBuilder(); -// -// -// for (OrderPlateImportExcelVO orderPlateImportExcelVO : orderPlateImportExcelVOS) { -// orderPlateImportExcelVO.setRemark(orderPlateImportExcelVO.remarkJSON()); -// if(dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData() != null){ -// String synthesisTypeName = dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData().getLabel(); -// orderPlateImportExcelVO.setSynthesisTypeName(synthesisTypeName); -// } -// handleOrderPlateImportExcelVO(orderPlateImportExcelVO, value); -// if(flag){ -// Detail detail = Detail.builder() -// .iBoardProdInfo(BeanUtils.toBean(orderPlateImportExcelVO, IBoardProdInfo.class)) -// .build(); -// details.add(detail); -// }else { -// details = null; -// System.out.println(value.toString()); -// break; -// } -// -// } -// return details; - return null; - } - private void handleOrderPlateImportExcelVO(OrderPlateImportExcelVO orderPlateImportExcelVO, StringBuilder value) { - if (orderPlateImportExcelVO.getGoodType() == 0) { - appendError(value, " 商品类别未填写 ", orderPlateImportExcelVO); - flag = false; - } else { - if (!orderPlateImportExcelVO.isVail()) { - if (orderPlateImportExcelVO.getGoodType() == 1) { - if (!orderPlateImportExcelVO.isValidRawGoods()) { - appendError(value, " 板材信息填写有误 ", orderPlateImportExcelVO); - flag = false; - } - } else { - if (!orderPlateImportExcelVO.isValidParts()) { - appendError(value, " 配件信息填写有误 ", orderPlateImportExcelVO); - flag = false; - } - } + for (OrderPlateImportExcelVO orderPlateImportExcelVO : orderPlateImportExcelVOS) { + orderPlateImportExcelVO.setRemark(orderPlateImportExcelVO.remarkJSON()); + if(dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData() != null){ + String synthesisTypeName = dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData().getLabel(); + orderPlateImportExcelVO.setSynthesisTypeName(synthesisTypeName); } + + Detail detail = Detail.builder() + .iBoardProdInfo(BeanUtils.toBean(orderPlateImportExcelVO, IBoardProdInfo.class)) + .build(); + details.add(detail); } - } - - private void appendError(StringBuilder value, String errorMessage, OrderPlateImportExcelVO orderPlateImportExcelVO) { - value.append(orderPlateImportExcelVO.getOrdinal()) - .append(orderPlateImportExcelVO.getGoodsName()) - .append(errorMessage); - valueErr = valueErr + value.toString(); + orderExcelUtil.clear(); + return details; } @Override - public void fileDataChangeToJson(List detailList , Long orderId) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - String detailListJson = objectMapper.writeValueAsString(detailList); - byte[] jsonData = detailListJson.getBytes(); - - // 使用 Zlib 压缩算法进行压缩 - byte[] compressedData = ZLibUtils.compress(jsonData); - - // 将压缩后的数据写入文件 - FileCreateReqDTO fileCreateReqDTO = new FileCreateReqDTO().setName(orderId + ".json") - .setContent(compressedData); - CommonResult pathNew = fileApi.createFile(fileCreateReqDTO); - } - - @Override - public Map getValue() { - Map err = OrderExcelUtil.getValue(); - err.put("readErr", valueErr); - return err; + public boolean getFlag() { + return this.flag; } } 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/OrderExcelUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderExcelUtil.java index dc81024bd..f7cd572cf 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderExcelUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderExcelUtil.java @@ -3,17 +3,22 @@ package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; import com.alibaba.excel.EasyExcel; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; @Slf4j -public class OrderExcelUtil{ - private static String value; +@Component +public class OrderExcelUtil { + private String value; + + private ExcelListener excelListener = new ExcelListener<>(); + + public List read(MultipartFile file, Class head) throws IOException { - public static List read(MultipartFile file, Class head) throws IOException { - ExcelListener excelListener = new ExcelListener<>(); if (file.isEmpty()) { value = "文件为空"; throw new IOException("文件为空"); @@ -31,19 +36,22 @@ public class OrderExcelUtil{ EasyExcel.read(file.getInputStream(), head, excelListener). headRowNumber(7).sheet(0).doRead(); //获取读取的数据 - List list = excelListener.getDatas(); + List list = excelListener.getDatas(); - if (excelListener.getFlag()) - return list; - value = excelListener.getValue(); - return null; + if (excelListener.getValueMap().size() > 0) + excelListener.getValueMap().forEach((k, v) -> { + list.get(k - 8).setResult(v); + }); + return list; } } - public static Map getValue() { - Map err = new HashMap<>(); - err.put("readErr", value); - return err; + public boolean getFlag() { + return excelListener.getFlag(); + } + + public void clear() { + excelListener.getDatas().clear(); } } 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/excelPoi/OrderImportVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderImportVO.java similarity index 92% rename from cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/OrderImportVO.java rename to cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderImportVO.java index 05eac3f86..541b3dee4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/OrderImportVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/OrderImportVO.java @@ -1,4 +1,4 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; import com.alibaba.excel.annotation.ExcelProperty; @@ -26,15 +26,6 @@ import java.math.BigDecimal; @Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 public class OrderImportVO { - // 行号 - private Integer rowNum; - - // 行数据 - private String rowData; - - // 错误提示信息 - private String rowTips; - @ExcelProperty(value = "序号") @JsonIgnore private int ordinal; @@ -42,7 +33,6 @@ public class OrderImportVO { @ExcelProperty(value = "类型", converter = DictConvert.class) @JsonIgnore @DictFormat(DictTypeConstants.PRODUCT_TYPE) - @ExcelImport(value = "类型", required = true) private int goodType; @ExcelProperty(value = "物料编码") @@ -102,14 +92,6 @@ public class OrderImportVO { @JsonIgnore private String plateNo; - @ExcelProperty(value = "成品长") - @JsonIgnore - private BigDecimal height; - - @ExcelProperty(value = "成品宽") - @JsonIgnore - private BigDecimal width; - @ExcelProperty(value = "开料长") @JsonIgnore private BigDecimal splitHeight; @@ -204,7 +186,6 @@ public class OrderImportVO { private String remark; - //备注转json数据 public String remarkJSON() { ObjectMapper objectMapper = new ObjectMapper(); @@ -218,4 +199,6 @@ public class OrderImportVO { } } +// 判断非空 +// 判断数据合理 } \ 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/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 5ec795e20..a496b23b2 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 @@ -12,10 +12,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import java.math.BigDecimal; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import javax.validation.constraints.NotNull; /** @@ -76,7 +72,7 @@ public class OrderPlateImportExcelVO { @ExcelProperty(value = "数量") @JsonIgnore @NotNull - private Double goodsNumber; + private float goodsNumber; @ExcelProperty(value = "房间") @JsonIgnore @@ -94,41 +90,33 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String plateNo; - @ExcelProperty(value = "成品长") - @JsonIgnore - private BigDecimal height; - - @ExcelProperty(value = "成品宽") - @JsonIgnore - private BigDecimal width; - @ExcelProperty(value = "开料长") @JsonIgnore - private BigDecimal splitHeight; + private float splitHeight; @ExcelProperty(value = "开料宽") @JsonIgnore - private BigDecimal splitWidth; + private float splitWidth; @ExcelProperty(value = "厚") @JsonIgnore - private BigDecimal splitThickness; + private float splitThickness; @ExcelProperty(value = "左封边") @JsonIgnore - private BigDecimal sealLeft; + private float sealLeft; @ExcelProperty(value = "右封边") @JsonIgnore - private BigDecimal sealRight; + private float sealRight; @ExcelProperty(value = "上封边") @JsonIgnore - private BigDecimal sealUp; + private float sealUp; @ExcelProperty(value = "下封边") @JsonIgnore - private BigDecimal sealDown; + private float sealDown; @ExcelProperty(value = "组合类型", converter = DictConvert.class) @JsonIgnore @@ -197,20 +185,17 @@ public class OrderPlateImportExcelVO { @JsonIgnore - public boolean isValidParts() { - return (isNonEmpty(goodsId) || isNonEmpty(goodsName)) && (goodsNumber != null && goodsNumber > 0) && (isNonEmpty(model) || isNonEmpty(spec)); + public boolean isValidGoods() { + return (isNonEmpty(goodsId) || + ((isNonEmpty(goodsName)) && (isNonEmpty(model) || isNonEmpty(spec)) && isNonEmpty(material) && isNonEmpty(color) && isNonEmpty(unit))) + && goodsNumber > 0; } @JsonIgnore public boolean isValidRawGoods() { - return (isNonEmpty(goodsId) || isNonEmpty(goodsName) || isNonEmpty(material) || isNonEmpty(color) || isNonEmpty(spec)) && - (goodsNumber != null && goodsNumber > 0) && - ((height != null && height.compareTo(BigDecimal.ZERO) > 0 && width != null && width.compareTo(BigDecimal.ZERO) > 0) || - (splitHeight != null && splitHeight.compareTo(BigDecimal.ZERO) > 0 && splitWidth != null && splitWidth.compareTo(BigDecimal.ZERO) > 0)) && - sealLeft != null && sealLeft.compareTo(BigDecimal.ZERO) > 0 && - sealRight != null && sealRight.compareTo(BigDecimal.ZERO) > 0 && - sealUp != null && sealUp.compareTo(BigDecimal.ZERO) > 0 && - sealDown != null && sealDown.compareTo(BigDecimal.ZERO) > 0; + return goodsNumber > 0 && + splitHeight > 0 && splitWidth > 0 && + sealLeft >= 0 && sealRight >= 0 && sealUp >= 0 && sealDown >= 0; } private boolean isNonEmpty(String value) { @@ -229,9 +214,5 @@ public class OrderPlateImportExcelVO { return "{}"; } } - - public Boolean isVail(){ - return (isValidParts() && isValidRawGoods()); - } } 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/excelPoi/ExcelClassField.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelClassField.java deleted file mode 100644 index 1b9c04614..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelClassField.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; - - -import java.util.LinkedHashMap; - -/** - * @author sunnyzyq - * @date 2021/12/17 - */ -public class ExcelClassField { - - /** 字段名称 */ - private String fieldName; - - /** 表头名称 */ - private String name; - - /** 映射关系 */ - private LinkedHashMap kvMap; - - /** 示例值 */ - private Object example; - - /** 排序 */ - private int sort; - - /** 是否为注解字段:0-否,1-是 */ - private int hasAnnotation; - - public String getFieldName() { - return fieldName; - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public LinkedHashMap getKvMap() { - return kvMap; - } - - public void setKvMap(LinkedHashMap kvMap) { - this.kvMap = kvMap; - } - - public Object getExample() { - return example; - } - - public void setExample(Object example) { - this.example = example; - } - - public int getSort() { - return sort; - } - - public void setSort(int sort) { - this.sort = sort; - } - - public int getHasAnnotation() { - return hasAnnotation; - } - - public void setHasAnnotation(int hasAnnotation) { - this.hasAnnotation = hasAnnotation; - } - -} 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/excelPoi/ExcelExport.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelExport.java deleted file mode 100644 index 98ef2f4df..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelExport.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author sunnyzyq - * @date 2021/12/17 - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -public @interface ExcelExport { - - /** 字段名称 */ - String value(); - - /** 导出排序先后: 数字越小越靠前(默认按Java类字段顺序导出) */ - int sort() default 0; - - /** 导出映射,格式如:0-未知;1-男;2-女 */ - String kv() default ""; - - /** 导出模板示例值(有值的话,直接取该值,不做映射) */ - String example() default ""; - -} 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/excelPoi/ExcelImport.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelImport.java deleted file mode 100644 index d6283042c..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelImport.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * @author sunnyzyq - * @date 2021/12/17 - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -public @interface ExcelImport { - - /** 字段名称 */ - String value(); - - /** 导出映射,格式如:0-未知;1-男;2-女 */ - String kv() default ""; - - /** 是否为必填字段(默认为非必填) */ - boolean required() default false; - - /** 最大长度(默认255) */ - int maxLength() default 255; - - /** 导入唯一性验证(多个字段则取联合验证) */ - boolean unique() default false; - -} 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/excelPoi/ExcelUtils.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelUtils.java deleted file mode 100644 index d553b6cc9..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelUtils.java +++ /dev/null @@ -1,1005 +0,0 @@ -package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import org.apache.poi.hssf.usermodel.HSSFDataValidation; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.poifs.filesystem.POIFSFileSystem; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.ss.util.CellRangeAddressList; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.net.URL; -import java.text.NumberFormat; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.Map.Entry; -import java.util.regex.Pattern; - -/** - * Excel导入导出工具类 - * 原文链接(不定时增加新功能): https://zyqok.blog.csdn.net/article/details/121994504 - * - * @author sunnyzyq - * @date 2021/12/17 - */ -@SuppressWarnings("unused") -public class ExcelUtils { - - private static final String XLSX = ".xlsx"; - private static final String XLS = ".xls"; - public static final String ROW_MERGE = "row_merge"; - public static final String COLUMN_MERGE = "column_merge"; - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; - private static final String ROW_NUM = "rowNum"; - private static final String ROW_DATA = "rowData"; - private static final String ROW_TIPS = "rowTips"; - private static final int CELL_OTHER = 0; - private static final int CELL_ROW_MERGE = 1; - private static final int CELL_COLUMN_MERGE = 2; - private static final int IMG_HEIGHT = 30; - private static final int IMG_WIDTH = 30; - private static final char LEAN_LINE = '/'; - private static final int BYTES_DEFAULT_LENGTH = 10240; - private static final NumberFormat NUMBER_FORMAT = NumberFormat.getNumberInstance(); - - public static List readFile(File file, Class clazz) throws Exception { - JSONArray array = readFile(file); - return getBeanList(array, clazz); - } - - public static List readMultipartFile(MultipartFile mFile, Class clazz) throws Exception { - JSONArray array = readMultipartFile(mFile); - return getBeanList(array, clazz); - } - - public static JSONArray readFile(File file) throws Exception { - return readExcel(null, file); - } - - public static JSONArray readMultipartFile(MultipartFile mFile) throws Exception { - return readExcel(mFile, null); - } - - public static Map readFileManySheet(File file) throws Exception { - return readExcelManySheet(null, file); - } - - public static Map readFileManySheet(MultipartFile file) throws Exception { - return readExcelManySheet(file, null); - } - - private static List getBeanList(JSONArray array, Class clazz) throws Exception { - List list = new ArrayList<>(); - Map uniqueMap = new HashMap<>(16); - for (int i = 0; i < array.size(); i++) { - list.add(getBean(clazz, array.getJSONObject(i), uniqueMap)); - } - return list; - } - - /** - * 获取每个对象的数据 - */ - private static T getBean(Class c, JSONObject obj, Map uniqueMap) throws Exception { - T t = c.newInstance(); - Field[] fields = c.getDeclaredFields(); - List errMsgList = new ArrayList<>(); - boolean hasRowTipsField = false; - StringBuilder uniqueBuilder = new StringBuilder(); - int rowNum = 0; - for (Field field : fields) { - // 行号 - if (field.getName().equals(ROW_NUM)) { - rowNum = obj.getInteger(ROW_NUM); - field.setAccessible(true); - field.set(t, rowNum); - continue; - } - // 是否需要设置异常信息 - if (field.getName().equals(ROW_TIPS)) { - hasRowTipsField = true; - continue; - } - // 原始数据 - if (field.getName().equals(ROW_DATA)) { - field.setAccessible(true); - field.set(t, obj.toString()); - continue; - } - // 设置对应属性值 - setFieldValue(t, field, obj, uniqueBuilder, errMsgList); - } - // 数据唯一性校验 - if (uniqueBuilder.length() > 0) { - if (uniqueMap.containsValue(uniqueBuilder.toString())) { - Set rowNumKeys = uniqueMap.keySet(); - for (Integer num : rowNumKeys) { - if (uniqueMap.get(num).equals(uniqueBuilder.toString())) { - errMsgList.add(String.format("数据唯一性校验失败,(%s)与第%s行重复)", uniqueBuilder, num)); - } - } - } else { - uniqueMap.put(rowNum, uniqueBuilder.toString()); - } - } - // 失败处理 - if (errMsgList.isEmpty() && !hasRowTipsField) { - return t; - } - StringBuilder sb = new StringBuilder(); - int size = errMsgList.size(); - for (int i = 0; i < size; i++) { - if (i == size - 1) { - sb.append(errMsgList.get(i)); - } else { - sb.append(errMsgList.get(i)).append(";"); - } - } - // 设置错误信息 - for (Field field : fields) { - if (field.getName().equals(ROW_TIPS)) { - field.setAccessible(true); - field.set(t, sb.toString()); - } - } - return t; - } - - private static void setFieldValue(T t, Field field, JSONObject obj, StringBuilder uniqueBuilder, List errMsgList) { - // 获取 ExcelImport 注解属性 - ExcelImport annotation = field.getAnnotation(ExcelImport.class); - if (annotation == null) { - return; - } - String cname = annotation.value(); - if (cname.trim().length() == 0) { - return; - } - // 获取具体值 - String val = null; - if (obj.containsKey(cname)) { - val = getString(obj.getString(cname)); - } - if (val == null) { - return; - } - field.setAccessible(true); - // 判断是否必填 - boolean require = annotation.required(); - if (require && val.isEmpty()) { - errMsgList.add(String.format("[%s]不能为空", cname)); - return; - } - // 数据唯一性获取 - boolean unique = annotation.unique(); - if (unique) { - if (uniqueBuilder.length() > 0) { - uniqueBuilder.append("--").append(val); - } else { - uniqueBuilder.append(val); - } - } - // 判断是否超过最大长度 - int maxLength = annotation.maxLength(); - if (maxLength > 0 && val.length() > maxLength) { - errMsgList.add(String.format("[%s]长度不能超过%s个字符(当前%s个字符)", cname, maxLength, val.length())); - } - // 判断当前属性是否有映射关系 - LinkedHashMap kvMap = getKvMap(annotation.kv()); - if (!kvMap.isEmpty()) { - boolean isMatch = false; - for (String key : kvMap.keySet()) { - if (kvMap.get(key).equals(val)) { - val = key; - isMatch = true; - break; - } - } - if (!isMatch) { - errMsgList.add(String.format("[%s]的值不正确(当前值为%s)", cname, val)); - return; - } - } - // 其余情况根据类型赋值 - String fieldClassName = field.getType().getSimpleName(); - try { - if ("String".equalsIgnoreCase(fieldClassName)) { - field.set(t, val); - } else if ("boolean".equalsIgnoreCase(fieldClassName)) { - field.set(t, Boolean.valueOf(val)); - } else if ("int".equalsIgnoreCase(fieldClassName) || "Integer".equals(fieldClassName)) { - try { - field.set(t, Integer.valueOf(val)); - } catch (NumberFormatException e) { - errMsgList.add(String.format("[%s]的值格式不正确(当前值为%s)", cname, val)); - } - } else if ("double".equalsIgnoreCase(fieldClassName)) { - field.set(t, Double.valueOf(val)); - } else if ("long".equalsIgnoreCase(fieldClassName)) { - field.set(t, Long.valueOf(val)); - } else if ("BigDecimal".equalsIgnoreCase(fieldClassName)) { - field.set(t, new BigDecimal(val)); - } else if ("Date".equalsIgnoreCase(fieldClassName)) { - try { - field.set(t, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val)); - } catch (Exception e) { - field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(val)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static Map readExcelManySheet(MultipartFile mFile, File file) throws IOException { - Workbook book = getWorkbook(mFile, file); - if (book == null) { - return Collections.emptyMap(); - } - Map map = new LinkedHashMap<>(); - for (int i = 0; i < book.getNumberOfSheets(); i++) { - Sheet sheet = book.getSheetAt(i); - JSONArray arr = readSheet(sheet); - map.put(sheet.getSheetName(), arr); - } - book.close(); - return map; - } - - private static JSONArray readExcel(MultipartFile mFile, File file) throws IOException { - Workbook book = getWorkbook(mFile, file); - if (book == null) { - return new JSONArray(); - } - JSONArray array = readSheet(book.getSheetAt(0)); - book.close(); - return array; - } - - private static Workbook getWorkbook(MultipartFile mFile, File file) throws IOException { - boolean fileNotExist = (file == null || !file.exists()); - if (mFile == null && fileNotExist) { - return null; - } - // 解析表格数据 - InputStream in; - String fileName; - if (mFile != null) { - // 上传文件解析 - in = mFile.getInputStream(); - fileName = getString(mFile.getOriginalFilename()).toLowerCase(); - } else { - // 本地文件解析 - in = new FileInputStream(file); - fileName = file.getName().toLowerCase(); - } - Workbook book; - if (fileName.endsWith(XLSX)) { - book = new XSSFWorkbook(in); - } else if (fileName.endsWith(XLS)) { - POIFSFileSystem poifsFileSystem = new POIFSFileSystem(in); - book = new HSSFWorkbook(poifsFileSystem); - } else { - return null; - } - in.close(); - return book; - } - - private static JSONArray readSheet(Sheet sheet) { - // 首行下标 - int rowStart = sheet.getFirstRowNum(); - // 尾行下标 - int rowEnd = sheet.getLastRowNum(); - // 获取表头行 - Row headRow = sheet.getRow(rowStart); - if (headRow == null) { - return new JSONArray(); - } - int cellStart = headRow.getFirstCellNum(); - int cellEnd = headRow.getLastCellNum(); - Map keyMap = new HashMap<>(); - for (int j = cellStart; j < cellEnd; j++) { - // 获取表头数据 - String val = getCellValue(headRow.getCell(j)); - if (val != null && val.trim().length() != 0) { - keyMap.put(j, val); - } - } - // 如果表头没有数据则不进行解析 - if (keyMap.isEmpty()) { - return (JSONArray) Collections.emptyList(); - } - // 获取每行JSON对象的值 - JSONArray array = new JSONArray(); - // 如果首行与尾行相同,表明只有一行,返回表头数据 - if (rowStart == rowEnd) { - JSONObject obj = new JSONObject(); - // 添加行号 - obj.put(ROW_NUM, 1); - for (int i : keyMap.keySet()) { - obj.put(keyMap.get(i), ""); - } - array.add(obj); - return array; - } - for (int i = rowStart + 1; i <= rowEnd; i++) { - Row eachRow = sheet.getRow(i); - JSONObject obj = new JSONObject(); - // 添加行号 - obj.put(ROW_NUM, i + 1); - StringBuilder sb = new StringBuilder(); - for (int k = cellStart; k < cellEnd; k++) { - if (eachRow != null) { - String val = getCellValue(eachRow.getCell(k)); - // 所有数据添加到里面,用于判断该行是否为空 - sb.append(val); - obj.put(keyMap.get(k), val); - } - } - if (sb.length() > 0) { - array.add(obj); - } - } - return array; - } - - private static String getCellValue(Cell cell) { - // 空白或空 - if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) { - return ""; - } - // String类型 - if (cell.getCellTypeEnum() == CellType.STRING) { - String val = cell.getStringCellValue(); - if (val == null || val.trim().length() == 0) { - return ""; - } - return val.trim(); - } - // 数字类型 - if (cell.getCellTypeEnum() == CellType.NUMERIC) { - String s = cell.getNumericCellValue() + ""; - // 去掉尾巴上的小数点0 - if (Pattern.matches(".*\\.0*", s)) { - return s.split("\\.")[0]; - } else { - return s; - } - } - // 布尔值类型 - if (cell.getCellTypeEnum() == CellType.BOOLEAN) { - return cell.getBooleanCellValue() + ""; - } - // 错误类型 - return cell.getCellFormula(); - } - - public static void exportTemplate(HttpServletResponse response, String fileName, Class clazz) { - exportTemplate(response, fileName, fileName, clazz, false); - } - - public static void exportTemplate(HttpServletResponse response, String fileName, String sheetName, - Class clazz) { - exportTemplate(response, fileName, sheetName, clazz, false); - } - - public static void exportTemplate(HttpServletResponse response, String fileName, Class clazz, - boolean isContainExample) { - exportTemplate(response, fileName, fileName, clazz, isContainExample); - } - - public static void exportTemplate(HttpServletResponse response, String fileName, String sheetName, - Class clazz, boolean isContainExample) { - // 获取表头字段 - List headFieldList = getExcelClassFieldList(clazz); - // 获取表头数据和示例数据 - List> sheetDataList = new ArrayList<>(); - List headList = new ArrayList<>(); - List exampleList = new ArrayList<>(); - Map> selectMap = new LinkedHashMap<>(); - for (int i = 0; i < headFieldList.size(); i++) { - ExcelClassField each = headFieldList.get(i); - headList.add(each.getName()); - exampleList.add(each.getExample()); - LinkedHashMap kvMap = each.getKvMap(); - if (kvMap != null && kvMap.size() > 0) { - selectMap.put(i, new ArrayList<>(kvMap.values())); - } - } - sheetDataList.add(headList); - if (isContainExample) { - sheetDataList.add(exampleList); - } - // 导出数据 - export(response, fileName, sheetName, sheetDataList, selectMap); - } - - private static List getExcelClassFieldList(Class clazz) { - // 解析所有字段 - Field[] fields = clazz.getDeclaredFields(); - boolean hasExportAnnotation = false; - Map> map = new LinkedHashMap<>(); - List sortList = new ArrayList<>(); - for (Field field : fields) { - ExcelClassField cf = getExcelClassField(field); - if (cf.getHasAnnotation() == 1) { - hasExportAnnotation = true; - } - int sort = cf.getSort(); - if (map.containsKey(sort)) { - map.get(sort).add(cf); - } else { - List list = new ArrayList<>(); - list.add(cf); - sortList.add(sort); - map.put(sort, list); - } - } - Collections.sort(sortList); - // 获取表头 - List headFieldList = new ArrayList<>(); - if (hasExportAnnotation) { - for (Integer sort : sortList) { - for (ExcelClassField cf : map.get(sort)) { - if (cf.getHasAnnotation() == 1) { - headFieldList.add(cf); - } - } - } - } else { - headFieldList.addAll(map.get(0)); - } - return headFieldList; - } - - private static ExcelClassField getExcelClassField(Field field) { - ExcelClassField cf = new ExcelClassField(); - String fieldName = field.getName(); - cf.setFieldName(fieldName); - ExcelExport annotation = field.getAnnotation(ExcelExport.class); - // 无 ExcelExport 注解情况 - if (annotation == null) { - cf.setHasAnnotation(0); - cf.setName(fieldName); - cf.setSort(0); - return cf; - } - // 有 ExcelExport 注解情况 - cf.setHasAnnotation(1); - cf.setName(annotation.value()); - String example = getString(annotation.example()); - if (!example.isEmpty()) { - if (isNumeric(example) && example.length() < 8) { - cf.setExample(Double.valueOf(example)); - } else { - cf.setExample(example); - } - } else { - cf.setExample(""); - } - cf.setSort(annotation.sort()); - // 解析映射 - String kv = getString(annotation.kv()); - cf.setKvMap(getKvMap(kv)); - return cf; - } - - private static LinkedHashMap getKvMap(String kv) { - LinkedHashMap kvMap = new LinkedHashMap<>(); - if (kv.isEmpty()) { - return kvMap; - } - String[] kvs = kv.split(";"); - if (kvs.length == 0) { - return kvMap; - } - for (String each : kvs) { - String[] eachKv = getString(each).split("-"); - if (eachKv.length != 2) { - continue; - } - String k = eachKv[0]; - String v = eachKv[1]; - if (k.isEmpty() || v.isEmpty()) { - continue; - } - kvMap.put(k, v); - } - return kvMap; - } - - /** - * 导出表格到本地 - * - * @param file 本地文件对象 - * @param sheetData 导出数据 - */ - public static void exportFile(File file, List> sheetData) { - if (file == null) { - System.out.println("文件创建失败"); - return; - } - if (sheetData == null) { - sheetData = new ArrayList<>(); - } - Map>> map = new HashMap<>(); - map.put(file.getName(), sheetData); - export(null, file, file.getName(), map, null); - } - - /** - * 导出表格到本地 - * - * @param 导出数据类似,和K类型保持一致 - * @param filePath 文件父路径(如:D:/doc/excel/) - * @param fileName 文件名称(不带尾缀,如:学生表) - * @param list 导出数据 - * @throws IOException IO异常 - */ - public static File exportFile(String filePath, String fileName, List list) throws IOException { - File file = getFile(filePath, fileName); - List> sheetData = getSheetData(list); - exportFile(file, sheetData); - return file; - } - - /** - * 获取文件 - * - * @param filePath filePath 文件父路径(如:D:/doc/excel/) - * @param fileName 文件名称(不带尾缀,如:用户表) - * @return 本地File文件对象 - */ - private static File getFile(String filePath, String fileName) throws IOException { - String dirPath = getString(filePath); - String fileFullPath; - if (dirPath.isEmpty()) { - fileFullPath = fileName; - } else { - // 判定文件夹是否存在,如果不存在,则级联创建 - File dirFile = new File(dirPath); - if (!dirFile.exists()) { - boolean mkdirs = dirFile.mkdirs(); - if (!mkdirs) { - return null; - } - } - // 获取文件夹全名 - if (dirPath.endsWith(String.valueOf(LEAN_LINE))) { - fileFullPath = dirPath + fileName + XLSX; - } else { - fileFullPath = dirPath + LEAN_LINE + fileName + XLSX; - } - } - System.out.println(fileFullPath); - File file = new File(fileFullPath); - if (!file.exists()) { - boolean result = file.createNewFile(); - if (!result) { - return null; - } - } - return file; - } - - private static List> getSheetData(List list) { - // 获取表头字段 - List excelClassFieldList = getExcelClassFieldList(list.get(0).getClass()); - List headFieldList = new ArrayList<>(); - List headList = new ArrayList<>(); - Map headFieldMap = new HashMap<>(); - for (ExcelClassField each : excelClassFieldList) { - String fieldName = each.getFieldName(); - headFieldList.add(fieldName); - headFieldMap.put(fieldName, each); - headList.add(each.getName()); - } - // 添加表头名称 - List> sheetDataList = new ArrayList<>(); - sheetDataList.add(headList); - // 获取表数据 - for (T t : list) { - Map fieldDataMap = getFieldDataMap(t); - Set fieldDataKeys = fieldDataMap.keySet(); - List rowList = new ArrayList<>(); - for (String headField : headFieldList) { - if (!fieldDataKeys.contains(headField)) { - continue; - } - Object data = fieldDataMap.get(headField); - if (data == null) { - rowList.add(""); - continue; - } - ExcelClassField cf = headFieldMap.get(headField); - // 判断是否有映射关系 - LinkedHashMap kvMap = cf.getKvMap(); - if (kvMap == null || kvMap.isEmpty()) { - rowList.add(data); - continue; - } - String val = kvMap.get(data.toString()); - if (isNumeric(val)) { - rowList.add(Double.valueOf(val)); - } else { - rowList.add(val); - } - } - sheetDataList.add(rowList); - } - return sheetDataList; - } - - private static Map getFieldDataMap(T t) { - Map map = new HashMap<>(); - Field[] fields = t.getClass().getDeclaredFields(); - try { - for (Field field : fields) { - String fieldName = field.getName(); - field.setAccessible(true); - Object object = field.get(t); - map.put(fieldName, object); - } - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - return map; - } - - public static void exportEmpty(HttpServletResponse response, String fileName) { - List> sheetDataList = new ArrayList<>(); - List headList = new ArrayList<>(); - headList.add("导出无数据"); - sheetDataList.add(headList); - export(response, fileName, sheetDataList); - } - - public static void export(HttpServletResponse response, String fileName, List> sheetDataList) { - export(response, fileName, fileName, sheetDataList, null); - } - - public static void exportManySheet(HttpServletResponse response, String fileName, Map>> sheetMap) { - export(response, null, fileName, sheetMap, null); - } - - - public static void export(HttpServletResponse response, String fileName, String sheetName, - List> sheetDataList) { - export(response, fileName, sheetName, sheetDataList, null); - } - - public static void export(HttpServletResponse response, String fileName, String sheetName, - List> sheetDataList, Map> selectMap) { - - Map>> map = new HashMap<>(); - map.put(sheetName, sheetDataList); - export(response, null, fileName, map, selectMap); - } - - public static void export(HttpServletResponse response, String fileName, List list, Class template) { - // list 是否为空 - boolean lisIsEmpty = list == null || list.isEmpty(); - // 如果模板数据为空,且导入的数据为空,则导出空文件 - if (template == null && lisIsEmpty) { - exportEmpty(response, fileName); - return; - } - // 如果 list 数据,则导出模板数据 - if (lisIsEmpty) { - exportTemplate(response, fileName, template); - return; - } - // 导出数据 - List> sheetDataList = getSheetData(list); - export(response, fileName, sheetDataList); - } - - public static void export(HttpServletResponse response, String fileName, List> sheetDataList, Map> selectMap) { - export(response, fileName, fileName, sheetDataList, selectMap); - } - - private static void export(HttpServletResponse response, File file, String fileName, - Map>> sheetMap, Map> selectMap) { - // 整个 Excel 表格 book 对象 - SXSSFWorkbook book = new SXSSFWorkbook(); - // 每个 Sheet 页 - Set>>> entries = sheetMap.entrySet(); - for (Entry>> entry : entries) { - List> sheetDataList = entry.getValue(); - Sheet sheet = book.createSheet(entry.getKey()); - Drawing patriarch = sheet.createDrawingPatriarch(); - // 设置表头背景色(灰色) - CellStyle headStyle = book.createCellStyle(); - headStyle.setFillForegroundColor(IndexedColors.GREY_80_PERCENT.index); - headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - headStyle.setAlignment(HorizontalAlignment.CENTER); - headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index); - // 设置表身背景色(默认色) - CellStyle rowStyle = book.createCellStyle(); - rowStyle.setAlignment(HorizontalAlignment.CENTER); - rowStyle.setVerticalAlignment(VerticalAlignment.CENTER); - // 设置表格列宽度(默认为15个字节) - sheet.setDefaultColumnWidth(15); - // 创建合并算法数组 - int rowLength = sheetDataList.size(); - int columnLength = sheetDataList.get(0).size(); - int[][] mergeArray = new int[rowLength][columnLength]; - for (int i = 0; i < sheetDataList.size(); i++) { - // 每个 Sheet 页中的行数据 - Row row = sheet.createRow(i); - List rowList = sheetDataList.get(i); - for (int j = 0; j < rowList.size(); j++) { - // 每个行数据中的单元格数据 - Object o = rowList.get(j); - int v = 0; - if (o instanceof URL) { - // 如果要导出图片的话, 链接需要传递 URL 对象 - setCellPicture(book, row, patriarch, i, j, (URL) o); - } else { - Cell cell = row.createCell(j); - if (i == 0) { - // 第一行为表头行,采用灰色底背景 - v = setCellValue(cell, o, headStyle); - } else { - // 其他行为数据行,默认白底色 - v = setCellValue(cell, o, rowStyle); - } - } - mergeArray[i][j] = v; - } - } - // 合并单元格 - mergeCells(sheet, mergeArray); - // 设置下拉列表 - setSelect(sheet, selectMap); - } - // 写数据 - if (response != null) { - // 前端导出 - try { - write(response, book, fileName); - } catch (IOException e) { - e.printStackTrace(); - } - } else { - // 本地导出 - FileOutputStream fos; - try { - fos = new FileOutputStream(file); - ByteArrayOutputStream ops = new ByteArrayOutputStream(); - book.write(ops); - fos.write(ops.toByteArray()); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - /** - * 合并当前Sheet页的单元格 - * - * @param sheet 当前 sheet 页 - * @param mergeArray 合并单元格算法 - */ - private static void mergeCells(Sheet sheet, int[][] mergeArray) { - // 横向合并 - for (int x = 0; x < mergeArray.length; x++) { - int[] arr = mergeArray[x]; - boolean merge = false; - int y1 = 0; - int y2 = 0; - for (int y = 0; y < arr.length; y++) { - int value = arr[y]; - if (value == CELL_COLUMN_MERGE) { - if (!merge) { - y1 = y; - } - y2 = y; - merge = true; - } else { - merge = false; - if (y1 > 0) { - sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2)); - } - y1 = 0; - y2 = 0; - } - } - if (y1 > 0) { - sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2)); - } - } - // 纵向合并 - int xLen = mergeArray.length; - int yLen = mergeArray[0].length; - for (int y = 0; y < yLen; y++) { - boolean merge = false; - int x1 = 0; - int x2 = 0; - for (int x = 0; x < xLen; x++) { - int value = mergeArray[x][y]; - if (value == CELL_ROW_MERGE) { - if (!merge) { - x1 = x; - } - x2 = x; - merge = true; - } else { - merge = false; - if (x1 > 0) { - sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); - } - x1 = 0; - x2 = 0; - } - } - if (x1 > 0) { - sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); - } - } - } - - private static void write(HttpServletResponse response, SXSSFWorkbook book, String fileName) throws IOException { - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - String name = new String(fileName.getBytes("GBK"), "ISO8859_1") + XLSX; - response.addHeader("Content-Disposition", "attachment;filename=" + name); - ServletOutputStream out = response.getOutputStream(); - book.write(out); - out.flush(); - out.close(); - } - - private static int setCellValue(Cell cell, Object o, CellStyle style) { - // 设置样式 - cell.setCellStyle(style); - // 数据为空时 - if (o == null) { - cell.setCellType(CellType.STRING); - cell.setCellValue(""); - return CELL_OTHER; - } - // 是否为字符串 - if (o instanceof String) { - String s = o.toString(); - // 当数字类型长度超过8位时,改为字符串类型显示(Excel数字超过一定长度会显示为科学计数法) - if (isNumeric(s) && s.length() < 8) { - cell.setCellType(CellType.NUMERIC); - cell.setCellValue(Double.parseDouble(s)); - return CELL_OTHER; - } else { - cell.setCellType(CellType.STRING); - cell.setCellValue(s); - } - if (s.equals(ROW_MERGE)) { - return CELL_ROW_MERGE; - } else if (s.equals(COLUMN_MERGE)) { - return CELL_COLUMN_MERGE; - } else { - return CELL_OTHER; - } - } - // 是否为字符串 - if (o instanceof Integer || o instanceof Long || o instanceof Double || o instanceof Float) { - cell.setCellType(CellType.NUMERIC); - cell.setCellValue(Double.parseDouble(o.toString())); - return CELL_OTHER; - } - // 是否为Boolean - if (o instanceof Boolean) { - cell.setCellType(CellType.BOOLEAN); - cell.setCellValue((Boolean) o); - return CELL_OTHER; - } - // 如果是BigDecimal,则默认3位小数 - if (o instanceof BigDecimal) { - cell.setCellType(CellType.NUMERIC); - cell.setCellValue(((BigDecimal) o).setScale(3, RoundingMode.HALF_UP).doubleValue()); - return CELL_OTHER; - } - // 如果是Date数据,则显示格式化数据 - if (o instanceof Date) { - cell.setCellType(CellType.STRING); - cell.setCellValue(formatDate((Date) o)); - return CELL_OTHER; - } - // 如果是其他,则默认字符串类型 - cell.setCellType(CellType.STRING); - cell.setCellValue(o.toString()); - return CELL_OTHER; - } - - private static void setCellPicture(SXSSFWorkbook wb, Row sr, Drawing patriarch, int x, int y, URL url) { - // 设置图片宽高 - sr.setHeight((short) (IMG_WIDTH * IMG_HEIGHT)); - // (jdk1.7版本try中定义流可自动关闭) - try (InputStream is = url.openStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - byte[] buff = new byte[BYTES_DEFAULT_LENGTH]; - int rc; - while ((rc = is.read(buff, 0, BYTES_DEFAULT_LENGTH)) > 0) { - outputStream.write(buff, 0, rc); - } - // 设置图片位置 - XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, y, x, y + 1, x + 1); - // 设置这个,图片会自动填满单元格的长宽 - anchor.setAnchorType(AnchorType.MOVE_AND_RESIZE); - patriarch.createPicture(anchor, wb.addPicture(outputStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static String formatDate(Date date) { - if (date == null) { - return ""; - } - SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); - return format.format(date); - } - - private static void setSelect(Sheet sheet, Map> selectMap) { - if (selectMap == null || selectMap.isEmpty()) { - return; - } - Set>> entrySet = selectMap.entrySet(); - for (Entry> entry : entrySet) { - int y = entry.getKey(); - List list = entry.getValue(); - if (list == null || list.isEmpty()) { - continue; - } - String[] arr = new String[list.size()]; - for (int i = 0; i < list.size(); i++) { - arr[i] = list.get(i); - } - DataValidationHelper helper = sheet.getDataValidationHelper(); - CellRangeAddressList addressList = new CellRangeAddressList(1, 65000, y, y); - DataValidationConstraint dvc = helper.createExplicitListConstraint(arr); - DataValidation dv = helper.createValidation(dvc, addressList); - if (dv instanceof HSSFDataValidation) { - dv.setSuppressDropDownArrow(false); - } else { - dv.setSuppressDropDownArrow(true); - dv.setShowErrorBox(true); - } - sheet.addValidationData(dv); - } - } - - private static boolean isNumeric(String str) { - if (Objects.nonNull(str) && "0.0".equals(str)) { - return true; - } - for (int i = str.length(); --i >= 0; ) { - if (!Character.isDigit(str.charAt(i))) { - return false; - } - } - return true; - } - - private static String getString(String s) { - if (s == null) { - return ""; - } - if (s.isEmpty()) { - return s; - } - return s.trim(); - } - -} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/PlateController.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/PlateController.java index b9819bf73..1e2397470 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/PlateController.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/PlateController.java @@ -1,6 +1,7 @@ package com.cf.imes.module.manage.controller.admin.plate; import com.cf.imes.module.manage.controller.admin.plate.vo.plate.*; +import com.cf.imes.module.manage.service.plate.PlateExcelUtil; import io.swagger.v3.oas.annotations.Parameters; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -9,7 +10,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; -import java.math.BigDecimal; import java.util.*; import java.io.IOException; @@ -98,16 +98,17 @@ public class PlateController { @GetMapping("/get-import-template") @Operation(summary = "获得导入用户模板") + @PreAuthorize("@ss.hasPermission('manage:plate:export')") public void importTemplate(HttpServletResponse response) throws IOException { // 手动创建导出 demo List list = Arrays.asList( - PlateImportExcelVO.builder().goodsId("SP1123456").goodsName("xixih").material("颗粒板").width(BigDecimal.valueOf(1212.3)).height(BigDecimal.valueOf(12131.6)) - .thickness(BigDecimal.valueOf(0.2)).brand("SexEnum.MALE.getSex()").spec("大厂").remark("测试").build(),//.price(33333.2) - PlateImportExcelVO.builder().goodsId("SP1123457").goodsName("2L").material("yuanma@cf.com").width(BigDecimal.valueOf(21.6)).height(BigDecimal.valueOf(123231.6)) - .thickness(BigDecimal.valueOf(5.3)).brand("kkkkkk").spec("大厂").remark("测试").build()//.price(333.555) + PlateImportExcelVO.builder().goodsId("SP1123456").goodsName("xixih").material("颗粒板").width(String.valueOf(1212.3)).height(String.valueOf(12131.6)) + .thickness(String.valueOf(0.2)).brand("鹅厂").spec("大厂").remark("测试").price(String.valueOf(33333.2)).build(), + PlateImportExcelVO.builder().goodsId("SP1123457").goodsName("2L").material("yuanma@cf.com").width(String.valueOf(21.6)).height(String.valueOf(12231.6)) + .thickness(String.valueOf(5.3)).brand("kkkkkk").spec("大厂").remark("测试").price(String.valueOf(333.555)).build() ); // 输出 - ExcelUtils.write(response, "板材导入模板.xls", "板材列表", PlateImportExcelVO.class, list); + ExcelUtils.write(response, "板材导入模板.xlsx", "板材列表", PlateImportExcelVO.class, list); } @PostMapping("/import") @@ -118,11 +119,20 @@ public class PlateController { @Parameter(name = "organId", description = "板材所属组织ID") }) @PreAuthorize("@ss.hasPermission('manage:plate:import')") - public CommonResult importExcel(@RequestParam("file") MultipartFile file, + public void importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport, - @RequestParam(value = "organId") Long organId) throws Exception { - List list = ExcelUtils.read(file, PlateImportExcelVO.class); - return success(plateService.importPlateList(list, updateSupport , organId)); + @RequestParam(value = "organId") Long organId, + HttpServletResponse response) throws Exception { + PlateExcelUtil plateExcelUtil = new PlateExcelUtil(); + List list = plateExcelUtil.read(file, PlateImportExcelVO.class); + +// 判断文件是否导入成功 + if (!plateExcelUtil.getFlag()) + ExcelUtils.write(response, "板材导入模板.xlsx", "板材列表", PlateImportExcelVO.class, list); + else + plateService.importPlateList(list, updateSupport, organId);// 成功,批量导入 + + plateExcelUtil.clear(); } } \ 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/controller/admin/plate/vo/plate/PlateImportExcelVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateImportExcelVO.java index 1c659c47b..d8f396882 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateImportExcelVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateImportExcelVO.java @@ -1,18 +1,14 @@ package com.cf.imes.module.manage.controller.admin.plate.vo.plate; -import com.cf.imes.framework.excel.core.annotations.DictFormat; -import com.cf.imes.framework.excel.core.convert.DictConvert; -import com.cf.imes.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import java.math.BigDecimal; -import java.time.LocalDateTime; +import javax.validation.constraints.NotEmpty; /** * 用户 Excel 导入 VO @@ -25,36 +21,80 @@ import java.time.LocalDateTime; public class PlateImportExcelVO { @ExcelProperty("商品编号") + @NotEmpty(message = "商品编号不能为空") private String goodsId; @ExcelProperty("商品名称") + @NotEmpty(message = "商品名称不能为空") private String goodsName; @ExcelProperty("材质") + @NotEmpty(message = "材质不能为空") private String material; @ExcelProperty("颜色") + @NotEmpty(message = "颜色不能为空") private String color; @ExcelProperty("宽度") - private BigDecimal width; + @NotEmpty(message = "宽度不能为空") + private String width; - @ExcelProperty("高度") - private BigDecimal height; + @ExcelProperty("高度")// float(8,3) + @NotEmpty(message = "高度不能为空") + private String height; @ExcelProperty("厚度") - private BigDecimal thickness; + @NotEmpty(message = "厚度不能为空") + private String thickness; @ExcelProperty("价格") - private Double price; + @NotEmpty(message = "价格不能为空") + private String price; @ExcelProperty("品牌") + @NotEmpty(message = "品牌不能为空") private String brand; @ExcelProperty("规格") + @NotEmpty(message = "规格不能为空") private String spec; @ExcelProperty("备注") private String remark; + @ExcelProperty("上传结果") + private String result; + + public boolean isValidGoods() { + return !(goodsId == null || goodsId.isEmpty() || goodsName == null || goodsName.isEmpty() || material == null || + material.isEmpty() || color == null || color.isEmpty() || width == null ||width.isEmpty() || height == null || + height.isEmpty() || height == null ||thickness.isEmpty() || brand == null || brand.isEmpty() || spec == null || spec.isEmpty()); + } + +// 数据长度判断 + public boolean checkPrecision(Double number) { + if (number == null) { + return false; + } + // 将浮点数转换成字符串 + String numberStr = Double.toString(number); + + // 分割整数部分和小数部分 + String[] parts = numberStr.split("\\."); + String integerPart = parts[0]; + String decimalPart = parts.length > 1 ? parts[1] : ""; + + // 检查整数部分位数 + if (integerPart.length() > 5) { + return false; + } + + // 检查小数部分位数 + if (decimalPart.length() > 3) { + return false; + } + + return 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/plate/PlatePageReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlatePageReqVO.java index 748f9fedc..b38555ef8 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlatePageReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlatePageReqVO.java @@ -2,8 +2,6 @@ package com.cf.imes.module.manage.controller.admin.plate.vo.plate; import lombok.*; -import java.math.BigDecimal; -import java.util.*; import io.swagger.v3.oas.annotations.media.Schema; import com.cf.imes.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; @@ -30,13 +28,13 @@ public class PlatePageReqVO extends PageParam { private String color; @Schema(description = "宽度") - private BigDecimal width; + private Double width; @Schema(description = "高度") - private BigDecimal height; + private Double height; @Schema(description = "厚度") - private BigDecimal thickness; + private Double thickness; @Schema(description = "价格", example = "3380") private Double price; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateRespVO.java index 1939b033b..deccb9c38 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateRespVO.java @@ -3,10 +3,6 @@ package com.cf.imes.module.manage.controller.admin.plate.vo.plate; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.math.BigDecimal; -import java.util.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; @@ -16,11 +12,10 @@ import com.alibaba.excel.annotation.*; public class PlateRespVO { @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("主键") private Long id; @Schema(description = "客户的商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("客户的商品编号") + @ExcelProperty("商品编号") private String goodsId; @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") @@ -28,7 +23,7 @@ public class PlateRespVO { private String goodsName; @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") + @ExcelProperty("材质") private String material; @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) @@ -37,15 +32,15 @@ public class PlateRespVO { @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("宽度") - private BigDecimal width; + private Double width; @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("高度") - private BigDecimal height; + private Double height; @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("厚度") - private BigDecimal thickness; + private Double thickness; @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") @ExcelProperty("价格") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateSaveReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateSaveReqVO.java index 51393fc5f..a8976899b 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateSaveReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/plate/vo/plate/PlateSaveReqVO.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -import java.math.BigDecimal; @Schema(description = "管理后台 - 板材信息表 plate_{N}新增/修改 Request VO") @Data @@ -31,15 +30,15 @@ public class PlateSaveReqVO { @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "宽度不能为空") - private BigDecimal width; + private Double width; @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "高度不能为空") - private BigDecimal height; + private Double height; @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "厚度不能为空") - private BigDecimal thickness; + private Double thickness; @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") @NotNull(message = "价格不能为空") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/PlateDO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/PlateDO.java index 6ce4b32cb..0204a7527 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/plate/PlateDO.java @@ -2,10 +2,6 @@ package com.cf.imes.module.manage.dal.dataobject.plate; import lombok.*; -import java.math.BigDecimal; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.*; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; @@ -48,15 +44,15 @@ public class PlateDO extends BaseDO { /** * 宽度 */ - private BigDecimal width; + private Double width; /** * 高度 */ - private BigDecimal height; + private Double height; /** * 厚度 */ - private BigDecimal thickness; + private Double thickness; /** * 价格 */ diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java index 69c386f90..2f2844c80 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/plate/PlateMapper.java @@ -6,6 +6,7 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlatePageReqVO; import com.cf.imes.module.manage.dal.dataobject.plate.PlateDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 板材信息表 plate_{N} Mapper @@ -37,4 +38,5 @@ public interface PlateMapper extends BaseMapperX { .orderByDesc(PlateDO::getId)); } -} \ No newline at end of file + PlateDO selectOneById(@Param("id") Long id, @Param("organId") Long organId); +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateExcelListener.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateExcelListener.java new file mode 100644 index 000000000..ac9974011 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateExcelListener.java @@ -0,0 +1,102 @@ +package com.cf.imes.module.manage.service.plate; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; + +@Slf4j +public final class PlateExcelListener extends AnalysisEventListener { + + /** + * 自定义用于暂时存储data + * 可以通过实例获取该值 + */ + private List datas = new ArrayList<>(); + + private boolean flag = true; + + private Map valueMap = new HashMap<>(); + + /** + * 每解析一行都会回调invoke()方法 + * + * @param data 读取后的数据对象 + * @param context 内容 + */ + @Override + public void invoke(PlateImportExcelVO data, AnalysisContext context) { + if (!data.isValidGoods()) {//返回false,表示商品信息无效;否则返回true,表示商品信息有效 + data.setResult("商品关键信息缺少"); + this.flag = false; + } + checkData(data.getHeight(),"高度",data); + checkData(data.getWidth(),"宽度",data); + checkData(data.getThickness(),"厚度",data); + checkData(data.getPrice(),"价格",data); + if (data.getResult() != null) + data.setResult(data.getResult().replace("null,", "")); + valueMap.put(context.getCurrentRowNum(), data.getResult()); + datas.add(data); + } + + // 错误判断 + private void checkData(String valueCheck, String head, PlateImportExcelVO data) { +// 长宽厚、价格判断非空 + if (valueCheck == null || valueCheck.equals("")) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "信息缺少"); + } else { + try { + if (!data.checkPrecision(Double.valueOf(valueCheck))) { + data.setResult(data.getResult() + "," + head + "数据有误"); + this.flag = false; + } + } catch (NumberFormatException e) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "需要填写数字"); + } + } + } + + /** + * 读取完后操作 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + if (this.flag) + log.info("PlateExcelListener 所有数据读取完成"); + } + + /** + * 返回数据 + * + * @return 返回读取的数据集合 + **/ + public List getDatas() { + return datas; + } + + /** + * 返回读取结果 + * + * @return 是否读取成功 + **/ + public boolean getFlag() { + return flag; + } + + /** + * 返回错误信息 + * + * @return String + **/ + public Map getValueMap() { + return valueMap; + } + +} \ 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/plate/PlateExcelUtil.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateExcelUtil.java new file mode 100644 index 000000000..c1c8a8085 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateExcelUtil.java @@ -0,0 +1,64 @@ +package com.cf.imes.module.manage.service.plate; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@Slf4j +public class PlateExcelUtil { + + private String value; + + private PlateExcelListener excelListener = new PlateExcelListener<>(); + + public List read(MultipartFile file, Class head) throws IOException { + + if (file.isEmpty()) { + value = "文件为空"; + throw new IOException("文件为空"); + } else if (!(file.getOriginalFilename().endsWith(".xlsx") || file.getOriginalFilename().endsWith(".xls"))) { + value = "文件格式不正确"; + throw new IOException("文件格式不正确"); + } else if (file.getSize() > 1024 * 1024 * 10) { + value = "文件大小超过 10M"; + throw new IOException("文件大小超过 10M"); + } else if (file.getSize() == 0) { + value = "文件大小为 0"; + throw new IOException("文件大小为 0"); + } else { + EasyExcel.read(file.getInputStream(), PlateImportExcelVO.class, excelListener) + .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 + .headRowNumber(1).sheet(0).doRead(); + //获取读取的数据 + List list = excelListener.getDatas(); + + if (excelListener.getValueMap().size() > 0) + excelListener.getValueMap().forEach((k, v) -> { + list.get(k - 1).setResult(v); + }); + return list; + } + } + + public boolean getFlag() { + return excelListener.getFlag(); + } + + public void clear() { + excelListener.getDatas().clear(); + } + + public Map getValueMap() { + return excelListener.getValueMap(); + } +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java index 276ba4dbd..9566ca147 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO; import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportRespVO; import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlatePageReqVO; @@ -17,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import com.cf.imes.module.manage.dal.dataobject.plate.PlateDO; -import com.cf.imes.framework.datapermission.core.util.DataPermissionUtils; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; @@ -51,7 +51,7 @@ public class PlateServiceImpl implements PlateService { validateGoodExists(createReqVO.getGoodsId(), createReqVO.getOrganId()); plate.setOrganId(createReqVO.getOrganId()); } - plateMapper.insert(plate); + plateMapper.insert(plate.setOrganId(OrganContextHolder.getOrganId()));// 组织id未传输 // 返回 return plate.getId(); } @@ -90,13 +90,6 @@ public class PlateServiceImpl implements PlateService { } - private void validatePlateForCreateOrUpdate(PlateImportExcelVO importPlate) { - // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 - DataPermissionUtils.executeIgnore(() -> { - - }); - } - @Override @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 public PlateImportRespVO importPlateList(List importPlates, boolean isUpdateSupport , Long organId) { @@ -106,19 +99,17 @@ public class PlateServiceImpl implements PlateService { validateOrganExists(organId); PlateImportRespVO respVO = PlateImportRespVO.builder().createPlateNames(new ArrayList<>()) .updatePlateNames(new ArrayList<>()).failurePlateNames(new LinkedHashMap<>()).build(); +// 批量插入集合 + List insertList = new ArrayList<>(); +// 批量更新集合 + List updateList = new ArrayList<>(); importPlates.forEach(importPlate -> { - // 校验,判断是否有不符合的原因 校验全部是否为空 - try { - validatePlateForCreateOrUpdate(importPlate); - } catch (ServiceException ex) { - respVO.getFailurePlateNames().put(importPlate.getGoodsName() , ex.getMessage()); - return; - } // 判断如果不存在,在进行插入 PlateDO existPlate = plateMapper.selectByGoodID(importPlate.getGoodsId(), organId); if (existPlate == null) { - plateMapper.insert(BeanUtils.toBean(importPlate, PlateDO.class)); - respVO.getCreatePlateNames().add(importPlate.getGoodsName()); + insertList.add(BeanUtils.toBean(importPlate, PlateDO.class).setOrganId(organId)); +// plateMapper.insert(BeanUtils.toBean(importPlate, PlateDO.class).setOrganId(organId)); +// respVO.getCreatePlateNames().add(importPlate.getGoodsName()); return; } // 如果存在,判断是否允许更新 @@ -126,11 +117,18 @@ public class PlateServiceImpl implements PlateService { respVO.getFailurePlateNames().put(importPlate.getGoodsName(), ErrorCodeConstants.PLATE_EXISTS.getMsg()); return; } - PlateDO plateDO = BeanUtils.toBean(importPlate, PlateDO.class); - plateDO.setId(existPlate.getId()); - plateMapper.updateById(plateDO); - respVO.getUpdatePlateNames().add(importPlate.getGoodsName()); + PlateDO plateDO = BeanUtils.toBean(importPlate, PlateDO.class).setOrganId(organId).setId(existPlate.getId()); + updateList.add(plateDO); +// plateMapper.updateById(plateDO); +// respVO.getUpdatePlateNames().add(importPlate.getGoodsName()); }); +// 批量插入,批量更新 + if (insertList.size() > 0 && insertList != null) { + plateMapper.insertBatch(insertList); + } + if (updateList.size() > 0 && updateList != null) { + plateMapper.updateBatch(updateList); + } return respVO; } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/mapper/plate/PlateMapper.xml new file mode 100644 index 000000000..83409ae2e --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -0,0 +1,29 @@ + + + + + + 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 fd6ee3d4c..683390efd 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 @@ -37,7 +37,9 @@ public interface ErrorCodeConstants { ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在"); ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1_002_003_001, "手机号已经存在"); ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1_002_003_002, "邮箱已经存在"); - ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_003_003, "用户不存在"); + ErrorCode + + USER_NOT_EXISTS = new ErrorCode(1_002_003_003, "用户不存在"); ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_003_004, "导入用户数据不能为空!"); ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1_002_003_005, "用户密码校验失败"); ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); @@ -175,7 +177,7 @@ public interface ErrorCodeConstants { //=========== 工序信息 1-002-028-000 ============ ErrorCode PROCESS_NOT_EXISTS = new ErrorCode(1_002_028_000, "工序不存在"); - ErrorCode PROCESS_ID_IS_NULL = new ErrorCode(1_002_028_000, "工序ID不存在"); + ErrorCode PROCESS_ID_IS_NULL = new ErrorCode(1_002_028_000, "工序ID填写错误不存在"); //=========== 工序组信息 1-002-029-000 ============ ErrorCode PROCESS_GROUP_NOT_EXISTS = new ErrorCode(1_002_029_000, "工序组不存在"); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java index 12aa27d18..fb59806ce 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java @@ -5,6 +5,7 @@ import javax.validation.Valid; import javax.servlet.http.HttpServletResponse; +import com.cf.imes.module.system.controller.admin.process.vo.group.ProcessGroupRespVO; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -74,12 +75,30 @@ public class ProcessController { return success(BeanUtils.toBean(processUser, ProcessUserRespVO.class)); } + @GetMapping("/allGet") + @Operation(summary = "获得工序全部信息") + @PreAuthorize("@ss.hasPermission('system:process:query')") + public CommonResult> getProcessAll(@Valid ProcessPageReqVO pageReqVO) { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = processService.getProcessPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ProcessDO.class)); + } + + @GetMapping("/getAll") + @Operation(summary = "获得所有工序信息") + @PreAuthorize("@ss.hasPermission('system:process:query')") + public CommonResult> getAllProcess() { + List processUser = processService.getAllProcess(); + return success(BeanUtils.toBean(processUser, ProcessDO.class)); + } + + @GetMapping("/page") @Operation(summary = "获得工序信息分页") @PreAuthorize("@ss.hasPermission('system:process:query')") public CommonResult> getProcessPage(@Valid ProcessPageReqVO pageReqVO) { PageResult pageResult = processService.getProcessPageAll(pageReqVO); - return success(pageResult); + return success(BeanUtils.toBean(pageResult, ProcessRespVO.class)); } @GetMapping("/export-excel") @@ -91,15 +110,8 @@ public class ProcessController { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = processService.getProcessPage(pageReqVO).getList(); // 导出 Excel - ExcelUtils.write(response, "工序信息表 process.xls", "数据", ProcessRespVO.class, + ExcelUtils.write(response, "工序信息表.xls", "数据", ProcessRespVO.class, BeanUtils.toBean(list, ProcessRespVO.class)); } - @GetMapping("/getAll") - @Operation(summary = "获得所有工序信息") - @PreAuthorize("@ss.hasPermission('system:process:query')") - public CommonResult> getAllProcess() { - List processUser = processService.getAllProcess(); - return success(BeanUtils.toBean(processUser, ProcessDO.class)); - } } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessGroupController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessGroupController.java index 5125e8721..c92d7b65c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessGroupController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessGroupController.java @@ -52,6 +52,7 @@ public class ProcessGroupController { @PostMapping("/create") @Operation(summary = "创建工序组") + @PreAuthorize("@ss.hasPermission('system:process-group:create')") @Transactional(rollbackFor = Exception.class) public CommonResult createProcessGroup(@Valid @RequestBody ProcessGroupSaveReqVO createReqVOLists) { return success(processGroupService.createProcessGroup(createReqVOLists)); @@ -92,7 +93,7 @@ public class ProcessGroupController { } @GetMapping("/export-excel") - @Operation(summary = "导出工序组表 process_group Excel") + @Operation(summary = "导出工序组表") @PreAuthorize("@ss.hasPermission('system:process-group:export')") @OperateLog(type = EXPORT) public void exportProcessGroupExcel(@Valid ProcessGroupPageReqVO pageReqVO, diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/group/ProcessGroupPageReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/group/ProcessGroupPageReqVO.java index b32c5aa95..c7cc7cc6a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/group/ProcessGroupPageReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/group/ProcessGroupPageReqVO.java @@ -14,6 +14,9 @@ import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @ToString(callSuper = true) public class ProcessGroupPageReqVO extends PageParam { + @Schema(description = "组织id", example = "1") + private Long organId; + @Schema(description = "工序组名称", example = "赵六") private String name; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/process/ProcessUserSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/process/ProcessUserSaveReqVO.java index bfc872a22..725880a73 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/process/ProcessUserSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/process/ProcessUserSaveReqVO.java @@ -59,10 +59,11 @@ public class ProcessUserSaveReqVO { private Double prepareTime; @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") - @NotEmpty(message = "描述不能为空") private String description; @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12,13") - private String Users; + private String users; + @Schema(description = "组织Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "181") + private Long organId; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/processUser/ProcessAndUserSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/processUser/ProcessAndUserSaveReqVO.java index 32c7ccbde..b03d08fb5 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/processUser/ProcessAndUserSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/vo/processUser/ProcessAndUserSaveReqVO.java @@ -16,4 +16,5 @@ public class ProcessAndUserSaveReqVO { @NotNull(message = "用户 ID不能为空") private Long userId; + private Long organId; } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessDO.java index 095799324..21c8bb790 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessDO.java @@ -76,4 +76,8 @@ public class ProcessDO extends BaseDO { */ private String description; + /** + * 组织id + */ + private Long organId; } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupDO.java index a05fcc932..8e3df0ce4 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupDO.java @@ -24,6 +24,10 @@ public class ProcessGroupDO extends BaseDO { */ @TableId private Long id; + /** + * 组织id + */ + private Long organId; /** * 工序组名称 */ diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupListDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupListDO.java deleted file mode 100644 index 20c230673..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessGroupListDO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.cf.imes.module.system.dal.dataobject.process; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; -import com.cf.imes.module.system.controller.admin.process.vo.process.ProcessRespVO; - -import java.util.List; - -/** - * @projectName: cf_imes_back - * @author: 晨丰科技 - * @date: 2024/2/27 11:48 - */ -public class ProcessGroupListDO extends BaseDO { - /** - * 工序组 ID - */ - @TableId - private Long id; - /** - * 工序组名称 - */ - private String name; - /** - * 是否默认工序组:0 否 1 是 - */ - private Boolean isDefault; - /** - * 排序优先级 - */ - private Short sort; - /** - * 明细,工序信息 - */ - private List lists; - /** - * 描述 - */ - private String description; -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessUserDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessUserDO.java index 2488708fd..0354314e9 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessUserDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/process/ProcessUserDO.java @@ -20,6 +20,10 @@ import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; @AllArgsConstructor public class ProcessUserDO { + /** + * 组织 ID + */ + private Long organId; /** * 工序 ID */ diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessGroupMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessGroupMapper.java index bafee8000..8f0ec8ef4 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessGroupMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessGroupMapper.java @@ -4,8 +4,10 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.system.controller.admin.process.vo.group.ProcessGroupPageReqVO; +import com.cf.imes.module.system.dal.dataobject.process.ProcessDO; import com.cf.imes.module.system.dal.dataobject.process.ProcessGroupDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 工序组表 process_group Mapper @@ -21,9 +23,11 @@ public interface ProcessGroupMapper extends BaseMapperX { .eqIfPresent(ProcessGroupDO::getIsDefault, reqVO.getIsDefault()) .eqIfPresent(ProcessGroupDO::getSort, reqVO.getSort()) .eqIfPresent(ProcessGroupDO::getItems, reqVO.getItems()) + .eqIfPresent(ProcessGroupDO::getOrganId, reqVO.getOrganId()) .eqIfPresent(ProcessGroupDO::getDescription, reqVO.getDescription()) .betweenIfPresent(ProcessGroupDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(ProcessGroupDO::getId)); } + ProcessDO selectOneById(@Param("id") Long id, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java index 225b907a7..fa24348fb 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java @@ -30,6 +30,7 @@ public interface ProcessMapper extends BaseMapperX { .eqIfPresent(ProcessDO::getSort, reqVO.getSort()) .eqIfPresent(ProcessDO::getHourCapacity, reqVO.getHourCapacity()) .eqIfPresent(ProcessDO::getUnit, reqVO.getUnit()) + .eqIfPresent(ProcessDO::getOrganId, reqVO.getOrganId()) .eqIfPresent(ProcessDO::getIsEnabled, reqVO.getIsEnabled()) .betweenIfPresent(ProcessDO::getPrepareTime, reqVO.getPrepareTime()) .eqIfPresent(ProcessDO::getDescription, reqVO.getDescription()) @@ -39,6 +40,8 @@ public interface ProcessMapper extends BaseMapperX { IPage selectProcessPage(@Param("page") IPage page , @Param("page") ProcessPageReqVO reqVO); + ProcessDO selectOneById(@Param("id") Long id, @Param("organId") Long organId); + default List selectAll() { return selectList(new LambdaQueryWrapperX() .orderByDesc(ProcessDO::getId)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessUserMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessUserMapper.java index 7e073667c..6e39edb60 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessUserMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessUserMapper.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.system.dal.dataobject.process.ProcessDO; import com.cf.imes.module.system.dal.dataobject.process.ProcessUserDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,8 +20,15 @@ import java.util.List; @Mapper public interface ProcessUserMapper extends BaseMapperX { + default List selectByProcessId(Long processId,Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(ProcessUserDO::getProcessId, processId) + .eq(ProcessUserDO::getOrganId, organId)); + } + default List selectByProcessId(Long processId) { - return selectList(ProcessUserDO::getProcessId, processId); + return selectList(new LambdaQueryWrapperX() + .eq(ProcessUserDO::getProcessId, processId)); } default ProcessUserDO selectUserByProcessId(Long processId) { @@ -27,4 +36,6 @@ public interface ProcessUserMapper extends BaseMapperX { } int deleteUserByProcessId(@Param("processId") Long processId); + + ProcessDO selectOneById(@Param("processId") Long processId, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessGroupServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessGroupServiceImpl.java index aa2cd0edd..447081cf4 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessGroupServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessGroupServiceImpl.java @@ -1,5 +1,6 @@ package com.cf.imes.module.system.service.process; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.system.controller.admin.process.vo.group.ProcessGroupPageReqVO; import com.cf.imes.module.system.controller.admin.process.vo.group.ProcessGroupSaveReqVO; import com.cf.imes.module.system.controller.admin.process.vo.group.ProcessListSaveReqVO; @@ -80,20 +81,18 @@ public class ProcessGroupServiceImpl implements ProcessGroupService { @Override public ProcessListSaveReqVO getProcessGroup(Long id) { - if (processGroupMapper.selectById(id) == null) { - throw exception(PROCESS_GROUP_NOT_EXISTS); - } else { - ProcessGroupDO processGroup = processGroupMapper.selectById(id); - ProcessListSaveReqVO processListSaveReqVO = BeanUtils.toBean(processGroup, ProcessListSaveReqVO.class); - String[] items = processGroup.getItems().split(","); - List lists = new ArrayList<>(); - for (int i = 0; i < items.length; i++) { - if (processMapper.selectById(items[i]) != null) - lists.add(BeanUtils.toBean(processMapper.selectById(items[i]), ProcessRespVO.class)); - } - processListSaveReqVO.setLists(lists); - return processListSaveReqVO; + // 校验存在 + validateProcessGroupExists(id); + ProcessGroupDO processGroup = processGroupMapper.selectById(id); + ProcessListSaveReqVO processListSaveReqVO = BeanUtils.toBean(processGroup, ProcessListSaveReqVO.class); + String[] items = processGroup.getItems().split(","); + List lists = new ArrayList<>(); + for (int i = 0; i < items.length; i++) { + if (processMapper.selectById(Long.valueOf(items[i])) != null) + lists.add(BeanUtils.toBean(processMapper.selectById(items[i]), ProcessRespVO.class)); } + processListSaveReqVO.setLists(lists); + return processListSaveReqVO; } @@ -124,7 +123,7 @@ public class ProcessGroupServiceImpl implements ProcessGroupService { itemsList.forEach(itemId -> { try { - Object item = processMapper.selectById(itemId); + Object item = processMapper.selectById(Long.valueOf(itemId)); if (item != null) { // 优化字符串拼接 itemsBuilder.append(itemId).append(","); @@ -136,10 +135,7 @@ public class ProcessGroupServiceImpl implements ProcessGroupService { missingItemsBuilder.append(itemId); } } catch (Exception e) { - // 处理可能的异常,例如数据库查询异常 - // 可以记录日志或者转换为业务异常等 - // 此处为简化仅打印异常,实际应用中应更详细处理 - System.err.println("Error processing item: " + e.getMessage()); + throw exception(PROCESS_ID_IS_NULL); } }); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java index af58e3140..97117a5a5 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java @@ -59,10 +59,12 @@ public interface ProcessService { * @return 工序信息表 process分页 */ PageResult getProcessPageAll(ProcessPageReqVO pageReqVO); + /** * 获得所有工序信息表 process * * @return 工序信息表 process */ List getAllProcess(); + } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java index 7fa8fb700..ed25c10ea 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java @@ -1,13 +1,13 @@ package com.cf.imes.module.system.service.process; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; -import com.cf.imes.framework.common.util.pinyin.PinYinUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.system.controller.admin.process.vo.process.*; import com.cf.imes.module.system.controller.admin.process.vo.processUser.ProcessAndUserSaveReqVO; import com.cf.imes.module.system.dal.dataobject.process.ProcessUserDO; -import com.cf.imes.module.system.dal.mysql.process.ProcessUserMapper; +import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.cf.imes.module.system.service.user.AdminUserService; import org.springframework.stereotype.Service; @@ -22,7 +22,6 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.system.dal.mysql.process.ProcessMapper; -import java.util.Arrays; import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -51,6 +50,8 @@ public class ProcessServiceImpl implements ProcessService { @Override @Transactional(rollbackFor = Exception.class) public Long createProcess(ProcessUserSaveReqVO createReqVO) { + // 用户组织Id +// Long organId = OrganContextHolder.getOrganId(); // 插入 ProcessDO process = BeanUtils.toBean(createReqVO, ProcessDO.class); processMapper.insert(process); @@ -59,11 +60,18 @@ public class ProcessServiceImpl implements ProcessService { String[] usersId = createReqVO.getUsers().split(","); for (String user : usersId) { ProcessAndUserSaveReqVO processAndUserSaveReqVO = new ProcessAndUserSaveReqVO(); -// if (adminUserService.getUser(Long.parseLong(user)) != null){ - processAndUserSaveReqVO.setProcessId(processID); - processAndUserSaveReqVO.setUserId(Long.parseLong(user)); - processUserService.createProcessUser(processAndUserSaveReqVO); -// } + try{ + if (adminUserService.getUser(Long.parseLong(user)) == null){ + throw ServiceExceptionUtil.exception(ErrorCodeConstants.USER_NOT_EXISTS); + } + + processAndUserSaveReqVO.setProcessId(processID); + processAndUserSaveReqVO.setUserId(Long.parseLong(user)); + processUserService.createProcessUser(processAndUserSaveReqVO); + }catch (Exception e){ + throw ServiceExceptionUtil.exception(ErrorCodeConstants.USER_NOT_EXISTS); + } + } } // 返回 @@ -138,7 +146,7 @@ public class ProcessServiceImpl implements ProcessService { } @Override - public PageResult getProcessPage(ProcessPageReqVO pageReqVO) { + public PageResult getProcessPage(ProcessPageReqVO pageReqVO) {//分页加用户 return processMapper.selectPage(pageReqVO); } @@ -155,4 +163,5 @@ public class ProcessServiceImpl implements ProcessService { return processDOList; } + } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessUserServiceImpl.java index c4b438966..b3033e608 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessUserServiceImpl.java @@ -1,5 +1,6 @@ package com.cf.imes.module.system.service.process; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.system.controller.admin.process.vo.processUser.ProcessAndUserSaveReqVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -29,6 +30,9 @@ public class ProcessUserServiceImpl implements ProcessUserService { @Override public Long createProcessUser(ProcessAndUserSaveReqVO createReqVO) { + if (processUserMapper.selectByProcessId(createReqVO.getProcessId()).size() != 0) { + throw exception(PROCESS_USER_NOT_EXISTS); + } // 插入 ProcessUserDO processUser = BeanUtils.toBean(createReqVO, ProcessUserDO.class); processUserMapper.insert(processUser); @@ -48,7 +52,7 @@ public class ProcessUserServiceImpl implements ProcessUserService { @Override public void deleteProcessUserByProcess(Long processId) { // 校验存在 - validateProcessUserExists(processId); +// validateProcessUserExists(processId); // 删除 processUserMapper.deleteUserByProcessId(processId); } diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessGroupMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessGroupMapper.xml new file mode 100644 index 000000000..02f561e6f --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessGroupMapper.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml index a71e81ef0..51c851e29 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml @@ -24,7 +24,7 @@ p.deleted from process p - + p.deleted = 0 and p.id in (select process_id from process_user where user_id = #{page.userId}) @@ -42,4 +42,29 @@ + + \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessUserMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessUserMapper.xml index 87a5e8010..6a0ef5742 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessUserMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessUserMapper.xml @@ -2,15 +2,17 @@ - DELETE FROM process_user WHERE process_id = #{processId}; +