From 5116e6d74a1b191a9f12320a05f9bc7d08e85add Mon Sep 17 00:00:00 2001 From: lym <1994302445@qq.com> Date: Thu, 18 Jul 2024 15:45:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=AF=BC=E5=85=A5=E6=96=B0?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/order/OrderController.java | 181 +++++++++++++----- .../admin/order/vo/order/OrderRespVO.java | 2 +- .../order/vo/order/OrderStatusRespVO.java | 5 + .../executor/dal/mysql/order/OrderMapper.java | 2 +- .../dal/mysql/plate/PlateGoodMapper.java | 19 +- .../executor/dal/mysql/plate/PlateMapper.java | 6 +- .../service/order/OrderInputProcessor.java | 8 +- .../executor/service/order/OrderService.java | 24 +-- .../service/order/OrderServiceImpl.java | 140 +++++++------- .../admin/files/excel/ExcelReadUtil.java | 68 +++++-- .../admin/files/excel/ExcelTypeRealize.java | 25 ++- .../files/excel/OrderPlateImportExcelVO.java | 8 +- .../resources/mapper/order/OrderMapper.xml | 7 +- .../resources/mapper/plate/PlateMapper.xml | 48 ++++- .../main/resources/type/order_add_excel.xlsx | Bin 28999 -> 28949 bytes .../resources/type/order_add_excel_err.xlsx | Bin 25024 -> 25038 bytes 16 files changed, 353 insertions(+), 190 deletions(-) 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 38b2e0dd0..a9a5cc09f 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 @@ -153,6 +153,7 @@ public class OrderController { List orderBodyMap = orderService.getOrderBody(orderId); return success(orderBodyMap); } + @GetMapping("/get-roomToString") @Operation(summary = "生产单详情-房间和柜体id(toString)") @Parameter(name = "orderId", description = "生产单编号", required = true, example = "1024") @@ -199,6 +200,7 @@ public class OrderController { List moduleDOList = orderService.getPlatesDetail(orderId, roomId, bodyId, groupId, groupName); return success(moduleDOList); } + @GetMapping("/get-platesDetailsPage") @Operation(summary = "生产单详情-板材详细信息(分页)") @Parameters({ @@ -209,19 +211,19 @@ public class OrderController { @Parameter(name = "groupName", description = "加工组名称", example = "弧形"), @Parameter(name = "pageNo", description = "第几页", example = "1"), @Parameter(name = "pageSize", description = "条数", example = "10") - }) @PreAuthorize("@ss.hasPermission('production:manager-list:detail')") public CommonResult> platesDetails(@RequestParam("orderId") Long orderId, - @RequestParam(value = "roomId", required = false) Long roomId, - @RequestParam(value = "bodyId", required = false) Long bodyId, - @RequestParam(value = "groupId", required = false) Long groupId, - @RequestParam(value = "groupName", required = false) String groupName, - @RequestParam(value = "pageNo") Integer pageNo, - @RequestParam(value = "pageSize") Integer pageSize) { + @RequestParam(value = "roomId", required = false) Long roomId, + @RequestParam(value = "bodyId", required = false) Long bodyId, + @RequestParam(value = "groupId", required = false) Long groupId, + @RequestParam(value = "groupName", required = false) String groupName, + @RequestParam(value = "pageNo") Integer pageNo, + @RequestParam(value = "pageSize") Integer pageSize) { PageResult moduleDOList = orderService.getPlatesDetail(orderId, roomId, bodyId, groupId, groupName, pageNo, pageSize); return success(moduleDOList); } + @GetMapping("/get-partsDetails") @Operation(summary = "生产单详情-配件详细信息") @Parameters({ @@ -238,6 +240,7 @@ public class OrderController { List moduleDOList = orderService.getPartsDetail(orderId, roomId, bodyId, name); return success(moduleDOList); } + @GetMapping("/get-partsDetailsPage") @Operation(summary = "生产单详情-配件详细信息(分页)") @Parameters({ @@ -250,14 +253,15 @@ public class OrderController { }) @PreAuthorize("@ss.hasPermission('production:manager-list:detail')") public CommonResult> partsDetails(@RequestParam("orderId") Long orderId, - @RequestParam(value = "roomId", required = false) Long roomId, - @RequestParam(value = "bodyId", required = false) Long bodyId, - @RequestParam(value = "name", required = false) String name, - @RequestParam(value = "pageNo") Integer pageNo, - @RequestParam(value = "pageSize") Integer pageSize) { + @RequestParam(value = "roomId", required = false) Long roomId, + @RequestParam(value = "bodyId", required = false) Long bodyId, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "pageNo") Integer pageNo, + @RequestParam(value = "pageSize") Integer pageSize) { PageResult moduleDOList = orderService.getPartsDetail(orderId, roomId, bodyId, name, pageNo, pageSize); return success(moduleDOList); } + // 柜体数据获取,需要加上柜体的属性 @GetMapping("/get-body") @Operation(summary = "生产单柜体数据获取") @@ -319,7 +323,6 @@ public class OrderController { // 读取文件 excelReadUtil.setErr(0); Map map = excelReadUtil.read(file); -// System.out.println(" map " + map); System.err.println(excelReadUtil.isErr()); // 判断是否读取有误 if (excelReadUtil.isErr() == -1) { // 文件为空 @@ -352,7 +355,70 @@ public class OrderController { } else if (type == 2) { // xml } - orderService.importExcelData(orderDO, list); + orderService.importExcelData(orderDO, list, 0); + } catch (Exception e) { + ExcelWriterUtil.writeErr(response, "系统出现未知错误,请下载模板,按照模板重新上传文件", orderService.getSavePath() + File.separator + "order_err.xlsx"); + } + } + + @PostMapping("/importFileAdd") + @Operation(summary = "生产单文件导入新增/导入板材") + @Parameters({ + @Parameter(name = "file", description = "文件", required = true), + @Parameter(name = "type", description = "文件类型", required = true), + @Parameter(name = "index", description = "导入范围 0:全部,1:板材,默认为全部", required = false), + @Parameter(name = "id", description = "生产单id", required = false) + }) + @OperateLog(type = IMPORT) + @PreAuthorize("@ss.hasPermission('production:manager-list:create')") + public void exportTestTwo(@RequestPart("file") MultipartFile file, + @RequestParam(value = "type") Integer type, + @RequestParam(value = "index", required = false, defaultValue = "0") Integer index, + @RequestParam(value = "id", required = false, defaultValue = "0") Long orderId, + HttpServletResponse response) throws IOException { + try { + List list = null; + OrderDO orderDO = new OrderDO(); + + if (type == 0) { //excel +// 读取文件 + excelReadUtil.setErr(0); + Map map = excelReadUtil.read(file); + System.out.println(" map + " + map); +// 判断是否读取有误 + if (excelReadUtil.isErr() > 0) { +// 板材数据格式错误 + ExcelWriterUtil.write(response, (Map) map.get("order"), (List) map.get("plate"), + orderService.getSavePath() + File.separator + "order_add_excel_err.xlsx"); + return; + }else { + list = (List) map.get("plate"); + + if (index == null || index == 0) { // 全部导入 + Map mapOrder = excelReadUtil.changeOrderDO((Map) map.get("order")); + + if (list.size() == 0) { + orderDO.setStatus(0); + } + orderDO = ((OrderDO) mapOrder.get("order")).setOrderType(OrderTypeEnum.MAIN_ORDER.getStatus()); + String err = ((String) mapOrder.get("error")); + + if (!orderService.customOrderNoIsExists(orderDO.getCustomOrderNo())) { + err += orderDO.getCustomOrderNo() + "-自定义生产单号已存在;"; + } + if (!err.equals("")) { + ExcelWriterUtil.writeErr(response, err, orderService.getSavePath() + File.separator + "order_err.xlsx"); + } + }else { // 板材导入 + orderDO.setId(orderId); + } + } + } else if (type == 1) { // json + + } else if (type == 2) { // xml + + } + orderService.importExcelData(orderDO, list, index); } catch (Exception e) { ExcelWriterUtil.writeErr(response, "系统出现未知错误,请下载模板,按照模板重新上传文件", orderService.getSavePath() + File.separator + "order_err.xlsx"); } @@ -392,7 +458,7 @@ public class OrderController { return success(orderService.getPrintDataMap(orderId, type, response)); } -// 获取api订单接口 + // 获取api订单接口 @GetMapping("/getApiOrder") @Operation(summary = "获取api订单接口") @Parameters({ @@ -411,38 +477,21 @@ public class OrderController { JSONObject oauth = apiDataAchieve.getApiToken(organId).get(); String token = oauth.getJSONObject("info").getString("access_token"); String shopId = oauth.getJSONObject("info").getString("shop_id"); - JSONObject orderList = apiDataAchieve.getApiOrderList(token,shopId,startTime,endTime,orderNo,customOrderNo).get(); + JSONObject orderList = apiDataAchieve.getApiOrderList(token, shopId, startTime, endTime, orderNo, customOrderNo).get(); return success(orderService.getApiOrderList(orderList)); } -// 统计 -// 生产单状态分组统计返回 - @GetMapping("/getOrderStatusCount") - @Operation(summary = "生产单状态分组统计返回") - @Parameter(name = "startTerm", description = "按周,按月,按年", required = false, example = "1,2,3") - @PreAuthorize("@ss.hasPermission('productManager:List')") - public CommonResult> getOrderStatusCount(@RequestParam(value = "startTerm", required = false) Integer startTerm) { - return success(orderService.getOrderStatusCount(startTerm)); - } - -// 小板数据分析 - @GetMapping("/getOrderPlateAnalysisCount") - @Operation(summary = "小板数据分析统计(小板数量、小班面积)") - @PreAuthorize("@ss.hasPermission('productManager:List')") - public CommonResult> getOrderPlateAnalysisCount() { - return success(orderService.getOrderPlateAnalysisCount()); - } - + // 统计 // 生产单超期/到期告警 (工作台) @GetMapping("/getOrderWarn") - @Operation(summary = "生产单警告") + @Operation(summary = "生产单超期/到期告警 (工作台)") @PreAuthorize("@ss.hasPermission('productManager:List')") - public CommonResult>> getOrderOverdue() { + public CommonResult>> getOrderOverdue() { return success(orderService.getOrderWarn()); } -// 生产单总数 + // 生产单总数 @GetMapping("/orderCount") @Operation(summary = "生产单总数") @PreAuthorize("@ss.hasPermission('productManager:List')") @@ -450,7 +499,7 @@ public class OrderController { return success(orderService.orderCount()); } -// 今日新增生产单总数 + // 今日新增生产单总数 @GetMapping("/orderCountToday") @Operation(summary = "今日新增生产单总数") @PreAuthorize("@ss.hasPermission('productManager:List')") @@ -458,7 +507,7 @@ public class OrderController { return success(orderService.orderCountToday()); } -// 今日生产单完成总数 + // 今日生产单完成总数 @GetMapping("/orderCountTodayFinish") @Operation(summary = "今日生产单完成总数") @PreAuthorize("@ss.hasPermission('productManager:List')") @@ -466,7 +515,7 @@ public class OrderController { return success(orderService.orderCountTodayFinish()); } -// 生产中生产单总数 + // 生产中生产单总数 @GetMapping("/orderCountProduce") @Operation(summary = "生产中生产单总数") @PreAuthorize("@ss.hasPermission('productManager:List')") @@ -474,7 +523,7 @@ public class OrderController { return success(orderService.orderCountProduce()); } -// 生产中生产平方数 + // 生产中生产平方数 @GetMapping("/orderSquareProduce") @Operation(summary = "生产中生产平方数") @PreAuthorize("@ss.hasPermission('productManager:List')") @@ -482,20 +531,50 @@ public class OrderController { return success(orderService.orderSquareProduce()); } -// 小板数量 + // 生产单状态分组统计返回 + @GetMapping("/getOrderStatusCount") + @Operation(summary = "生产单状态分组统计返回") + @Parameters({ + @Parameter(name = "startTime", description = "开始时间", example = "2024-07-15"), + @Parameter(name = "endTime", description = "结束时间", example = "2024-07-16") + }) + @PreAuthorize("@ss.hasPermission('productManager:List')") + public CommonResult> getOrderStatusCount(@RequestParam(value = "startTime") String startTime, + @RequestParam(value = "endTime") String endTime) { + return success(orderService.getOrderStatusCount(startTime + " 00:00:00", endTime + " 23:59:59")); + } + + // 小板数量 <集合> @GetMapping("/getPlateCount") @Operation(summary = "小板数量") @Parameters({ - @Parameter(name = "startTime", description = "开始时间", required = false), - @Parameter(name = "endTime", description = "结束时间", required = false), - @Parameter(name = "goodsId", description = "材料id", required = true), - @Parameter(name = "organId", description = "组织id", required = false, example = "1") + @Parameter(name = "startTime", description = "开始时间", example = "2024-07-15"), + @Parameter(name = "endTime", description = "结束时间", example = "2024-07-16"), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "pageSize", description = "每页条数", example = "10") }) @PreAuthorize("@ss.hasPermission('productManager:List')") - public CommonResult getPlateCount(@RequestParam(value = "startTime", required = false) String startTime, - @RequestParam(value = "endTime", required = false) String endTime, - @RequestParam(value = "goodsId", required = false) Set goodsId, - @RequestParam("orderId") Long organId) { - return success(orderService.plateCount()); + public CommonResult> getPlateCount(@RequestParam(value = "startTime") String startTime, + @RequestParam(value = "endTime") String endTime, + @RequestParam(value = "pageNo") Integer pageNo, + @RequestParam(value = "pageSize") Integer pageSize) { + return success(orderService.plateCount(startTime + " 00:00:00", endTime + " 23:59:59", pageNo, pageSize)); + } + + // 小板面积 <集合> + @GetMapping("/getPlateArea") + @Operation(summary = "小板数量") + @Parameters({ + @Parameter(name = "startTime", description = "开始时间", example = "2024-07-15"), + @Parameter(name = "endTime", description = "结束时间", example = "2024-07-16"), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "pageSize", description = "每页条数", example = "10") + }) + @PreAuthorize("@ss.hasPermission('productManager:List')") + public CommonResult> getPlateArea(@RequestParam(value = "startTime") String startTime, + @RequestParam(value = "endTime") String endTime, + @RequestParam(value = "pageNo") Integer pageNo, + @RequestParam(value = "pageSize") Integer pageSize) { + return success(orderService.plateArea(startTime + " 00:00:00", endTime + " 23:59:59", pageNo, pageSize)); } } \ 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/controller/admin/order/vo/order/OrderRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderRespVO.java index e4209cf2a..efe243af2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderRespVO.java @@ -24,7 +24,7 @@ public class OrderRespVO { private String apiOrderId; @Schema(description = "生产单日期", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("交付日期") + @ExcelProperty("生产单日期") private LocalDateTime orderDate; @Schema(description = "交付日期", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java index 5ba521ca6..547dc76ca 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderStatusRespVO.java @@ -3,6 +3,8 @@ package com.cf.imes.module.executor.controller.admin.order.vo.order; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import java.time.LocalDateTime; + @Schema(description = "管理后台 - 生产单状态统计") @Data @Builder @@ -15,4 +17,7 @@ public class OrderStatusRespVO { @Schema(description = "订单数量") private Integer orderCount; + + @Schema(description = "生产单时间") + private LocalDateTime orderDate; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index b9f63f201..55cb6bac2 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -140,7 +140,7 @@ public interface OrderMapper extends BaseMapperX { List selectOrderIds(@Param(Constants.WRAPPER) Wrapper wrapper); // 生产单状态统计 - List selectOrderStatusCount(@Param("organId")Long organId, @Param("orderDate") LocalDateTime orderDate); + List selectOrderStatusCount(@Param("organId")Long organId, @Param("startTime")String startTime, @Param("endTime")String endTime); // 生产单预警统计 List selectOrderNear(@Param("today") LocalDateTime today, @Param("orderDate") LocalDateTime orderDate, @Param("organId") Long organId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java index 9bd13eba0..f2aa7261b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java @@ -7,6 +7,7 @@ import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; +import java.util.List; /** * 板材信息 Mapper plate @@ -25,9 +26,9 @@ public interface PlateGoodMapper extends BaseMapperX { } // 其他信息匹配 - default PlateGoodDO selectGood(String goodsName, String material, String color, Boolean texture, BigDecimal width, - BigDecimal thickness, BigDecimal height, String brand, String spec, Long organId) { - return selectOne(new LambdaQueryWrapper() + default List selectGood(String goodsName, String material, String color, Boolean texture, BigDecimal width, + BigDecimal thickness, BigDecimal height, String brand, String spec, Long organId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(PlateGoodDO::getGoodsName, goodsName) .eq(PlateGoodDO::getMaterial, material) .eq(PlateGoodDO::getColor, color) @@ -35,9 +36,15 @@ public interface PlateGoodMapper extends BaseMapperX { .eq(PlateGoodDO::getWidth, width) .eq(PlateGoodDO::getHeight, height) .eq(PlateGoodDO::getThickness, thickness) - .eq(PlateGoodDO::getBrand, brand) .eq(PlateGoodDO::getSpec, spec) .eq(PlateGoodDO::getDeleted, 0) - .eq(PlateGoodDO::getOrganId, organId)); - } + .eq(PlateGoodDO::getOrganId, organId); + if (brand == null) { + queryWrapper.eq(PlateGoodDO::getBrand,""); + }else { + queryWrapper.eq(PlateGoodDO::getBrand, brand); + } + return selectList(queryWrapper); + } + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index ce3d5f5f9..1a7b251e6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -137,5 +137,9 @@ public interface PlateMapper extends BaseMapperX { List selectGoodsNum(@Param("orderIds") List orderIds,@Param("organId") Long organId); // 小板数据分析 - List selectPlateAnalysisList(@Param("organId") Long organId, @Param("orderDate") LocalDateTime orderDate); +// List selectPlateAnalysisListByCount(@Param("organId") Long organId, @Param("startTime") String startTime, @Param("endTime") String endTime); // 数量 + IPage selectPlateAnalysisListByCount(@Param("page") IPage page, @Param("organId") Long organId, @Param("startTime") String startTime, @Param("endTime") String endTime); // 数量 +// List selectPlateAnalysisListByArea(@Param("organId") Long organId, @Param("startTime") String startTime, @Param("endTime") String endTime); // 面积 + IPage selectPlateAnalysisListByArea(@Param("page") IPage page, @Param("organId") Long organId, @Param("startTime") String startTime, @Param("endTime") String endTime); // 面积 + } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/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 a57187a2b..02589ae4b 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 @@ -96,13 +96,12 @@ public class OrderInputProcessor { * @param itemDOS */ @Transactional(rollbackFor = Exception.class) - public Long batchInsert(Collection rawGoodsDOS, Collection orderBodyDOS, + public void batchInsert(Collection rawGoodsDOS, Collection orderBodyDOS, Collection orderGroupDOS, Collection orderPartsDOS, Collection plateDOS, Collection orderModuleExtraDOS, - Collection itemDOS, OrderDO orderDO, + Collection itemDOS, Collection goodsDOS, Collection plateGoodDOS) { - if (orderDO != null) - orderMapper.insert(orderDO); + if (rawGoodsDOS != null) for (int i = 0; i < rawGoodsDOS.size(); i += 1000) { @@ -151,7 +150,6 @@ public class OrderInputProcessor { //plateMapper.insertBatch(plateDOS); //orderModuleExtraMapper.insertBatch(orderModuleExtraDOS); //orderItemMapper.insertBatch(itemDOS); - return orderDO.getId(); } /** diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java index 510a9d248..9c1c41e30 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderService.java @@ -77,6 +77,7 @@ public interface OrderService { * @return List */ List getOrderBody(Long orderId); + String getOrderBodyToString(Long orderId); List getRoomAndBody(Long planId); @@ -140,7 +141,7 @@ public interface OrderService { /** * 文件数据导入 */ - void importExcelData(OrderDO orderDO, List list); + void importExcelData(OrderDO orderDO, List list, Integer index); /** * 模板文件导入保存 @@ -177,25 +178,13 @@ public interface OrderService { /** * 生产单状态统计 */ - List getOrderStatusCount(Integer startTerm); - - /** - * 小板数据分析统计 - */ - List getOrderPlateAnalysisCount(); + List getOrderStatusCount(String startTime, String endTime); /** * 生产单超期告警分析统计 */ Map> getOrderWarn(); - /** - * 今日要完成生产单数 - */ - List getOrderOverdue(); - - String getOrderBodyToString(Long orderId); - /** * 生产单总数统计 */ @@ -224,5 +213,10 @@ public interface OrderService { /** * 小板数量 */ - Integer plateCount(); + PageResult plateCount(String startTime, String endTime, Integer pageNo, Integer pageSize); + + /** + * 小板面积 + */ + PageResult plateArea(String startTime, String endTime, Integer pageNo, Integer pageSize); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/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 4db2513ef..d58de7e6e 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 @@ -280,7 +280,6 @@ public class OrderServiceImpl implements OrderService { // 判断生产单是否删除 Integer deleted = getOrderDeleted(orderId); - List orderBodyRespVOList = BeanUtils.toBean( orderBodyMapper.selectList(orderId, deleted, SecurityFrameworkUtils.getLoginUser().getOrganId()), OrderBodyRespVO.class); return orderBodyRespVOList; @@ -354,8 +353,35 @@ public class OrderServiceImpl implements OrderService { } @Override - public Integer plateCount() { - return null; + public PageResult plateCount(String startTime, String endTime, Integer pageNo, Integer pageSize) { +// 角色判断 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); +// 数据查询 + PageDTO page = new PageDTO<>(pageNo, pageSize); + IPage orderDetail; + if (loginUser.getIsSupAdmin()){ + orderDetail = plateMapper.selectPlateAnalysisListByCount(page,null, startTime, endTime); + }else { + orderDetail = plateMapper.selectPlateAnalysisListByCount(page,OrganContextHolder.getOrganId(), startTime, endTime); + } + PageResult pageResult = new PageResult(orderDetail.getRecords(), orderDetail.getTotal()); + return pageResult; + } + + @Override + public PageResult plateArea(String startTime, String endTime, Integer pageNo, Integer pageSize) { +// 角色判断 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); +// 数据查询 + PageDTO page = new PageDTO<>(pageNo, pageSize); + IPage orderDetail; + if (loginUser.getIsSupAdmin()){ + orderDetail = plateMapper.selectPlateAnalysisListByArea(page,null, startTime, endTime); + }else { + orderDetail = plateMapper.selectPlateAnalysisListByArea(page,OrganContextHolder.getOrganId(), startTime, endTime); + } + PageResult pageResult = new PageResult(orderDetail.getRecords(), orderDetail.getTotal()); + return pageResult; } @Override @@ -519,7 +545,10 @@ public class OrderServiceImpl implements OrderService { String nickName = SecurityFrameworkUtils.getLoginUser().getNickname(); OrderDO orderDO = order.get(0).setSalesman(nickName).setSplitter(nickName); - orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, orderDO, goodsDO, plateGoodDOS); + if (orderDO != null){ + orderMapper.insert(orderDO); + } + orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, goodsDO, plateGoodDOS); List orderModelDOs = BeanUtils.toBean(plateDetail, OrderModelDO.class); if (orderModelDOs.size() > 0) { @@ -546,18 +575,21 @@ public class OrderServiceImpl implements OrderService { List plateGoodLists = new ArrayList<>(); for (GoodsDO goodsDO : goodsLists) { - PlateGoodDO plateGoodDO; + PlateGoodDO plateGoodDO = null; + List plateGoodDOS = null; if (goodsDO.getGoodsId() != null) { // 有goodsId plateGoodDO = plateGoodMapper.selectGoodOne(goodsDO.getGoodsId(), SecurityFrameworkUtils.getLoginUser().getOrganId()); } else { // 没有goodsId 其他信息匹配 - plateGoodDO = plateGoodMapper.selectGood(goodsDO.getGoodsName(), goodsDO.getMaterial(), goodsDO.getColor(), - goodsDO.getTexture(), goodsDO.getWidth(), goodsDO.getWidth(), goodsDO.getHeight(), goodsDO.getSpec(), - goodsDO.getBrand(), SecurityFrameworkUtils.getLoginUser().getOrganId()); + plateGoodDOS = plateGoodMapper.selectGood(goodsDO.getGoodsName(), goodsDO.getMaterial(), goodsDO.getColor(), + goodsDO.getTexture(), goodsDO.getWidth(), goodsDO.getThickness(), goodsDO.getHeight(), goodsDO.getBrand(), + goodsDO.getSpec(), SecurityFrameworkUtils.getLoginUser().getOrganId()); } - if (plateGoodDO != null) {//存在板材 - goodsDO.setGoodsId(plateGoodDO.getGoodsId()); + if (plateGoodDOS.size() > 0) {//存在板材 + goodsDO.setGoodsId(plateGoodDOS.get(0).getGoodsId()); break; + } else if (plateGoodDO != null) { // 存在板材 + goodsDO.setGoodsId(plateGoodDO.getGoodsId()); } else { // 不存在板材 Long plateGoods = (Long) identifierGenerator.nextId(null); Long goodsId = (Long) identifierGenerator.nextId(null); @@ -576,7 +608,6 @@ public class OrderServiceImpl implements OrderService { } map.put("goodsDO", goodsLists); map.put("plateGoodDOLists", plateGoodLists); -// System.err.println(" map " + map); return map; } @@ -673,39 +704,12 @@ public class OrderServiceImpl implements OrderService { } @Override - public List getOrderStatusCount(Integer startTerm) { -// 根据开始条件选择 - LocalDateTime orderDate = null; - - if (startTerm != null){ - switch (startTerm) { - case 2: // 月 - orderDate = LocalDate.now().withDayOfMonth(1).atStartOfDay(); - break; - case 3: // 年 - orderDate = LocalDate.now().withMonth(1).withDayOfMonth(1).atStartOfDay(); - break; - default: // 周 - orderDate = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay(); - break; - - } - }else { - orderDate = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay(); - } - - List orderStatusRespVOS = orderMapper.selectOrderStatusCount(OrganContextHolder.getOrganId(), orderDate); + public List getOrderStatusCount(String startTime, String endTime) { + List orderStatusRespVOS = orderMapper.selectOrderStatusCount(OrganContextHolder.getOrganId(), startTime, endTime); orderStatusRespVOS.removeIf(obj -> obj.getOrderState() == OrderStatusEnum.EMPTY.getStatus()); return orderStatusRespVOS; } - @Override - public List getOrderPlateAnalysisCount() { - LocalDateTime orderDate = LocalDate.now().withDayOfMonth(1).atStartOfDay(); - List orderGoodsPlateRespVOS = plateMapper.selectPlateAnalysisList(OrganContextHolder.getOrganId(), orderDate); - return orderGoodsPlateRespVOS; - } - @Override public Map> getOrderWarn() { Map> map = new HashMap<>(); @@ -724,11 +728,6 @@ public class OrderServiceImpl implements OrderService { return map; } - @Override - public List getOrderOverdue() { - return null; - } - // 判断是否已经导入 private Boolean validateOrderNoExists(String orderNo, Long organId) { if (orderMapper.selectCount(new LambdaQueryWrapper() @@ -782,34 +781,39 @@ public class OrderServiceImpl implements OrderService { } @Override - public void importExcelData(OrderDO orderDO, List list) { - orderDO.setId((Long) snowFlakeGenerator.nextId(null)); + @Transactional(rollbackFor = Exception.class) + public void importExcelData(OrderDO orderDO, List list, Integer index) { + if (index == 0){ + orderDO.setId((Long) snowFlakeGenerator.nextId(null)); + orderMapper.insert(orderDO); + } - Map> listMap = excelTypeRealize.changeDate(list, orderDO.getId()); - List rawGoodsDO = (List) listMap.get("rawGoodsDOS"); - List goodsDO = (List) listMap.get("goodsDOS"); + if (list.size() > 0) { + Map> listMap = excelTypeRealize.changeDate(list, orderDO.getId()); + List rawGoodsDO = (List) listMap.get("rawGoodsDOS"); + List goodsDO = (List) listMap.get("goodsDOS"); // List plateGoodDOS = (List) listMap.get("plateGoodDOS"); - List bodyDO = (List) listMap.get("orderBodyDOS"); - List groupDO = (List) listMap.get("orderGroupDOS"); - List plateDO = (List) listMap.get("plateDOS"); - List partsDO = (List) listMap.get("orderPartsDOS"); - List itemDO = (List) listMap.get("orderItemDOS"); - List orderModelDOS = (List) listMap.get("orderModelDOS"); - List orderPartsRemarks = (List) listMap.get("orderPartsRemarks"); - // 板材库匹配 - Map> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在 - goodsDO = (List) map.get("goodsDO"); - List plateGoodDOS = (List) map.get("plateGoodDOLists"); + List bodyDO = (List) listMap.get("orderBodyDOS"); + List groupDO = (List) listMap.get("orderGroupDOS"); + List plateDO = (List) listMap.get("plateDOS"); + List partsDO = (List) listMap.get("orderPartsDOS"); + List itemDO = (List) listMap.get("orderItemDOS"); + List orderModelDOS = (List) listMap.get("orderModelDOS"); + List orderPartsRemarks = (List) listMap.get("orderPartsRemarks"); + // 板材库匹配 + Map> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在 excel + goodsDO = (List) map.get("goodsDO"); + List plateGoodDOS = (List) map.get("plateGoodDOLists"); // validateCustomOrderNoExists(orderDO.getCustomOrderNo()); - orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, orderDO, goodsDO, plateGoodDOS); - if (orderModelDOS.size() > 0) { - orderInputProcessor.batchSaveModel(orderModelDOS); + orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, null, itemDO, goodsDO, plateGoodDOS); + if (orderModelDOS.size() > 0) { + orderInputProcessor.batchSaveModel(orderModelDOS); + } + if (orderPartsRemarks.size() > 0) { + orderInputProcessor.batchSaveOrderPartsModel(orderPartsRemarks); + } } - if (orderPartsRemarks.size() > 0) { - orderInputProcessor.batchSaveOrderPartsModel(orderPartsRemarks); - } - } @Override diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java index 78bdc1244..4cb918a25 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelReadUtil.java @@ -66,9 +66,9 @@ public class ExcelReadUtil { // 文件读取 } ); index.set(true); - if (MapUtil.isEmpty(orderMap) || CollectionUtil.isEmpty(list)) { - isErr.set(-1); - } +// if (MapUtil.isEmpty(orderMap) || CollectionUtil.isEmpty(list)) { +// isErr.set(-1); +// } map.put("order", orderMap); map.put("plate", list); return map; @@ -78,35 +78,56 @@ public class ExcelReadUtil { // 文件读取 // order 数据转换 public Map changeOrderDO(Map orderMap) { Map map = new HashMap<>(); - String s = (String) orderMap.get("出货日期"); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - // string 拼接 String error = ""; - // 电话校验 - if (!validatePhoneNumber((String) orderMap.get("客户电话"))) { - error += (String) orderMap.get("客户电话")+ "-客户电话格式错误;"; +// 判断是否为空 + if ( orderMap.get("客户") == null){ + error += "客户不能为空;"; } - if (!validatePhoneNumber((String) orderMap.get("经销商电话"))) { - error += (String) orderMap.get("经销商电话")+ "-经销商电话格式错误;"; + if (orderMap.get("经销商") == null){ + error += "经销商不能为空;"; + } + if (orderMap.get("客户地址") == null){ + error += "客户地址不能为空;"; + } + if (orderMap.get("出货日期") == null){ + error += "出货日期不能为空;"; + } + if (orderMap.get("客户电话") == null){ + error += "客户电话不能为空;"; + } else { + if (!validatePhoneNumber((String) orderMap.get("客户电话"))) { + error += orderMap.get("客户电话")+ "-客户电话格式错误;"; + } + } + if (orderMap.get("经销商电话") != null){ + if (!validatePhoneNumber((String) orderMap.get("经销商电话"))) { + error += orderMap.get("经销商电话")+ "-经销商电话格式错误;"; + } } OrderDO orderDO = OrderDO.builder() .organId(OrganContextHolder.getOrganId()) .dataType(0) - .customer((String) orderMap.get("客户")) + .customer((String) orderMap.get("客户")) // .customOrderNo((String) orderMap.get("自定义单号")) - .dealer((String) orderMap.get("经销商")) + .dealer((String) orderMap.get("经销商")) // .dealerPhoneNumber((String) orderMap.get("经销商电话")) - .address((String) orderMap.get("客户地址")) - .phoneNumber((String) orderMap.get("客户电话")) + .address((String) orderMap.get("客户地址")) // + .phoneNumber((String) orderMap.get("客户电话")) // .salesman((String) orderMap.get("业务员")) .splitter((String) orderMap.get("拆单员")) .remark((String) orderMap.get("备注")) .build(); - try { - LocalDate orderDate = LocalDate.parse(s, formatter); - orderDO.setDeliveryDate(orderDate.atStartOfDay()); - } catch (DateTimeParseException e) { - error += s + "-出货日期格式错误;"; + if (orderMap.get("出货日期") == null){ + error += "出货日期不能为空;"; + }else { + String s = (String) orderMap.get("出货日期"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + LocalDate orderDate = LocalDate.parse(s, formatter); + orderDO.setDeliveryDate(orderDate.atStartOfDay()); // + } catch (DateTimeParseException e) { + error += s + "-出货日期格式错误;"; + } } map.put("order", orderDO); map.put("error", error); @@ -382,6 +403,13 @@ public class ExcelReadUtil { // 文件读取 errList.add("成品宽数据长度错误"); } } + + if (flag) { + Double plateHeight = Double.parseDouble(vo.getHeight()); + Double plateWidth = Double.parseDouble(vo.getWidth()); + vo.setArea(plateHeight * plateWidth * 0.000001); + } + if (!convertToDouble(vo.getSplitHeight())) { flag = false; errList.add("拆单长数据类型错误"); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java index 5ea91a3a4..9dbc1ad8c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelTypeRealize.java @@ -139,7 +139,6 @@ public class ExcelTypeRealize { excelVO -> excelVO.getRoomsName() != null ? excelVO.getRoomsName() : " ", Collectors.toList() )); - System.out.println("roomCollect " + roomCollect); roomCollect.forEach((roomName, listRoom) -> { Long roomId = (Long) snowFlakeGenerator.nextId(null); @@ -161,12 +160,12 @@ public class ExcelTypeRealize { // 加工组类型为条件进行分组 Map> synthesisCollect = listBody.stream() .collect(Collectors.groupingBy( - excelVO -> excelVO.getSynthesis() != null ? excelVO.getSynthesis() : " ", + excelVO -> excelVO.getSynthesisTypeName() != null ? excelVO.getSynthesisTypeName() : " ", Collectors.toList() )); Long groupTypeId = (Long) snowFlakeGenerator.nextId(null); - synthesisCollect.forEach((synthesis, listSynthesis) -> { + synthesisCollect.forEach((synthesisTypeName, listSynthesis) -> { // 加工组名称为条件进行分组 Map> combinationNameCollect = listSynthesis.stream() .collect(Collectors.groupingBy( @@ -174,12 +173,12 @@ public class ExcelTypeRealize { Collectors.toList() )); combinationNameCollect.forEach((combinationName, listCombinationName) -> { - Long groupId = (Long) snowFlakeGenerator.nextId(null); // 板数量 final Double[] plateCountByCombination = {0.0}; - OrderGroupDO orderGroupDO = OrderGroupDO.builder().id(groupId).orderId(orderId).organId(organId).bodyId(bodyId) - .groupTypeId(groupTypeId).groupTypeName(synthesis).name(combinationName).width(0.0).height(0.0) - .depth(0.0).multiNum(0).plateNum(0).unregularNum(0).filename("无").remark("无").build(); + Long groupId = (Long) snowFlakeGenerator.nextId(null); + OrderGroupDO orderGroupDO = OrderGroupDO.builder().id(groupId).orderId(orderId).organId(organId).bodyId(bodyId) + .groupTypeId(groupTypeId).groupTypeName(synthesisTypeName).name(combinationName != " " ? combinationName : synthesisTypeName).width(0.0).height(0.0) + .depth(0.0).multiNum(0).plateNum(0).unregularNum(0).filename("无").remark("无").build(); listCombinationName.forEach(combination -> { @@ -207,7 +206,7 @@ public class ExcelTypeRealize { .plateNo(combination.getPlateNo()) .goodsId(combination.getGoodId()) .width(BigDecimal.valueOf(Double.parseDouble(combination.getWidth()))) - .plateNo(((obtainingTime)+ Long.toString(plateNo).substring(2))) + .plateNo(((obtainingTime) + Long.toString(plateNo).substring(2))) .height(BigDecimal.valueOf(Double.parseDouble(combination.getHeight()))) .thickness(BigDecimal.valueOf(Double.parseDouble(combination.getThickness()))) .splitWidth(BigDecimal.valueOf(Double.parseDouble(combination.getSplitWidth()))) @@ -229,7 +228,7 @@ public class ExcelTypeRealize { OrderItemDO orderItemDO = OrderItemDO.builder().orderId(orderId).type(OrderItemTypeEnum.PLATE_ITEM.getStatus()) .roomId(roomId).bodyId(bodyId).plateId(plateId) - .num(1.0).groupId(groupId).build(); + .num(1.0).groupId(synthesisTypeName != " " ? groupId : null).build(); orderItemDOS.add(orderItemDO); orderModelDOS.add(OrderModelDO.builder().orderId(orderId).plateId(plateId) .typographicFace(Integer.valueOf(typographyDTO.getValue())).build()); @@ -249,14 +248,14 @@ public class ExcelTypeRealize { .remark(remarkExtract(combination.remarkJSON())).build(); orderPartsRemarks.add(orderPartsRemark); OrderItemDO orderItemDO = OrderItemDO.builder().orderId(orderId).type(OrderItemTypeEnum.PARTS_ITEM.getStatus()) - .roomId(roomId).bodyId(bodyId).partsId(partsId).groupId(groupId) + .roomId(roomId).bodyId(bodyId).partsId(partsId).groupId(synthesisTypeName != " " ? groupId : null) .num(Double.valueOf(combination.getGoodsNumber())).build(); orderItemDOS.add(orderItemDO); } }); orderGroupDO.setPlateNum(plateCountByCombination[0].intValue()); - if (orderGroupDO.getName() != null && !orderGroupDO.getName().trim().isEmpty()) { + if (orderGroupDO.getGroupTypeName() != null && !orderGroupDO.getGroupTypeName().trim().isEmpty()) { orderGroupDOS.add(orderGroupDO); } }); @@ -279,8 +278,8 @@ public class ExcelTypeRealize { map.put("orderModuleExtraDOS", orderModuleExtraDOS); map.put("orderModelDOS", orderModelDOS); map.put("orderPartsRemarks", orderPartsRemarks); - System.out.println(" goodsDOS " + goodsDOS); - System.out.println(" rawGoodsDOS " + rawGoodsDOS); + System.out.println(" orderGroupDOS " + orderGroupDOS); + System.out.println(" orderItemDOS " + orderItemDOS); return map; } 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 1359180e0..a6d2cf06c 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 @@ -102,12 +102,12 @@ public class OrderPlateImportExcelVO { @JsonIgnore private String cabinetsName; - @ExcelProperty(value = "加工组类型") + @ExcelIgnore @JsonIgnore private String synthesis; @JsonIgnore - @ExcelIgnore + @ExcelProperty(value = "加工组类型") private String synthesisTypeName;//加工组类型的名称 @ExcelProperty(value = "加工组名称") @@ -208,6 +208,10 @@ public class OrderPlateImportExcelVO { @ExcelIgnore private String remark; + @JsonIgnore + @ExcelIgnore + private Double area; //面积 + //备注转json数据 public String remarkJSON() { ObjectMapper objectMapper = new ObjectMapper(); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index 32febc1dc..873649a30 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -84,12 +84,13 @@ - SELECT MIN(g.brand) AS brand, @@ -626,10 +626,50 @@ LEFT JOIN order_plate a ON g.id = a.goods_id AND g.organ_id = a.organ_id LEFT JOIN orders o ON o.id = a.order_id WHERE - o.organ_id = #{organId} - AND a.deleted = 0 - AND DATE(o.order_date) >= #{orderDate} + a.deleted = 0 + AND DATE(o.order_date) BETWEEN #{startTime} AND #{endTime} + + AND o.organ_id = #{organId} + GROUP BY g.goods_id + HAVING + SUM(a.area) > 0 + ORDER BY + orderCount DESC; + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel.xlsx index 792dd801dc38eff0eeb8179de0a79a15518fc0b2..2e85122dbadcc896de07e243c81e015053a82397 100644 GIT binary patch delta 13427 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 BLOuWh diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel_err.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/order_add_excel_err.xlsx index dfc6ef8e7482acd51ed48fecdeccd26db77dcdda..f171ef9a6a1e4b311be6b789dadcf73599107a95 100644 GIT binary patch delta 12420 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 delta 12355 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 DN`1Qv