From a06b4fad52e81f55c6c181b6e62cb58360e0e4ac Mon Sep 17 00:00:00 2001 From: ldj_willow Date: Sat, 6 Aug 2022 09:59:15 +0800 Subject: [PATCH] init project --- .../rest/AcsCacheLineController.java | 55 -- .../rest/CacheLineHandController.java | 206 ----- .../rest/MateriorecordController.java | 66 -- .../wms/cacheline/rest/VehicleController.java | 84 -- .../rest/VehilematerialController.java | 66 -- .../service/AcsCacheLineService.java | 28 - .../service/CacheLineHandService.java | 118 --- .../service/MateriorecordService.java | 71 -- .../wms/cacheline/service/VehicleService.java | 68 -- .../service/VehilematerialService.java | 64 -- .../service/dto/MateriorecordDto.java | 76 -- .../wms/cacheline/service/dto/VehicleDto.java | 58 -- .../service/dto/VehilematerialDto.java | 75 -- .../service/impl/AcsCacheLineServiceImpl.java | 59 -- .../impl/CacheLineHandServiceImpl.java | 806 ------------------ .../impl/MateriorecordServiceImpl.java | 136 --- .../service/impl/VehicleServiceImpl.java | 173 ---- .../impl/VehilematerialServiceImpl.java | 147 ---- .../cacheline/wql/CACHELINE_VEHICLE_001.wql | 174 ---- .../nl/wms/cacheline/wql/QACS_CACHE_005.wql | 74 -- .../nl/wms/cacheline/wql/QWCS_CACHE_004.wql | 194 ----- .../ext/bigScreen/autoTask/AutoAgvStatus.java | 97 --- .../rest/AgvBigScreenController.java | 46 - .../bigScreen/rest/BigScreenController.java | 81 -- .../rest/DeviceScreenController.java | 95 --- .../ext/bigScreen/rest/ProductController.java | 84 -- .../service/AgvBigScreenService.java | 12 - .../bigScreen/service/BigScreenService.java | 58 -- .../service/DeviceScreenService.java | 25 - .../ext/bigScreen/service/ProductService.java | 68 -- .../bigScreen/service/dto/ShopinfoDto.java | 87 -- .../ext/bigScreen/service/dto/StockDto.java | 36 - .../ext/bigScreen/service/dto/SupplyDto.java | 36 - .../service/dto/TodayandplannumDto.java | 32 - .../bigScreen/service/dto/YearinoutDto.java | 42 - .../service/impl/AgvBigScreenServiceImpl.java | 131 --- .../service/impl/BigScreenServiceImpl.java | 307 ------- .../service/impl/DeviceScreenServiceImpl.java | 514 ----------- .../service/impl/ProductServiceImpl.java | 247 ------ .../wms/ext/bigScreen/wql/AGVBIGSCREEN01.wql | 109 --- .../ext/bigScreen/wql/BIGSCREENPRODUCT.wql | 387 --------- .../wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql | 266 ------ .../nl/wms/ext/bigScreen/wql/bigScreen.xls | Bin 224256 -> 0 bytes .../org/nl/wms/ext/bigScreen/wql/ds_agv.xls | Bin 146432 -> 0 bytes .../src/main/java/org/nl/wms/pcs/1.txt | 0 .../wms/pcs/rest/DeliveryOrderController.java | 68 -- .../nl/wms/pcs/rest/SaleOrderController.java | 68 -- .../wms/pcs/service/DeliveryOrderService.java | 65 -- .../nl/wms/pcs/service/SaleOrderService.java | 65 -- .../wms/pcs/service/dto/DeliveryOrderDto.java | 79 -- .../nl/wms/pcs/service/dto/SaleOrderDto.java | 77 -- .../impl/DeliveryOrderServiceImpl.java | 155 ---- .../service/impl/SaleOrderServiceImpl.java | 155 ---- .../nl/wms/pcs/wql/PCS_DELIVERYORDER001.wql | 85 -- .../org/nl/wms/pcs/wql/PCS_SALEORDER001.wql | 85 -- .../src/main/java/org/nl/wms/pcs/wql/pcs.xls | Bin 291328 -> 0 bytes .../main/resources/config/application-dev.yml | 7 - .../resources/config/application-prod.yml | 6 - .../resources/config/application-test.yml | 5 - .../src/main/resources/initsql.txt | 14 - .../src/main/resources/logback-spring.xml | 6 - mes/hd/新建文本文档.txt | 1 - 62 files changed, 6499 deletions(-) delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/AcsCacheLineController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/CacheLineHandController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/MateriorecordController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehicleController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehilematerialController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/AcsCacheLineService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/CacheLineHandService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/MateriorecordService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehicleService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehilematerialService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/MateriorecordDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehicleDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehilematerialDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/AcsCacheLineServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/CacheLineHandServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/MateriorecordServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehicleServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehilematerialServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/CACHELINE_VEHICLE_001.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QACS_CACHE_005.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QWCS_CACHE_004.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/autoTask/AutoAgvStatus.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/AgvBigScreenController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/BigScreenController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/ProductController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/AgvBigScreenService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/BigScreenService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/ProductService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/ShopinfoDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/StockDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/SupplyDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/TodayandplannumDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/YearinoutDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/AgvBigScreenServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/BigScreenServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/ProductServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/AGVBIGSCREEN01.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/BIGSCREENPRODUCT.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/bigScreen.xls delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/ds_agv.xls delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/1.txt delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/DeliveryOrderController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/SaleOrderController.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/DeliveryOrderService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/SaleOrderService.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/DeliveryOrderDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/SaleOrderDto.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/DeliveryOrderServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/SaleOrderServiceImpl.java delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_DELIVERYORDER001.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_SALEORDER001.wql delete mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/pcs.xls delete mode 100644 mes/hd/nladmin-system/src/main/resources/initsql.txt delete mode 100644 mes/hd/新建文本文档.txt diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/AcsCacheLineController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/AcsCacheLineController.java deleted file mode 100644 index 2d3bb63..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/AcsCacheLineController.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.nl.wms.cacheline.rest; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.cacheline.service.AcsCacheLineService; -import org.nl.wms.cacheline.service.CacheLineHandService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author qinx - * @date 2022-05-25 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "缓存线条码管理") -@RequestMapping("/api/acs/cacheLine/") -@Slf4j -public class AcsCacheLineController { - - private final AcsCacheLineService acsCacheLineService; - - @PostMapping("/getEmptyStruct") - @Log("获取一个空的缓存线货位") - @ApiOperation("获取一个空的缓存线货位") - public ResponseEntity getEmptyStruct(@RequestBody Map whereJson) { - - return new ResponseEntity<>(acsCacheLineService.getEmptyStruct(whereJson), HttpStatus.OK); - } - - @PostMapping("/getFullStruct") - @Log("获取一个有料的缓存线货位") - @ApiOperation("获取一个有料的缓存线货位") - public ResponseEntity getFullStruct(@RequestBody Map whereJson) { - - return new ResponseEntity<>(acsCacheLineService.getFullStruct(whereJson), HttpStatus.OK); - } - - @PostMapping("/updateStruct") - @Log("更新缓存线货位") - @ApiOperation("更新缓存线货位") - public ResponseEntity updateStruct(@RequestBody Map whereJson) { - return new ResponseEntity<>(acsCacheLineService.updateStruct(whereJson), HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/CacheLineHandController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/CacheLineHandController.java deleted file mode 100644 index 03b973f..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/CacheLineHandController.java +++ /dev/null @@ -1,206 +0,0 @@ -package org.nl.wms.cacheline.rest; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.cacheline.service.CacheLineHandService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author qinx - * @date 2022-05-25 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "缓存线条码管理") -@RequestMapping("/api/cacheLine/pda") -@Slf4j -public class CacheLineHandController { - - private final CacheLineHandService cacheLineHandService; - - @PostMapping("/semiMaterialSpecQuery") - @Log("半成品物料规格查询") - @ApiOperation("半成品物料规格查询") - public ResponseEntity semiMaterialSpecQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.semiMaterialSpecQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/workprocedureQuery") - @Log("工序下拉框查询") - @ApiOperation("工序下拉框查询") - public ResponseEntity workprocedureQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.workprocedureQuery(whereJson), HttpStatus.OK); - } - - - @PostMapping("/cacheLineMaterInfoQuery") - @Log("缓存线料箱条码查询料箱信息") - @ApiOperation("缓存线料箱条码查询料箱信息") - public ResponseEntity cacheLineMaterInfoQuery(@RequestBody Map whereJson) { - return new ResponseEntity<>(cacheLineHandService.cacheLineMaterInfoQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceQuery") - @Log("缓存线设备下拉框查询") - @ApiOperation("缓存线设备下拉框查询") - public ResponseEntity deviceQuery(@RequestBody Map whereJson) { - return new ResponseEntity<>(cacheLineHandService.deviceQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/inOutEmptyBox") - @Log("空箱初始化--出入空箱") - @ApiOperation("空箱初始化--出入空箱") - public ResponseEntity inOutEmptyBox(@RequestBody Map whereJson) { - return new ResponseEntity<>(cacheLineHandService.inOutEmptyBox(whereJson), HttpStatus.OK); - } - - @PostMapping("/inOutExceptionInstQuery") - @Log("缓存线出入箱异常指令查询") - @ApiOperation("缓存线出入箱异常指令查询") - public ResponseEntity inOutExceptionInstQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.inOutExceptionInstQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/inOutExceptionInstConfirm") - @Log("缓存线出入箱异常指令确认") - @ApiOperation("缓存线出入箱异常指令确认") - public ResponseEntity inOutExceptionInstConfirm(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.inOutExceptionInstConfirm(whereJson), HttpStatus.OK); - } - - @PostMapping("/setfullBox") - @Log("设置满匡") - @ApiOperation("设置满匡") - public ResponseEntity setfullBox(@RequestBody Map whereJson) { - return new ResponseEntity<>(cacheLineHandService.setfullBox(whereJson), HttpStatus.OK); - } - - @PostMapping("/setEmptyBox") - @Log("设置空匡") - @ApiOperation("设置空匡") - public ResponseEntity setEmptyBox(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.setEmptyBox(whereJson), HttpStatus.OK); - } - - @PostMapping("/agvInBoxExceptionQuery") - @Log("AGV入箱异常-查询") - @ApiOperation("AGV入箱异常-查询") - public ResponseEntity agvInBoxExceptionQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.agvInBoxExceptionQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/agvInBoxExceptionConfirm") - @Log("AGV入箱异常-确认") - @ApiOperation("AGV入箱异常-确认") - public ResponseEntity agvInBoxExceptionConfirm(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.agvInBoxExceptionConfirm(whereJson), HttpStatus.OK); - } - - @PostMapping("/agvOutBoxExceptionQuery") - @Log("AGV出箱异常-查询") - @ApiOperation("AGV出箱异常-查询") - public ResponseEntity agvOutBoxExceptionQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.agvOutBoxExceptionQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/agvOutBoxExceptionConfirm") - @Log(" AGV出箱异常-确认") - @ApiOperation(" AGV出箱异常-确认") - public ResponseEntity agvOutBoxExceptionConfirm(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.agvOutBoxExceptionConfirm(whereJson), HttpStatus.OK); - } - - @PostMapping("/cacheLineOutBoxExceptionQuery") - @Log("缓存线出箱异常-查询") - @ApiOperation("缓存线出箱异常-查询") - public ResponseEntity cacheLineOutBoxExceptionQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.cacheLineOutBoxExceptionQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/cacheLineOutBoxExceptionConfirm") - @Log("缓存线出箱异常-确认") - @ApiOperation("缓存线出箱异常-确认") - public ResponseEntity cacheLineOutBoxExceptionConfirm(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.cacheLineOutBoxExceptionConfirm(whereJson), HttpStatus.OK); - } - - - @PostMapping("/materialQuery") - @Log("物料信息查询") - @ApiOperation("物料信息查询") - public ResponseEntity materialQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.materialQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/setBlankPos") - @Log("设置缓存线货位为空位置") - @ApiOperation("设置缓存线货位为空位置") - public ResponseEntity setBlankPos(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.setBlankPos(whereJson), HttpStatus.OK); - } - - @PostMapping("/instStatusQuery") - @Log("指令状态下拉框查询") - @ApiOperation("指令状态下拉框查询") - public ResponseEntity instStatusQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.instStatusQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/cacheLineExcepOpt") - @Log("缓存线异常处理") - @ApiOperation("缓存线异常处理") - public ResponseEntity cacheLineExcepOpt(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.cacheLineExcepOpt(whereJson), HttpStatus.OK); - } - - @PostMapping("/instPageQuery") - @Log("指令分页查询") - @ApiOperation("指令分页查询") - public ResponseEntity instPageQuery(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.instPageQuery(whereJson), HttpStatus.OK); - } - - @PostMapping("/instOperation") - @Log("指令操作") - @ApiOperation("指令操作") - public ResponseEntity instOperation(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.instOperation(whereJson), HttpStatus.OK); - } - - @PostMapping("/pourMaterial") - @Log("倒料操作") - @ApiOperation("倒料操作") - public ResponseEntity pourMaterial(@RequestBody Map whereJson) { - - return new ResponseEntity<>(cacheLineHandService.pourMaterial(whereJson), HttpStatus.OK); - } - - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/MateriorecordController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/MateriorecordController.java deleted file mode 100644 index a550eda..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/MateriorecordController.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.nl.wms.cacheline.rest; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.cacheline.service.MateriorecordService; -import org.nl.wms.cacheline.service.dto.MateriorecordDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** -* @author qinx -* @date 2022-05-26 -**/ -@RestController -@RequiredArgsConstructor -@Api(tags = "缓存线物料出入记录管理") -@RequestMapping("/api/materiorecord") -@Slf4j -public class MateriorecordController { - - private final MateriorecordService materiorecordService; - - @GetMapping - @Log("查询缓存线物料出入记录") - @ApiOperation("查询缓存线物料出入记录") - //@PreAuthorize("@el.check('materiorecord:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(materiorecordService.queryAll(whereJson,page),HttpStatus.OK); - } - - @PostMapping - @Log("新增缓存线物料出入记录") - @ApiOperation("新增缓存线物料出入记录") - //@PreAuthorize("@el.check('materiorecord:add')") - public ResponseEntity create(@Validated @RequestBody MateriorecordDto dto){ - materiorecordService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改缓存线物料出入记录") - @ApiOperation("修改缓存线物料出入记录") - //@PreAuthorize("@el.check('materiorecord:edit')") - public ResponseEntity update(@Validated @RequestBody MateriorecordDto dto){ - materiorecordService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除缓存线物料出入记录") - @ApiOperation("删除缓存线物料出入记录") - //@PreAuthorize("@el.check('materiorecord:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - materiorecordService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehicleController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehicleController.java deleted file mode 100644 index aa4e3cc..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehicleController.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.nl.wms.cacheline.rest; - - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; - -import org.nl.wms.cacheline.service.VehicleService; -import org.nl.wms.cacheline.service.dto.VehicleDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** -* @author qinx -* @date 2022-05-25 -**/ -@RestController -@RequiredArgsConstructor -@Api(tags = "缓存线条码管理") -@RequestMapping("/api/vehicle") -@Slf4j -public class VehicleController { - - private final VehicleService vehicleService; - - @GetMapping - @Log("查询缓存线条码") - @ApiOperation("查询缓存线条码") - //@PreAuthorize("@el.check('vehicle:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(vehicleService.queryAll(whereJson,page),HttpStatus.OK); - } - - @PostMapping - @Log("新增缓存线条码") - @ApiOperation("新增缓存线条码") - //@PreAuthorize("@el.check('vehicle:add')") - public ResponseEntity create(@Validated @RequestBody VehicleDto dto){ - vehicleService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改缓存线条码") - @ApiOperation("修改缓存线条码") - //@PreAuthorize("@el.check('vehicle:edit')") - public ResponseEntity update(@Validated @RequestBody VehicleDto dto){ - vehicleService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除缓存线条码") - @ApiOperation("删除缓存线条码") - //@PreAuthorize("@el.check('vehicle:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - vehicleService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - @PutMapping("/changeActive") - @Log("修改点位启用状态") - @ApiOperation("修改点位启用状态") - //@PreAuthorize("@el.check('store:edit')") - public ResponseEntity changeActive(@RequestBody JSONObject json) { - vehicleService.changeActive(json); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - @PutMapping("/changePrint") - @Log("修改点位启用状态") - @ApiOperation("修改点位启用状态") - //@PreAuthorize("@el.check('store:edit')") - public ResponseEntity changePrint(@RequestBody JSONObject json) { - vehicleService.changePrint(json); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehilematerialController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehilematerialController.java deleted file mode 100644 index 28741f5..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/rest/VehilematerialController.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.nl.wms.cacheline.rest; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.cacheline.service.VehilematerialService; -import org.nl.wms.cacheline.service.dto.VehilematerialDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** -* @author qinx -* @date 2022-05-25 -**/ -@RestController -@RequiredArgsConstructor -@Api(tags = "缓存线载具物料管理") -@RequestMapping("/api/vehilematerial") -@Slf4j -public class VehilematerialController { - - private final VehilematerialService vehilematerialService; - - @GetMapping - @Log("查询缓存线载具物料") - @ApiOperation("查询缓存线载具物料") - //@PreAuthorize("@el.check('vehilematerial:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(vehilematerialService.queryAll(whereJson,page),HttpStatus.OK); - } - - @PostMapping - @Log("新增缓存线载具物料") - @ApiOperation("新增缓存线载具物料") - //@PreAuthorize("@el.check('vehilematerial:add')") - public ResponseEntity create(@Validated @RequestBody VehilematerialDto dto){ - vehilematerialService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改缓存线载具物料") - @ApiOperation("修改缓存线载具物料") - //@PreAuthorize("@el.check('vehilematerial:edit')") - public ResponseEntity update(@Validated @RequestBody VehilematerialDto dto){ - vehilematerialService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除缓存线载具物料") - @ApiOperation("删除缓存线载具物料") - //@PreAuthorize("@el.check('vehilematerial:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - vehilematerialService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/AcsCacheLineService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/AcsCacheLineService.java deleted file mode 100644 index f83c53d..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/AcsCacheLineService.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.nl.wms.cacheline.service; - -import java.util.Map; - -/** - * @author qinx - * @description 服务接口 - * @date 2022-05-25 - **/ -public interface AcsCacheLineService { - - /** - * 获取一个空的缓存线货位 - */ - Map getEmptyStruct(Map jsonObject); - - /** - * 获取一个有料的缓存线货位 - */ - Map getFullStruct(Map jsonObject); - - /** - * 更新缓存线货位 - */ - Map updateStruct(Map jsonObject); - - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/CacheLineHandService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/CacheLineHandService.java deleted file mode 100644 index d3736ce..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/CacheLineHandService.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.nl.wms.cacheline.service; - -import java.util.Map; - -/** - * @author qinx - * @description 服务接口 - * @date 2022-05-25 - **/ -public interface CacheLineHandService { - - /** - * 半成品物料规格查询 - */ - Map semiMaterialSpecQuery(Map jsonObject); - - /** - * 工序下拉框查询 - */ - Map workprocedureQuery(Map jsonObject); - - /** - * 缓存线料箱条码查询料箱信息 - */ - Map deviceQuery(Map jsonObject); - /** - * 缓存线料箱条码查询料箱信息 - */ - Map cacheLineMaterInfoQuery(Map jsonObject); - - /** - * 空箱初始化--出入空箱 - */ - Map inOutEmptyBox(Map jsonObject); - - /** - * 缓存线出入箱异常指令查询 - */ - Map inOutExceptionInstQuery(Map jsonObject); - - /** - * 缓存线出入箱异常指令确认 - */ - Map inOutExceptionInstConfirm(Map jsonObject); - - /** - * 设置满匡 - */ - Map setfullBox(Map jsonObject); - - /** - * 设置空匡 - */ - Map setEmptyBox(Map jsonObject); - - /** - * AGV入箱异常-查询 - */ - Map agvInBoxExceptionQuery(Map jsonObject); - - /** - * AGV入箱异常-确认 - */ - Map agvInBoxExceptionConfirm(Map jsonObject); - /** - * AGV出箱异常-查询 - */ - Map agvOutBoxExceptionQuery(Map jsonObject); - /** - * AGV出箱异常-确认 - */ - Map agvOutBoxExceptionConfirm(Map jsonObject); - - /** - * 缓存线出箱异常-查询 - */ - Map cacheLineOutBoxExceptionQuery(Map jsonObject); - - /** - * 缓存线出箱异常-确认 - */ - Map cacheLineOutBoxExceptionConfirm(Map jsonObject); - - /** - * 物料信息查询 - */ - Map materialQuery(Map jsonObject); - - /** - * 设置缓存线货位为空位置 - */ - Map setBlankPos(Map jsonObject); - - /** - * 缓存线异常处理 - */ - Map instStatusQuery(Map jsonObject); - - /** - * 缓存线异常处理 - */ - Map cacheLineExcepOpt(Map jsonObject); - - /** - * 指令操作 - */ - Map instOperation(Map jsonObject); - /** - * 倒料操作 - */ - Map pourMaterial(Map jsonObject); - /** - * 指令分页查询 - */ - Map instPageQuery(Map jsonObject); - - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/MateriorecordService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/MateriorecordService.java deleted file mode 100644 index bb5e40e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/MateriorecordService.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.nl.wms.cacheline.service; - -import org.nl.wms.cacheline.service.dto.MateriorecordDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** - * @author qinx - * @description 服务接口 - * @date 2022-05-26 - **/ -public interface MateriorecordService { - - /** - * 查询数据分页 - * - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * - * @param record_uuid ID - * @return Materiorecord - */ - MateriorecordDto findById(Long record_uuid); - - /** - * 根据编码查询 - * - * @param code code - * @return Materiorecord - */ - MateriorecordDto findByCode(String code); - - - /** - * 创建 - * - * @param dto / - */ - void create(MateriorecordDto dto); - - /** - * 编辑 - * - * @param dto / - */ - void update(MateriorecordDto dto); - - /** - * 多选删除 - * - * @param ids / - */ - void deleteAll(Long[] ids); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehicleService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehicleService.java deleted file mode 100644 index 7d5a432..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehicleService.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.nl.wms.cacheline.service; - -import com.alibaba.fastjson.JSONObject; -import org.nl.wms.cacheline.service.dto.VehicleDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** -* @description 服务接口 -* @author qinx -* @date 2022-05-25 -**/ -public interface VehicleService { - - /** - * 查询数据分页 - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * @param vehicle_uuid ID - * @return Vehicle - */ - VehicleDto findById(Long vehicle_uuid); - - /** - * 根据编码查询 - * @param code code - * @return Vehicle - */ - VehicleDto findByCode(String code); - - - /** - * 创建 - * @param dto / - */ - void create(VehicleDto dto); - - /** - * 编辑 - * @param dto / - */ - void update(VehicleDto dto); - - /** - * 多选删除 - * @param ids / - */ - void deleteAll(Long[] ids); - - void changeActive(JSONObject json); - void changePrint(JSONObject json); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehilematerialService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehilematerialService.java deleted file mode 100644 index c3e873e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/VehilematerialService.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.nl.wms.cacheline.service; - -import org.nl.wms.cacheline.service.dto.VehilematerialDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** -* @description 服务接口 -* @author qinx -* @date 2022-05-25 -**/ -public interface VehilematerialService { - - /** - * 查询数据分页 - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * @param vehmaterial_uuid ID - * @return Vehilematerial - */ - VehilematerialDto findById(Long vehmaterial_uuid); - - /** - * 根据编码查询 - * @param code code - * @return Vehilematerial - */ - VehilematerialDto findByCode(String code); - - - /** - * 创建 - * @param dto / - */ - void create(VehilematerialDto dto); - - /** - * 编辑 - * @param dto / - */ - void update(VehilematerialDto dto); - - /** - * 多选删除 - * @param ids / - */ - void deleteAll(Long[] ids); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/MateriorecordDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/MateriorecordDto.java deleted file mode 100644 index 46c7340..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/MateriorecordDto.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.nl.wms.cacheline.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** -* @description / -* @author qinx -* @date 2022-05-26 -**/ -@Data -public class MateriorecordDto implements Serializable { - - /** 记录标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long record_uuid; - - /** 缓存线标识 */ - private Long device_uuid; - - /** 缓存线编码 */ - private String extdevice_code; - - /** 缓存线名字 */ - private String device_name; - - /** 缓存线层数 */ - private BigDecimal layer_num; - - /** 出入类型 */ - private String io_type; - - /** 载具标识 */ - private Long vehicle_uuid; - - /** 载具编码 */ - private String vehicle_code; - - /** 工序标识 */ - private Long workprocedure_uuid; - - /** 载具状态 */ - private String vehicle_status; - - /** 物料标识 */ - private Long material_uuid; - - /** 料箱物料数量 */ - private BigDecimal quantity; - - /** 料箱物料重量 */ - private BigDecimal weight; - - /** 物料工单标识 */ - private Long produceorder_uuid; - - /** 物料工单编码 */ - private String produceorder_code; - - /** 创建时间 */ - private String create_time; - - /** 更新时间 */ - private String update_time; - - /** 是否可用 */ - private String is_active; - - /** 是否删除 */ - private String is_delete; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehicleDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehicleDto.java deleted file mode 100644 index c2f7963..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehicleDto.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nl.wms.cacheline.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** -* @description / -* @author qinx -* @date 2022-05-25 -**/ -@Data -public class VehicleDto implements Serializable { - - /** 载具标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long vehicle_uuid; - - /** 载具编码 */ - private String vehicle_code; - - /** 打印次数 */ - private BigDecimal print_num; - - /** 是否打印 */ - private String is_print; - - /** 创建时间 */ - private String create_time; - - /** 更新时间 */ - private String update_time; - - /** 打印时间 */ - private String print_time; - - /** 是否可用 */ - private String is_active; - - /** 是否删除 */ - private String is_delete; - - /** 创建人 */ - private Long create_id; - - /** 创建人姓名 */ - private String create_name; - - /** 修改人 */ - private Long update_optid; - - /** 修改人姓名 */ - private String update_optname; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehilematerialDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehilematerialDto.java deleted file mode 100644 index 4dab8b3..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/dto/VehilematerialDto.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.nl.wms.cacheline.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** -* @description / -* @author qinx -* @date 2022-05-25 -**/ -@Data -public class VehilematerialDto implements Serializable { - - /** 载具库存标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long vehmaterial_uuid; - - private Long position_uuid; - - /** 载具标识 */ - private Long vehicle_uuid; - - /** 载具编码 */ - private String vehicle_code; - - /** 载具状态 */ - private String vehicle_status; - - /** 缓存线编码 */ - private String extdevice_code; - - /** 异常类型 */ - private String err_type; - - /** 物料工单标识 */ - private Long produceorder_uuid; - - /** 物料工单编码 */ - private String produceorder_code; - - /** 工序标识 */ - private Long workprocedure_uuid; - - /** 工序编号 */ - private String workprocedure_code; - - /** 工序名称 */ - private String workprocedure_name; - - /** 物料标识 */ - private Long material_uuid; - - /** 料箱物料数量 */ - private BigDecimal quantity; - - /** 料箱物料重量 */ - private BigDecimal weight; - - /** 创建时间 */ - private String create_time; - - /** 更新时间 */ - private String update_time; - - /** 是否可用 */ - private String is_active; - - /** 是否删除 */ - private String is_delete; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/AcsCacheLineServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/AcsCacheLineServiceImpl.java deleted file mode 100644 index 6550236..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/AcsCacheLineServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.nl.wms.cacheline.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.wms.cacheline.service.AcsCacheLineService; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.springframework.stereotype.Service; - -import java.util.Map; - -/** - * @author qinx - * @description 服务实现 - * @date 2022-05-25 - **/ -@Service -@RequiredArgsConstructor -@Slf4j -public class AcsCacheLineServiceImpl implements AcsCacheLineService { - - @Override - public Map getEmptyStruct(Map jsonObject) { - JSONObject result = WQL.getWO("QACS_CACHE_005").addParam("flag", "1").process().uniqueResult(0); - if (ObjectUtil.isEmpty(result)) { - throw new BadRequestException("未知道合适的位置!"); - } - return result; - } - - @Override - public Map getFullStruct(Map jsonObject) { - - //物料,工序 默认能取到 - String produceorder_uuid = jsonObject.get("produceorder_uuid"); - String material_uuid = jsonObject.get("material_uuid"); - JSONObject result = WQL.getWO("QACS_CACHE_005").addParam("flag", "2").addParam("material_uuid", material_uuid).addParam("produceorder_uuid", produceorder_uuid).process().uniqueResult(0); - if (ObjectUtil.isEmpty(result)) { - throw new BadRequestException("未知道合适的位置!"); - } - return result; - } - - @Override - public Map updateStruct(Map jsonObject) { - //默认取到 position_code(缓存线位置编码) vehicle_uuid vehicle_code - String position_code = jsonObject.get("position_code"); - String vehicle_uuid = jsonObject.get("vehicle_uuid"); - String vehicle_code = jsonObject.get("vehicle_code"); - JSONObject positionObj = WQLObject.getWQLObject("ST_CacheLine_Position").query("position_code='" + position_code + "'").uniqueResult(0); - positionObj.put("vehicle_uuid", vehicle_uuid); - positionObj.put("vehicle_code", vehicle_code); - WQLObject.getWQLObject("ST_CacheLine_Position").update(positionObj); - return null; - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/CacheLineHandServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/CacheLineHandServiceImpl.java deleted file mode 100644 index 85e3e38..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/CacheLineHandServiceImpl.java +++ /dev/null @@ -1,806 +0,0 @@ -package org.nl.wms.cacheline.service.impl; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.wms.cacheline.service.CacheLineHandService; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author qinx - * @description 服务实现 - * @date 2022-05-25 - **/ -@Service -@RequiredArgsConstructor -@Slf4j -public class CacheLineHandServiceImpl implements CacheLineHandService { - - @Override - public Map semiMaterialSpecQuery(Map jsonObject) { - // 半成品规格下拉框查询 - JSONArray arr = WQL.getWO("QWCS_CACHE_004").addParam("flag", "1").process().getResultJSONArray(0); - JSONObject srb = new JSONObject(); - srb.put("result", arr); - srb.put("code", 1); - srb.put("desc", "查询成功!"); - return srb; - } - - @Override - public Map workprocedureQuery(Map jsonObject) { - // 工序下拉框查询 - JSONArray arr = WQL.getWO("QWCS_CACHE_004").addParam("flag", "2").process().getResultJSONArray(0); - JSONObject srb = new JSONObject(); - srb.put("result", arr); - srb.put("code", 1); - srb.put("desc", "查询成功!"); - return srb; - } - - @Override - public Map deviceQuery(Map jsonObject) { - //查询缓存线设备 - JSONArray arr = WQL.getWO("QWCS_CACHE_004").addParam("flag", "5").process().getResultJSONArray(0); - JSONObject srb = new JSONObject(); - srb.put("result", arr); - srb.put("code", 1); - srb.put("desc", "查询成功!"); - return srb; - } - - @Override - public Map cacheLineMaterInfoQuery(Map jsonObject) { - // 缓存线位置表【ST_cacheLine_Position】 - WQLObject positionTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - JSONArray arr = positionTab - .query("extdevice_code like '%" + jsonObject.get("wcsdevice_code") + "%'", "layer_num desc,order_no") - .getResultJSONArray(0); - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - WQLObject ivtTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - - JSONObject srb = new JSONObject(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - json.put("seat_order_num", json.get("order_no")); - // 0空位 status = 1: 绿色空箱 || status = 2:黄色满箱 || status = 3:红色异常 || status = 4 :不显示 - json.put("weight", "0"); - json.put("quantity", "0"); - if ("0".equals(json.getString("is_show"))) { - json.put("vehicle_status", "04"); - } else {// 显示 - if ("1".equals(json.getString("is_blank"))) { - json.put("vehicle_status", "00"); - } else {// 载具不为空 - String vehicle_code = json.getString("vehicle_code"); - JSONObject ivtObj = ivtTab.query("vehicle_code = '" + vehicle_code + "' and extdevice_code like '%" - + jsonObject.get("wcsdevice_code") + "%'").uniqueResult(0); - if (ivtObj == null) { - // 异常 - json.put("vehicle_status", "03"); - } else { - json.put("vehicle_status", ivtObj.getString("vehicle_status")); - json.put("weight", ivtObj.getString("weight")); - json.put("quantity", ivtObj.getString("quantity")); - json.putAll(ivtObj); - - } - } - } - json.put("is_err", "0"); - json.put("wcsdevice_code", json.getString("extdevice_code")); - // 去掉小数 - json.put("weight", NumberUtil.roundStr(json.getString("weight"), 0)); - json.put("status", json.getString("vehicle_status").substring(1, 2)); - - if (!"00".equals(json.getString("err_type"))) { - json.put("is_err", "1"); - } - - } - - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - } - - @Override - public Map inOutEmptyBox(Map jsonObject) { - String inOut_type = jsonObject.get("inOut_type"); - String extdevice_code = jsonObject.get("wcsdevice_code"); - String vehicle_code = jsonObject.get("vehicle_code"); - - // 缓存线位置表【ST_cacheLine_Position】 - WQLObject positionTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - WQLObject vehMaterTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - // 入空箱 - if ("1".equals(inOut_type)) { - // 判断是否可以放入空箱子 - JSONObject ivtObj = positionTab.query("vehicle_code = '" + vehicle_code + "'").uniqueResult(0); - // 判断箱子是否在缓存线内 - if (ivtObj != null) { - throw new BadRequestException("箱子【" + vehicle_code + "】已在库内,无法入空箱!"); - } - - // 判断是否可以放入空箱子 - JSONObject json = positionTab.query("extdevice_code = '" + extdevice_code + "' and is_blank= '1'") - .uniqueResult(0); - if (json == null) { - throw new BadRequestException("无法找到缓存线【" + extdevice_code + "】的空位,无法入空箱!"); - } - - // 入了空箱子 - JSONObject afterIvt = new JSONObject(); - afterIvt.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextId()); - afterIvt.put("vehicle_uuid", vehicle_code); - afterIvt.put("vehicle_code", vehicle_code); - afterIvt.put("extdevice_code", extdevice_code); - afterIvt.put("vehicle_status", "01"); - afterIvt.put("update_time", DateUtil.now()); - afterIvt.put("create_time", DateUtil.now()); - vehMaterTab.insert(afterIvt); - - } - // 出空箱 - if ("2".equals(inOut_type)) { - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - JSONObject json = vehMaterTab.query("extdevice_code = '" + extdevice_code - + "' and vehicle_status= '01' and vehicle_code = '" + vehicle_code + "'").uniqueResult(0); - if (json == null) { - throw new BadRequestException("无法找到缓存线【" + extdevice_code + "】的空箱【" + vehicle_code + "】,出空箱失败"); - } - - // 删除掉出库的箱子 - vehMaterTab.delete("extdevice_code = '" + extdevice_code + "' and vehicle_code = '" + vehicle_code + "'"); - - } - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - } - - @Override - public Map inOutExceptionInstQuery(Map jsonObject) { - String vehicle_code = jsonObject.get("vehicle_code"); - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - String inOut_type = jsonObject.get("inOut_type"); - - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - - JSONArray result = new JSONArray(); - - // 入箱扫码异常 - if ("1".equals(inOut_type)) { - String where = "next_point_code = '" + wcsdevice_code + "' and task_status <> '06'"; - - if (StrUtil.isNotBlank(vehicle_code)) { - where = "next_point_code = '" + wcsdevice_code + "' and vehicle_code = '" + vehicle_code - + "' and task_status <> '06'"; - } - JSONArray arr = instructTab.query(where).getResultJSONArray(0); - - for (int i = 0; i < arr.size(); i++) { - JSONObject row = arr.getJSONObject(i); - JSONObject json = new JSONObject(); - json.put("instruct_uuid", row.getString("instruct_uuid")); - json.put("instructorder_no", row.getString("instructorder_no")); - json.put("wcsdevice_code", row.getString("next_point_code")); - json.put("vehicle_code", row.getString("invehicle_code")); - json.put("start_point_code", row.getString("start_point_code")); - json.put("nextpoint_code", row.getString("next_point_code")); - json.put("nextpoint_code2", row.getString("next_point_code")); - result.add(json); - } - } - // 出箱扫码异常 - if ("2".equals(inOut_type)) { - String where = "start_point_code = '" + wcsdevice_code + "' and task_status <> '06'"; - - if (StrUtil.isNotBlank(vehicle_code)) { - where = "start_point_code = '" + wcsdevice_code + "' and vehicle_code = '" + vehicle_code - + "' and task_status <> '06'"; - } - - JSONArray arr = instructTab.query(where).getResultJSONArray(0); - for (int i = 0; i < arr.size(); i++) { - JSONObject row = arr.getJSONObject(i); - JSONObject json = new JSONObject(); - json.put("instruct_uuid", row.getString("instruct_uuid")); - json.put("instructorder_no", row.getString("instructorder_no")); - json.put("vehicle_code", row.getString("outvehicle_code")); - json.put("wcsdevice_code", row.getString("start_point_code")); - json.put("start_point_code", row.getString("start_point_code")); - json.put("nextpoint_code", row.getString("nextpoint_code")); - json.put("nextpoint_code2", row.getString("nextpoint_code2")); - result.add(json); - } - } - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - } - - @Override - public Map inOutExceptionInstConfirm(Map jsonObject) { - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - // 1 扫码异常-入箱扫码 2 扫码异常-出箱扫码 - String inOut_type = jsonObject.get("inOut_type"); - // 缓存线编码 - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - // - String vehicle_code = jsonObject.get("vehicle_code"); - // 指令标识 - // String instruct_uuid = jsonObject.optString("instruct_uuid"); - // JSONObject instObj = instructTab.query("instruct_uuid = '" + instruct_uuid + - // "'").uniqueResult(0); - - // 封装给wcs的数据 - Object[] data = new Object[3]; - data[0] = inOut_type; - data[1] = wcsdevice_code; - data[2] = vehicle_code; - // TODO: 2022/5/27 - /* uWcsSchedule.notifyWcs(99, 3001, data);*/ - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map setfullBox(Map jsonObject) { - String semimanufactures_uuid = jsonObject.get("material_uuid"); - // 料箱码 - String vehicle_code = jsonObject.get("vehicle_code"); - // 层数 - String layer_num = jsonObject.get("layer_num"); - // 顺序号 - String seat_order_num = jsonObject.get("seat_order_num"); - // 缓存线 - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - String weight = jsonObject.get("weight"); - String quantity = jsonObject.get("quantity"); - JSONObject srb = new JSONObject(); - if (StrUtil.isEmpty(quantity) || Double.valueOf(jsonObject.get("quantity")) <= 0) { - throw new BadRequestException("数量必须大于0"); - } - - String workprocedure_code = jsonObject.get("workprocedure_uuid"); - WQLObject positionTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - JSONObject vehiobj = positionTab.query("order_no = " + seat_order_num + " and layer_num = " + layer_num - + " and extdevice_code like '%" + wcsdevice_code + "%'").uniqueResult(0); - if (vehiobj == null) { - throw new BadRequestException("位置不存在,设置有误!"); - } - // 判断物料去的缓存线是否正确 - // PDM_BI_WorkshopMaterialCorr - WQLObject corrTab = WQLObject.getWQLObject("PDM_BI_WorkshopMaterialCorr"); - WQLObject wpTab = WQLObject.getWQLObject("PDM_BI_WorkProcedure"); - - // 设置工序信息 - JSONObject wpObj = wpTab.query("workprocedure_code = '" + workprocedure_code + "'").uniqueResult(0); - // 物料系列 - String materialprocess_series = corrTab.query("semimanufactures_uuid = '" + semimanufactures_uuid + "'") - .uniqueResult(0).getString("materialprocess_series"); - // TODO: 2022/5/27 - /* AgvTwoInst inst = new AgvTwoInst(); - String cacheLineCode2 = inst.getcacheLineCode(materialprocess_series, wpObj.optString("workprocedure_code")); -*/ - String cacheLineCode2 = ""; - if (!wcsdevice_code.equals(cacheLineCode2)) { - String materialprocess_seriesname = WQLObject.getWQLObject("PF_PB_SysDicInfo") - .query("sysdic_type = 'IF_WCS_DEVICESERIES' and sysdic_code = '" + materialprocess_series + "'") - .uniqueResult(0).getString("sysdic_name"); - throw new BadRequestException("该缓存线【" + wcsdevice_code + "】不能存放【" + materialprocess_seriesname + "】物料,操作失败!"); - } - - vehiobj.put("vehicle_code", vehicle_code); - vehiobj.put("vehicle_uuid", vehicle_code); - positionTab.update(vehiobj); - - WQLObject materTab = WQLObject.getWQLObject("PDM_BI_SemiMaterialCorr"); - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - WQLObject ivtTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - - // ivtTab.delete("extdevice_code = '" + wcsdevice_code + "' and vehicle_code = - // '" + vehicle_code + "'"); - ivtTab.delete("vehicle_code = '" + vehicle_code + "'"); - - // 物料信息 - JSONObject materObj = materTab.query("semimanufactures_uuid = '" + semimanufactures_uuid + "'").uniqueResult(0); - - HashMap json = new HashMap(); - json.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextId() + ""); - json.put("vehicle_code", vehicle_code); - json.put("vehicle_uuid", vehicle_code); - json.put("extdevice_code", wcsdevice_code); - json.put("material_uuid", materObj.getString("semimanufactures_uuid")); - json.put("material_code", materObj.getString("semimanufactures_code")); - json.put("material_spec", materObj.getString("semimanufactures_spec")); - json.put("material_name", materObj.getString("semimanufactures_name")); - json.put("weight", weight); - json.put("quantity", quantity); - - json.put("workprocedure_uuid", wpObj.getString("workprocedure_uuid")); - json.put("workprocedure_code", wpObj.getString("workprocedure_code")); - json.put("workprocedure_name", wpObj.getString("workprocedure_name")); - - // 有箱有料 - json.put("vehicle_status", "02"); - json.put("create_time", DateUtil.now()); - - ivtTab.insert(json); - - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map setEmptyBox(Map jsonObject) { - JSONObject srb = new JSONObject(); - // 层数 - String layer_num = jsonObject.get("layer_num"); - // 顺序号 - String seat_order_num = jsonObject.get("seat_order_num"); - // 载具条码 - String vehicle_code = jsonObject.get("vehicle_code"); - // 缓存线编码 - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - - // 判断载具编码是否存在 - // 缓存线载具条码表【IF_cacheLine_Vehicle】 - /* - * WQLObject wql=WQLObject.getWQLObject("IF_cacheLine_Vehicle"); JSONObject - * vehiobj = - * wql.query("is_delete='0' AND is_active='1' AND vehicle_code = '"+vehicle_code - * +"'").uniqueResult(0); if (vehiobj==null) { srb.setFailure(); - * srb.setDesc("条码【" + vehicle_code + "】不存在或已被删除,操作失败!"); return srb; } - */ - // 缓存线位置表【ST_cacheLine_Position】 - WQLObject positionTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - JSONObject vehiobj = positionTab.query("order_no = " + seat_order_num + " and layer_num = " + layer_num - + " and extdevice_code like '%" + wcsdevice_code + "%'").uniqueResult(0); - if (vehiobj == null) { - throw new BadRequestException("位置不存在,设置有误!"); - } - vehiobj.put("vehicle_code", vehicle_code); - vehiobj.put("vehicle_uuid", vehicle_code); - positionTab.update(vehiobj); - - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - WQLObject ivtTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - - // 先删除空箱子位置 - // ivtTab.delete("extdevice_code = '" + wcsdevice_code + "' and vehicle_code = - // '" + vehicle_code + "'"); - ivtTab.delete("vehicle_code = '" + vehicle_code + "'"); - - JSONObject json = new JSONObject(); - // 状态设置为空箱 - json.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextId() + ""); - json.put("vehicle_code", vehicle_code); - json.put("vehicle_uuid", vehicle_code); - json.put("extdevice_code", wcsdevice_code); - json.put("vehicle_status", "01"); - json.put("vehicle_code", vehicle_code); - // json.put("vehicle_uuid", vehiobj.optString("vehicle_uuid")); - - json.put("material_uuid", ""); - json.put("material_code", ""); - json.put("material_spec", ""); - json.put("material_name", ""); - json.put("weight", "0"); - json.put("quantity", "0"); - - json.put("workprocedure_uuid", ""); - json.put("workprocedure_code", ""); - json.put("workprocedure_name", ""); - json.put("create_time", DateUtil.now()); - ivtTab.insert(json); - - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - } - - @Override - public Map agvInBoxExceptionQuery(Map jsonObject) { - String vehicle_code = jsonObject.get("vehicle_code"); - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - String where = "next_point_code = '" + wcsdevice_code + "' and vehicle_code = '" + vehicle_code - + "' and task_status <> '06'"; - if (StrUtil.isEmpty(vehicle_code)) { - where = "next_point_code = '" + wcsdevice_code + "' and task_status <> '06'"; - } - - JSONArray arr = instructTab.query(where).getResultJSONArray(0); - JSONArray result = new JSONArray(); - for (int i = 0; i < arr.size(); i++) { - JSONObject row = arr.getJSONObject(i); - JSONObject json = new JSONObject(); - json.put("instruct_uuid", row.getString("instruct_uuid")); - json.put("instructorder_no", row.getString("instructorder_no")); - json.put("wcsdevice_code", row.getString("next_point_code")); - json.put("start_point_code", row.getString("start_point_code")); - json.put("nextpoint_code", row.getString("next_point_code")); - json.put("nextpoint_code2", row.getString("next_point_code")); - result.add(json); - } - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map agvInBoxExceptionConfirm(Map jsonObject) { - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - String instruct_uuid = jsonObject.get("instruct_uuid"); - String extdevice_code = jsonObject.get("wcsdevice_code"); - String empty_vehicle_code = jsonObject.get("empty_vehicle_code"); - String full_vehicle_code = jsonObject.get("full_vehicle_code"); - // 缓存线位置表【ST_cacheLine_Position】 - WQLObject positionTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - JSONObject srb = new JSONObject(); - - /* - * JSONObject emptyObj = positionTab - * .query("is_active = '1' and is_delete = '0' and vehicle_code = '" + - * empty_vehicle_code + "'") .uniqueResult(0); - * - * // 判断箱子是否存在 if (emptyObj == null) { srb.setFailure(); srb.setDesc("条码【" + - * empty_vehicle_code + "】不存在,操作失败"); return srb; } JSONObject fullObj = - * positionTab .query("is_active = '1' and is_delete = '0' and vehicle_code = '" - * + full_vehicle_code + "'") .uniqueResult(0); // 判断箱子是否存在 if (fullObj == null) - * { srb.setFailure(); srb.setDesc("条码【" + full_vehicle_code + "】不存在,操作失败"); - * return srb; } - */ - - JSONObject instObj = instructTab.query("instruct_uuid = '" + instruct_uuid + "'").uniqueResult(0); - - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - WQLObject ivtTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - - // TODO: 2022/5/27 - /*AgvTwoInst inst = new AgvTwoInst(); - instObj.put("inboxtxm", full_vehicle_code); - instObj.put("outboxtxm", empty_vehicle_code); - inst.updateInstStatus(instObj, "1"); - inst.updateInstStatus(instObj, "2");*/ - - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map agvOutBoxExceptionQuery(Map jsonObject) { - String vehicle_code = jsonObject.get("vehicle_code"); - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - JSONObject srb = new JSONObject(); - JSONArray arr = new JSONArray(); - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - if (StrUtil.isEmpty(vehicle_code)) { - arr = instructTab.query("start_point_code = '" + wcsdevice_code + "' and task_status <> '06'") - .getResultJSONArray(0); - } else { - arr = instructTab.query("start_point_code = '" + wcsdevice_code + "' and vehicle_code = '" - + vehicle_code + "' and task_status <> '06'").getResultJSONArray(0); - } - - JSONArray result = new JSONArray(); - for (int i = 0; i < arr.size(); i++) { - JSONObject row = arr.getJSONObject(i); - JSONObject json = new JSONObject(); - json.put("instruct_uuid", row.getString("instruct_uuid")); - json.put("instructorder_no", row.getString("instructorder_no")); - json.put("wcsdevice_code", row.getString("start_point_code")); - json.put("vehicle_code", row.getString("outvehicle_code")); - json.put("start_point_code", row.getString("start_point_code")); - json.put("nextpoint_code", row.getString("next_point_code")); - json.put("nextpoint_code2", row.getString("next_point_code")); - result.add(json); - } - - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map agvOutBoxExceptionConfirm(Map jsonObject) { - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - String instruct_uuid = jsonObject.get("instruct_uuid"); - String vehicle_code = jsonObject.get("vehicle_code"); - String extdevice_code = jsonObject.get("wcsdevice_code"); - JSONObject instObj = instructTab.query("instruct_uuid = '" + instruct_uuid + "'").uniqueResult(0); - -// TODO: 2022/5/27 - /* AgvTwoInst inst = new AgvTwoInst(); - // 出箱的时候入箱码和出箱码相同 - instObj.put("inboxtxm", vehicle_code); - instObj.put("outboxtxm", vehicle_code); - inst.updateInstStatus(instObj, "1"); - inst.updateInstStatus(instObj, "2"); -*/ - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - } - - @Override - public Map cacheLineOutBoxExceptionQuery(Map jsonObject) { - String agv_no = jsonObject.get("agv_no"); - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - JSONArray arr = instructTab.query("(start_point_code = '" + wcsdevice_code + "' or next_point_code = '" - + wcsdevice_code + "') and task_status <> '06' and car_no like '%" + agv_no + "%'") - .getResultJSONArray(0); - JSONArray result = new JSONArray(); - for (int i = 0; i < arr.size(); i++) { - JSONObject row = arr.getJSONObject(i); - JSONObject json = new JSONObject(); - json.put("instruct_uuid", row.getString("instruct_uuid")); - json.put("instructorder_no", row.getString("instructorder_no")); - json.put("wcsdevice_code", row.getString("start_point_code")); - json.put("vehicle_code", "0"); - json.put("start_point_code", row.getString("start_point_code")); - json.put("nextpoint_code", row.getString("next_point_code")); - json.put("nextpoint_code2", row.getString("next_point_code")); - result.add(json); - } - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - } - - @Override - public Map cacheLineOutBoxExceptionConfirm(Map jsonObject) { - WQLObject instructTab = WQLObject.getWQLObject("sch_base_task"); - String instruct_uuid = jsonObject.get("instruct_uuid"); - JSONObject instObj = instructTab.query("instruct_uuid = '" + instruct_uuid + "'").uniqueResult(0); - if (instObj != null) { - instObj.put("task_type", "06"); - instObj.put("instructfinish_mode", "02"); - instObj.put("update_time", DateUtil.now()); - instObj.put("remark", "缓存线出箱异常确认完成!"); - instructTab.update(instObj); - // 把所以来该缓存线的AGV指令都完成掉 - if (instObj.getString("next_point_code").contains("HCX")) { - HashMap map = new HashMap<>(); - map.put("task_type", "06"); - map.put("instructfinish_mode", "02"); - map.put("update_time", DateUtil.now()); - map.put("remark", "缓存线出箱异常确认完成!"); - instructTab.update(map, "next_point_code = '" + instObj.getString("next_point_code") - + "' and task_type <> '06'"); - } - - // 把所以从该缓存线出AGV指令都完成掉 - if (instObj.getString("start_point_code").contains("HCX")) { - HashMap map = new HashMap<>(); - map.put("task_type", "06"); - map.put("instructfinish_mode", "02"); - map.put("update_time", DateUtil.now()); - map.put("remark", "缓存线出箱异常确认完成!"); - instructTab.update(map, "start_point_code = '" + instObj.getString("start_point_code") - + "' and task_type <> '06'"); - } - - // 得到异常的载具号 - String vehicle_codeStr = instObj.getString("vehicle_code"); - String[] arr = vehicle_codeStr.split(","); - // 缓存线载具物料表【IF_cacheLine_VehileMaterial】 - WQLObject ivtTab = WQLObject.getWQLObject("IF_cacheLine_VehileMaterial"); - for (String vehicle_code : arr) { - HashMap map = new HashMap<>(); - // 异常 - map.put("vehicle_status", "03"); - ivtTab.update(map, "vehicle_code = '" + vehicle_code + "'"); - } - } - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map materialQuery(Map jsonObject) { - HashMap map = new HashMap<>(); - map.put("flag", "6"); - map.put("searchBar", "%" + jsonObject.get("search_bar") + "%"); - JSONArray arr = WQL.getWO("QWCS_CACHE_004").addParamMap(map).process().getResultJSONArray(0); - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map setBlankPos(Map jsonObject) { - // 层数 - String layer_num = jsonObject.get("layer_num"); - // 顺序号 - String seat_order_num = jsonObject.get("seat_order_num"); - // 缓存线编码 - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - // 缓存线位置表【ST_cacheLine_Position】 - - WQLObject ivtTab = WQLObject.getWQLObject("ST_cacheLine_Position"); - JSONObject json = ivtTab.query("layer_num = " + layer_num + " and extdevice_code like '%" + wcsdevice_code - + "%' and order_no = " + seat_order_num + "").uniqueResult(0); - // 状态设置为空位 - json.put("is_blank", "1"); - json.put("vehicle_uuid", ""); - json.put("vehicle_code", ""); - ivtTab.update(json); - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map instStatusQuery(Map jsonObject) { - HashMap map = new HashMap<>(); - map.put("flag", "7"); - JSONArray arr = WQL.getWO("QWCS_CACHE_004").addParamMap(map).process().getResultJSONArray(0); - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("result", arr); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map cacheLineExcepOpt(Map jsonObject) { - // 缓存线编码 - String wcsdevice_code = jsonObject.get("wcsdevice_code"); - // 01-暂停、02-启动 - String opt_type = jsonObject.get("opt_type"); - System.out.println("操作类型:" + opt_type); - - Object[] objs = new Object[2]; - objs[0] = wcsdevice_code; - // 类型:恢复是0,暂停是1 - String type = "1"; - if ("02".equals(opt_type)) { - type = "0"; - } - objs[1] = type; - // TODO: 2022/5/27 - /*// 下发给wcs - uWcsSchedule.notifyWcs(99, 1000, objs);*/ - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map instOperation(Map jsonObject) { - return null; - } - - @Override - public Map pourMaterial(Map jsonObject) { - // 指令标识 - String instruct_uuid = jsonObject.get("instruct_uuid"); - // 指令点位表【sch_base_task】 - JSONObject instObj = WQLObject.getWQLObject("sch_base_task") - .query("instruct_uuid = '" + instruct_uuid + "'").uniqueResult(0); - int putquantity = instObj.getInteger("quantity"); - String producer = instObj.getString("next_point_code"); - Object[] objs = new Object[2]; - objs[0] = producer; - objs[1] = putquantity; - // TODO: 2022/5/27 - // 下发给wcs - /* uWcsSchedule.notifyWcs(99, 3002, objs);*/ - - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - - } - - @Override - public Map instPageQuery(Map jsonObject) { - String nPageStart = jsonObject.get("nPageStart"); - String nPageRecordNum = jsonObject.get("nPageRecordNum"); - String date_begin = jsonObject.get("start_date"); - String date_end = jsonObject.get("end_date"); - if (StrUtil.isEmpty(date_begin) || date_begin.equals("null")) { - date_begin = ""; - } - if (StrUtil.isEmpty(date_end) || date_end.equals("null")) { - date_end = ""; - } - HashMap map = new HashMap<>(); - map.put("agv_no", jsonObject.get("agv_num")); - map.put("instructoperate_num", jsonObject.get("inst_num")); - map.put("vehicle_code", jsonObject.get("vehicle_code")); - map.put("startwcsdevice_name", jsonObject.get("start_point")); - map.put("nextwcsdevice_name", jsonObject.get("end_point")); - map.put("date_begin", date_begin); - map.put("date_end", date_end); - - String sql = ""; - // 指令状态未完成 - if ("90".equals(jsonObject.get("status"))) { - sql = " inst.task_type <> '06' "; - } - if (StrUtil.isNotEmpty(jsonObject.get("status")) && !"90".equals(jsonObject.get("status"))) { - sql = " inst.task_type = '" + jsonObject.get("status") + "'"; - } - map.put("sql", sql); - // AGV双工 - map.put("instruct_type", "01"); - JSONObject param = new JSONObject(); - int page = Integer.valueOf(jsonObject.get("page")); - int size = Integer.valueOf(jsonObject.get("size")); - Pageable pageable = PageRequest.of(page - 1, size); - - - JSONObject result = WQL.getWO("QWMS_WCS7").addParamMap(map).pageQuery(WqlUtil.getHttpContext(pageable), ""); - JSONArray results = result.getJSONArray("rows"); - JSONObject srb = new JSONObject(); - srb.put("code", 1); - srb.put("desc", "操作成功!"); - return srb; - - - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/MateriorecordServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/MateriorecordServiceImpl.java deleted file mode 100644 index 9d4e675..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/MateriorecordServiceImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.nl.wms.cacheline.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.utils.SecurityUtils; -import org.nl.wms.cacheline.service.MateriorecordService; -import org.nl.wms.cacheline.service.dto.MateriorecordDto; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** -* @description 服务实现 -* @author qinx -* @date 2022-05-26 -**/ -@Service -@RequiredArgsConstructor -@Slf4j -public class MateriorecordServiceImpl implements MateriorecordService { - - @Override - public Map queryAll(Map whereJson, Pageable page){ - HashMap map = new HashMap(); - map.put("flag","3"); - map.put("extdevice_code",whereJson.get("extdevice_code")); - map.put("search",whereJson.get("search")); - JSONObject jsonObject = WQL.getWO("cacheLine_VEHICLE_001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "vehicle_code"); - return jsonObject; - } - - @Override - public List queryAll(Map whereJson){ - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(MateriorecordDto.class); - return null; - } - - @Override - public MateriorecordDto findById(Long record_uuid) { - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - JSONObject json = wo.query("record_uuid = '" + record_uuid + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( MateriorecordDto.class); - } - return null; - } - - @Override - public MateriorecordDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( MateriorecordDto.class); - } - return null; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(MateriorecordDto dto) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - dto.setRecord_uuid(IdUtil.getSnowflake(1, 1).nextId()); - dto.setUpdate_time(now); - dto.setCreate_time(now); - String extdevice_code =dto.getExtdevice_code(); - JSONObject postionObj = WQLObject.getWQLObject("ST_cacheLine_Position").query("extdevice_code='" + extdevice_code + "'").uniqueResult(0); - Long device_uuid = Long.valueOf(postionObj.getString("device_uuid")); - String device_name = postionObj.getString("device_name"); - dto.setDevice_uuid(device_uuid); - dto.setDevice_name(device_name); - - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(MateriorecordDto dto) { - MateriorecordDto entity = this.findById(dto.getRecord_uuid()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String extdevice_code =dto.getExtdevice_code(); - JSONObject postionObj = WQLObject.getWQLObject("ST_cacheLine_Position").query("extdevice_code='" + extdevice_code + "'").uniqueResult(0); - Long device_uuid = Long.valueOf(postionObj.getString("device_uuid")); - String device_name = postionObj.getString("device_name"); - dto.setDevice_uuid(device_uuid); - dto.setDevice_name(device_name); - String now = DateUtil.now(); - dto.setUpdate_time(now); - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_materiorecord"); - for (Long record_uuid: ids) { - JSONObject param = new JSONObject(); - param.put("record_uuid", String.valueOf(record_uuid)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehicleServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehicleServiceImpl.java deleted file mode 100644 index f07bfad..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehicleServiceImpl.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.nl.wms.cacheline.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.utils.SecurityUtils; -import org.nl.wms.cacheline.service.VehicleService; -import org.nl.wms.cacheline.service.dto.VehicleDto; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author qinx - * @description 服务实现 - * @date 2022-05-25 - **/ -@Service -@RequiredArgsConstructor -@Slf4j -public class VehicleServiceImpl implements VehicleService { - - @Override - public Map queryAll(Map whereJson, Pageable page) { - HashMap map = new HashMap(); - map.put("flag","1"); - map.put("search",whereJson.get("search")); - JSONObject jsonObject = WQL.getWO("cacheLine_VEHICLE_001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "vehicle_code"); - return jsonObject; - } - - @Override - public List queryAll(Map whereJson) { - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(VehicleDto.class); - return null; - } - - @Override - public VehicleDto findById(Long vehicle_uuid) { - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - JSONObject json = wo.query("vehicle_uuid = '" + vehicle_uuid + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(VehicleDto.class); - } - return null; - } - - @Override - public VehicleDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(VehicleDto.class); - } - return null; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(VehicleDto dto) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - String vehicle_code = dto.getVehicle_code(); - JSONObject vehicleObj = WQLObject.getWQLObject("st_cacheLine_vehicle").query("vehicle_code='" + vehicle_code + "' and is_delete='0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(vehicleObj)) { - throw new BadRequestException("载具编码为'" + vehicle_code + "'已经存在!"); - } - dto.setVehicle_uuid(IdUtil.getSnowflake(1, 1).nextId()); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(VehicleDto dto) { - VehicleDto entity = this.findById(dto.getVehicle_uuid()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String vehicle_code = dto.getVehicle_code(); - JSONObject vehicleObj = WQLObject.getWQLObject("st_cacheLine_vehicle").query("vehicle_code='" + vehicle_code + "' and is_delete='0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(vehicleObj)) { - throw new BadRequestException("载具编码为'" + vehicle_code + "'已经存在!"); - } - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("st_cacheLine_vehicle"); - for (Long vehicle_uuid : ids) { - JSONObject param = new JSONObject(); - param.put("vehicle_uuid", String.valueOf(vehicle_uuid)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void changeActive(JSONObject json) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - String is_active = "1"; - if (StrUtil.equals("1", json.getString("is_active"))) { - is_active = "0"; - } - json.put("is_active", is_active); - json.put("update_optid", currentUserId); - json.put("update_optname", nickName); - json.put("update_time", now); - WQLObject.getWQLObject("st_cacheLine_vehicle").update(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void changePrint(JSONObject json) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - String is_print = "1"; - if (StrUtil.equals("1", json.getString("is_print"))) { - is_print = "0"; - } - json.put("is_print", is_print); - json.put("update_optid", currentUserId); - json.put("update_optname", nickName); - json.put("update_time", now); - WQLObject.getWQLObject("st_cacheLine_vehicle").update(json); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehilematerialServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehilematerialServiceImpl.java deleted file mode 100644 index ba415f2..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/service/impl/VehilematerialServiceImpl.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.nl.wms.cacheline.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.utils.SecurityUtils; - -import org.nl.wms.cacheline.service.VehilematerialService; -import org.nl.wms.cacheline.service.dto.VehilematerialDto; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author qinx - * @description 服务实现 - * @date 2022-05-25 - **/ -@Service -@RequiredArgsConstructor -@Slf4j -public class VehilematerialServiceImpl implements VehilematerialService { - - @Override - public Map queryAll(Map whereJson, Pageable page) { - HashMap map = new HashMap(); - map.put("extdevice_code", whereJson.get("extdevice_code")); - map.put("flag", "4"); - map.put("search", whereJson.get("search")); - JSONObject jsonObject = WQL.getWO("cacheLine_VEHICLE_001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "extdevice_code,position_code"); - return jsonObject; - } - - @Override - public List queryAll(Map whereJson) { - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(VehilematerialDto.class); - return null; - } - - @Override - public VehilematerialDto findById(Long vehmaterial_uuid) { - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - JSONObject json = wo.query("vehmaterial_uuid = '" + vehmaterial_uuid + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(VehilematerialDto.class); - } - return null; - } - - @Override - public VehilematerialDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(VehilematerialDto.class); - } - return null; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(VehilematerialDto dto) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - dto.setVehmaterial_uuid(IdUtil.getSnowflake(1, 1).nextId()); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(VehilematerialDto dto) { - Long vehmaterial_uuid = dto.getVehmaterial_uuid(); - Long vehicle_uuid = dto.getVehicle_uuid(); - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - //假如有记录则更新 没记录则插入 - if (vehmaterial_uuid != null && StrUtil.isNotEmpty(String.valueOf(vehmaterial_uuid))) { - VehilematerialDto entity = this.findById(dto.getVehmaterial_uuid()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - dto.setUpdate_time(now); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - //假如载具为空则删除 - if (vehicle_uuid != null && StrUtil.isNotEmpty(String.valueOf(vehicle_uuid))) { - wo.delete(json); - } - wo.update(json); - } else { - //插入之前 删除该位置托盘的物料的记录 - if (vehicle_uuid != null && StrUtil.isNotEmpty(String.valueOf(vehicle_uuid))) { - wo.delete("vehicle_uuid='"+vehicle_uuid+"'"); - } - this.create(dto); - } - - //更新缓存线位置表 - Long position_uuid = dto.getPosition_uuid(); - String vehicle_code = dto.getVehicle_code(); - JSONObject postionObj = WQLObject.getWQLObject("ST_cacheLine_Position").query("position_uuid='" + position_uuid + "'").uniqueResult(0); - postionObj.put("vehicle_code", vehicle_code); - postionObj.put("vehicle_uuid", vehicle_uuid); - WQLObject.getWQLObject("ST_cacheLine_Position").update(postionObj); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("if_cacheLine_vehilematerial"); - for (Long vehmaterial_uuid : ids) { - JSONObject param = new JSONObject(); - param.put("vehmaterial_uuid", String.valueOf(vehmaterial_uuid)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/CACHELINE_VEHICLE_001.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/CACHELINE_VEHICLE_001.wql deleted file mode 100644 index dccb620..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/CACHELINE_VEHICLE_001.wql +++ /dev/null @@ -1,174 +0,0 @@ -[交易说明] - 交易名: 载具扩展属性设置分页查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.search TYPEAS s_string - 输入.extdevice_code TYPEAS s_string - - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - * - FROM - st_cacheline_vehicle vehicle - WHERE - 1=1 - OPTION 输入.search <> "" - vehicle.vehicle_code like "%" 输入.search "%" - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - IF 输入.flag = "2" - PAGEQUERY - SELECT - position.position_uuid, - position.position_code, - position.position_name, - position.positionOrder_no, - position.device_uuid, - position.extdevice_code, - position.device_name, - position.layer_num, - position.priority_layer_no, - position.order_no, - position.vehicle_uuid, - position.vehicle_code, - vehicle.vehmaterial_uuid, - vehicle.vehicle_status, - vehicle.err_type, - vehicle.produceorder_uuid, - vehicle.produceorder_code, - vehicle.workprocedure_uuid, - vehicle.workprocedure_code, - vehicle.workprocedure_name, - vehicle.material_uuid, - vehicle.quantity, - vehicle.weight, - vehicle.create_time, - vehicle.update_time - FROM - st_cacheline_position position - LEFT JOIN IF_CacheLine_VehileMaterial vehicle ON vehicle.vehicle_uuid = position.vehicle_uuid - where - 1=1 - OPTION 输入.search <> "" - ( position.position_name like "%" 输入.search "%" - or position.position_code like "%" 输入.search "%" - ) - ENDOPTION - OPTION 输入.extdevice_code <> "" - position.extdevice_code = 输入.extdevice_code - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - IF 输入.flag = "3" - PAGEQUERY - SELECT - record.*, - material.material_id, - material.material_code, - material.material_name, - material.material_spec, - workprocedure.workprocedure_id, - workprocedure.workprocedure_code, - workprocedure.workprocedure_name - FROM - IF_CacheLine_MaterIORecord record - LEFT JOIN md_me_materialbase material ON material.material_id = record.material_uuid - LEFT JOIN pdm_bi_workprocedure workprocedure ON workprocedure.workprocedure_id = record.workprocedure_uuid - WHERE - 1 =1 - OPTION 输入.search <> "" - record.vehicle_code like "%" 输入.search "%" - ENDOPTION - OPTION 输入.extdevice_code <> "" - cacheLine.extdevice_code = 输入.extdevice_code - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - IF 输入.flag = "4" - PAGEQUERY - SELECT - position.position_uuid, - position.position_code, - position.position_name, - position.positionOrder_no, - position.device_uuid, - position.extdevice_code, - position.device_name, - position.layer_num, - position.priority_layer_no, - position.order_no, - position.vehicle_uuid, - position.vehicle_code, - vehicle.vehmaterial_uuid, - vehicle.vehicle_status, - vehicle.err_type, - vehicle.produceorder_uuid, - vehicle.produceorder_code, - vehicle.workprocedure_uuid, - vehicle.workprocedure_code, - vehicle.workprocedure_name, - vehicle.material_uuid, - vehicle.quantity, - vehicle.weight, - vehicle.create_time, - vehicle.update_time - FROM - st_cacheline_position position - LEFT JOIN IF_CacheLine_VehileMaterial vehicle ON vehicle.vehicle_uuid = position.vehicle_uuid - where - 1=1 - OPTION 输入.search <> "" - ( position.position_name like "%" 输入.search "%" - or position.position_code like "%" 输入.search "%" - ) - ENDOPTION - OPTION 输入.extdevice_code <> "" - position.extdevice_code = 输入.extdevice_code - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QACS_CACHE_005.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QACS_CACHE_005.wql deleted file mode 100644 index 2dcb923..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QACS_CACHE_005.wql +++ /dev/null @@ -1,74 +0,0 @@ -[交易说明] - 交易名: Acs交互 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.produceorder_uuid TYPEAS s_string - 输入.material_uuid TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - -IF 输入.flag = "1" - QUERY - SELECT - * - FROM - ST_CacheLine_Position position - LEFT JOIN IF_CacheLine_VehileMaterial vehicle ON position.vehicle_uuid = vehicle.vehicle_uuid - WHERE - vehicle.vehicle_status = '01' - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "2" - QUERY - SELECT - * - FROM - ST_CacheLine_Position position - LEFT JOIN IF_CacheLine_VehileMaterial vehicle ON position.vehicle_uuid = vehicle.vehicle_uuid - WHERE - vehicle.vehicle_status = '02' - OPTION 输入.produceorder_uuid <> "" - vehicle.produceorder_uuid=输入.produceorder_uuid - ENDOPTION - OPTION 输入.material_uuid <> "" - vehicle.material_uuid=输入.material_uuid - ENDOPTION - ENDSELECT - ENDQUERY -ENDIF - diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QWCS_CACHE_004.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QWCS_CACHE_004.wql deleted file mode 100644 index e6f9081..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/cacheline/wql/QWCS_CACHE_004.wql +++ /dev/null @@ -1,194 +0,0 @@ -[交易说明] - 交易名: 查找缺料的生产中的设备 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.extdevice_code TYPEAS s_string - 输入.searchBar TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - -IF 输入.flag = "1" - QUERY - SELECT - material_spec as label , - material_spec as value - FROM - md_me_materialbase mb - LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id - LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mb.base_unit_id - WHERE - mb.is_delete = '0' - AND 1 = 1 - AND class.class_id IN ( '1528555445302726656', '1528555443906023424', '1528555445080428544' ) - GROUP BY - material_spec - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "2" - QUERY - SELECT - workprocedure_code as value, - workprocedure_name as label - FROM - PDM_BI_WorkProcedure - WHERE 1=1 - Order BY - workprocedure_code, - workprocedure_name - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "3" - QUERY - SELECT - device_uuid, - extdevice_code AS wcsdevice_code, - device_name, - vehicle_code, - workprocedure_uuid, - workprocedure_code, - workprocedure_name, - material_uuid, - material_code, - material_name, - material_spec, - quantity, - weight, - layer_num, - order_no AS seat_order_num, - vehicle_status as status, - err_type - FROM - IF_CacheLine_Ivt - where 1=1 - OPTION 输入.extdevice_code <> "" - extdevice_code=输入.extdevice_code - ENDOPTION - order by layer_num desc,order_no - ENDSELECT - ENDQUERY -ENDIF - - -IF 输入.flag = "4" - QUERY - SELECT - semimanufactures_uuid AS material_uuid, - semimanufactures_code AS material_code, - semimanufactures_name AS material_name, - semimanufactures_spec AS material_spec, - p.sysdic_name AS deviceprocess_seriesname - FROM - PDM_BI_WorkshopMaterialCorr c - LEFT JOIN PF_PB_SysDicInfo p ON c.materialprocess_series = p.sysdic_code AND p.sysdic_type = 'IF_WCS_DEVICESERIES' - where 1=1 - OPTION 输入.searchBar <> "" - ( c.semimanufactures_code LIKE 输入.searchBar or c.semimanufactures_code LIKE 输入.searchBar or - c.semimanufactures_code LIKE 输入.searchBar ) - ENDOPTION - GROUP BY - semimanufactures_uuid, - semimanufactures_code, - semimanufactures_name, - semimanufactures_spec, - p.sysdic_name - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "5" - QUERY - SELECT - cacheline.device_uuid, - cacheline.extdevice_code as wcsdevice_code, - cacheline.device_name - FROM - st_cacheline_position cacheline - WHERE - 1 = 1 - - GROUP BY - device_uuid, - device_uuid, - extdevice_code - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "6" - QUERY - SELECT - mb.material_id, - mb.material_code, - mb.material_name, - mb.material_spec, - class_code, - class_name deviceprocess_seriesname - FROM - md_me_materialbase mb - LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id - WHERE - mb.is_delete = '0' - AND 1 = 1 - AND class.class_id IN ( '1528555445302726656', '1528555443906023424', '1528555445080428544' ) - OPTION 输入.searchBar <> "" - ( mb.material_code LIKE 输入.searchBar or mb.material_name LIKE 输入.searchBar ) - ENDOPTION - GROUP BY - material_spec - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "7" - QUERY - SELECT - det.`value` as value, - det.label as label - FROM - sys_dict dict - LEFT JOIN sys_dict_detail det ON det.dict_id = dict.dict_id - WHERE - 1 = 1 - AND dict.`name` = 'task_status' - GROUP BY - material_spec - ENDSELECT - ENDQUERY -ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/autoTask/AutoAgvStatus.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/autoTask/AutoAgvStatus.java deleted file mode 100644 index d689b2e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/autoTask/AutoAgvStatus.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.nl.wms.ext.bigScreen.autoTask; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.nl.wql.core.bean.WQLObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.stereotype.Component; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -@Slf4j -@Component -public class AutoAgvStatus { - - @Autowired - private MongoTemplate mongoTemplate; - - public void run() { - - WQLObject agv_status = WQLObject.getWQLObject("DS_AGV_AgvStatus"); - WQLObject agv_point = WQLObject.getWQLObject("DS_AGV_PointCoordinateRelate"); - - for (int i = 1; i <= 7; i++) { - String device_code = String.valueOf(i); - - Query query = new Query(); - query.addCriteria(Criteria.where("device_code").is(device_code)); - List avg_all = mongoTemplate.find(query, JSONObject.class, "agv_test"); - - JSONObject jsonAgv = agv_status.query("agv_code = '" + device_code + "'").uniqueResult(0); - String real_x_coor = ""; - String real_y_coor = ""; - for (JSONObject json : avg_all) { - String key = json.getString("key"); - - switch (key) { - case "pic_name" : - jsonAgv.put("pic_name",json.getString("value")); - break; - case "agv_power" : - jsonAgv.put("agv_power",json.getString("value")); - break; - case "agv_stateType" : - jsonAgv.put("agv_statetype",json.getString("value")); - break; - case "x_coordinate" : - String value = NumberUtil.div(json.getString("value"), "100").toString(); - real_x_coor = NumberUtil.round(value, 0).toString(); - break; - case "y_coordinate" : - String value2 = NumberUtil.div(json.getString("value"), "100").toString(); - real_y_coor = NumberUtil.round(value2, 0).toString(); - break; - case "error_status" : - jsonAgv.put("error_status",json.getString("value")); - break; - case "error_info" : - jsonAgv.put("error_info",json.getString("value")); - break; - case "direction_type" : - jsonAgv.put("direction_type",json.getString("value")); - break; - } - } - JSONObject jsonPoint = agv_point.query("real_x_coor = '" + real_x_coor + "' and real_y_coor = '" + real_y_coor + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonPoint)) { - jsonAgv.put("x_coordinate", jsonPoint.getString("web_x_coor")); - jsonAgv.put("y_coordinate", jsonPoint.getString("web_y_coor")); - } - jsonAgv.put("update_datetime", DateUtil.now()); - agv_status.update(jsonAgv); - } - } - - public static void main(String[] args) { - - ArrayList objects = new ArrayList<>(); - objects.add(null); - LinkedList objects1 = new LinkedList<>(); - objects1.add(4); - objects1.add(4.4); - objects1.add(null); - - ArrayDeque objects2 = new ArrayDeque<>(); - System.out.println(objects1); - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/AgvBigScreenController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/AgvBigScreenController.java deleted file mode 100644 index d475c58..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/AgvBigScreenController.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.nl.wms.ext.bigScreen.rest; - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.ext.bigScreen.service.AgvBigScreenService; -import org.nl.wms.ext.bigScreen.service.BigScreenService; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - * @author liuxy - * @date 2022-07-27 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "AGV监控中心") -@RequestMapping("/api/agvBigScreen") -@Slf4j -@CrossOrigin -public class AgvBigScreenController { - - private final AgvBigScreenService agvBigScreenService; - - @PostMapping("/getTask") - @Log("查询任务") - @ApiOperation("查询任务") - public ResponseEntity getData(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(agvBigScreenService.getTask(whereJson), HttpStatus.OK); - } - - @PostMapping("/getAgvMsg") - @Log("查询车辆信息") - @ApiOperation("查询车辆信息") - public ResponseEntity getAgvMsg(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(agvBigScreenService.getAgvMsg(whereJson), HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/BigScreenController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/BigScreenController.java deleted file mode 100644 index 1fd068e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/BigScreenController.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.nl.wms.ext.bigScreen.rest; - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.ext.bigScreen.service.BigScreenService; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - * @author ludj - * @date 2021-07-21 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "监控大屏") -@RequestMapping("/api/bigScreenScreen") -@Slf4j -@CrossOrigin -public class BigScreenController { - private final BigScreenService bigScreenService; - @PostMapping("/zk") - @Log("查询中控室监控大屏") - @ApiOperation("查询中控室监控大屏") - public ResponseEntity getData(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(bigScreenService.getData(whereJson), HttpStatus.OK); - } - @PostMapping("/query3Dcartoon") - @Log("查询三维动画大屏") - @ApiOperation("查询三维动画大屏") - public ResponseEntity query3Dcartoon(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(bigScreenService.query3Dcartoon(whereJson), HttpStatus.OK); - } - - @PostMapping("/workScreen") - @Log("查询工序看板") - @ApiOperation("查询工序看板") - public ResponseEntity workScreen(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(bigScreenService.workScreen(whereJson), HttpStatus.OK); - } - - - @GetMapping("/queryInfo") - @Log("查询中控室监控大屏手动设置数据") - @ApiOperation("查询中控室监控大屏手动设置数据") - public ResponseEntity queryInfo(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(bigScreenService.queryInfo(whereJson,page), HttpStatus.OK); - } - - @PostMapping("/add") - @Log("手动添加监控大屏数据") - @ApiOperation("手动添加监控大屏数据") - public ResponseEntity add(@RequestBody JSONObject param) throws Exception { - bigScreenService.add(param); - return new ResponseEntity<>( HttpStatus.OK); - } - - - @PutMapping("/edit") - @Log("手动修改监控大屏数据") - @ApiOperation("手动修改监控大屏数据") - public ResponseEntity edit(@RequestBody JSONObject param) throws Exception { - bigScreenService.edit(param); - return new ResponseEntity<>( HttpStatus.OK); - } - - @DeleteMapping("/del") - @Log("手动删除监控大屏数据") - @ApiOperation("手动删除监控大屏数据") - public ResponseEntity del(@RequestBody Long[] ids) throws Exception { - bigScreenService.del(ids); - return new ResponseEntity<>( HttpStatus.OK); - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java deleted file mode 100644 index a636c0b..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/DeviceScreenController.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.nl.wms.ext.bigScreen.rest; - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.ext.bigScreen.service.DeviceScreenService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@Api(tags = "设备监控大屏") -@RequestMapping("/api/deviceScreen") -@Slf4j -public class DeviceScreenController { - private final DeviceScreenService deviceScreenService; - - @PostMapping("/deviceStatus") - @Log("设备实时状态") - @ApiOperation("设备实时状态") - public ResponseEntity getData(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceStatus(whereJson), HttpStatus.OK); - } - - @PostMapping("/oeeAndTeep") - @Log("设备综合效率OEE&产能利用效率TEEP") - @ApiOperation("设备综合效率OEE&产能利用效率TEEP") - public ResponseEntity oeeAndTeep(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.oeeAndTeep(whereJson), HttpStatus.OK); - } - - @PostMapping("/queryDeviceByWork") - @Log("运行设备大类产能比") - @ApiOperation("运行设备大类产能比") - public ResponseEntity queryDeviceByWork(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.queryDeviceByWork(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceErrorNum") - @Log("设备TOP10故障次数") - @ApiOperation("设备TOP10故障次数") - public ResponseEntity deviceErrorNum(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceErrorNum(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceManage") - @Log("设备管理") - @ApiOperation("设备管理") - public ResponseEntity deviceManage(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceManage(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceCensus") - @Log("设备综合统计") - @ApiOperation("设备综合统计") - public ResponseEntity deviceCensus(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceCensus(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceErrorInfo") - @Log("设备报警信息") - @ApiOperation("设备报警信息") - public ResponseEntity deviceErrorInfo(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceErrorInfo(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceUseRate") - @Log("设备产能利用") - @ApiOperation("设备产能利用") - public ResponseEntity deviceUseRate(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceUseRate(whereJson), HttpStatus.OK); - } - - @PostMapping("/deviceStatusList") - @Log("设备状态列表") - @ApiOperation("设备状态列表") - public ResponseEntity deviceStatusList(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.deviceStatusList(whereJson), HttpStatus.OK); - } - - @PostMapping("/errCensus") - @Log("近30天设备故障统计") - @ApiOperation("近30天设备故障统计") - public ResponseEntity errCensus(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(deviceScreenService.errCensus(whereJson), HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/ProductController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/ProductController.java deleted file mode 100644 index ed17cf3..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/rest/ProductController.java +++ /dev/null @@ -1,84 +0,0 @@ - -package org.nl.wms.ext.bigScreen.rest; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; - -import org.nl.wms.ext.bigScreen.service.ProductService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author ldjun - * @date 2021-07-26 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "大屏生产监控中心") -@RequestMapping("/api/bigscreen/product") -@Slf4j -public class ProductController { - - private final ProductService pdaBindingService; - - @PostMapping("/planReached") - @Log("计划达成") - @ApiOperation("计划达成") - public ResponseEntity planReached(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.planReached(param), HttpStatus.OK); - } - @PostMapping("/productSchedule") - @Log("今日排产生产进度跟踪") - @ApiOperation("今日排产生产进度跟踪") - public ResponseEntity productSchedule(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.productSchedule(param), HttpStatus.OK); - } - @PostMapping("/output") - @Log("今日产量") - @ApiOperation("今日产量") - public ResponseEntity output(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.output(param), HttpStatus.OK); - } - - @PostMapping("/worksectionHarvest") - @Log("近一周工段产量") - @ApiOperation("近一周工段产量") - public ResponseEntity worksectionHarvest(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.worksectionHarvest(param), HttpStatus.OK); - } - @PostMapping("/topHarvest") - @Log("今日Top10产量") - @ApiOperation("今日Top10产量") - public ResponseEntity topHarvest(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.topHarvest(param), HttpStatus.OK); - } - @PostMapping("/monthHarvest") - @Log("30天产量走势") - @ApiOperation("30天产量走势") - public ResponseEntity monthHarvest(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.monthHarvest(param), HttpStatus.OK); - } - @PostMapping("/unfinishOrder") - @Log("今日未完成订单") - @ApiOperation("今日未完成订单") - public ResponseEntity unfinishOrder(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.unfinishOrder(param), HttpStatus.OK); - } - @PostMapping("/monthOrder") - @Log("30天生产订单分布") - @ApiOperation("30天生产订单分布") - public ResponseEntity monthOrder(@RequestBody Map param) { - return new ResponseEntity<>(pdaBindingService.monthOrder(param), HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/AgvBigScreenService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/AgvBigScreenService.java deleted file mode 100644 index 10e8dff..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/AgvBigScreenService.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.wms.ext.bigScreen.service; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -public interface AgvBigScreenService { - - JSONObject getTask(JSONObject whereJson); - - JSONObject getAgvMsg(JSONObject whereJson); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/BigScreenService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/BigScreenService.java deleted file mode 100644 index 5844b89..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/BigScreenService.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nl.wms.ext.bigScreen.service; - -import com.alibaba.fastjson.JSONObject; -import org.springframework.data.domain.Pageable; - -import java.util.Map; - -/** - * 中控室大屏看板 - */ -public interface BigScreenService { - /** - * 获取监控大屏数据页面 - * - * @return - */ - public JSONObject getData(JSONObject param); - - /** - * 三维动画页面 - * - * @return - */ - public JSONObject query3Dcartoon(JSONObject param); - - /** - * 获根据不同看板编号查询不同工序看板数据 - * - * @return - */ - public JSONObject workScreen(JSONObject param); - - /** - * 获取监控大屏静态设置的数据数据页面 - * - * @return - */ - public Map queryInfo(Map whereJson, Pageable page); - - /** - * 手动添加监控大屏数据 - * @param param - */ - public void add(JSONObject param) throws Exception; - - /** - * 手动修改监控大屏数据 - * @param param - */ - public void edit(JSONObject param) throws Exception; - - /** - * 手动删除监控大屏数据 - * @param ids - */ - public void del(Long[] ids) throws Exception; - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java deleted file mode 100644 index d8254e8..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/DeviceScreenService.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.nl.wms.ext.bigScreen.service; - -import com.alibaba.fastjson.JSONObject; - -public interface DeviceScreenService { - public JSONObject deviceStatus(JSONObject param); - - public JSONObject oeeAndTeep(JSONObject param); - - public JSONObject queryDeviceByWork(JSONObject param); - - public JSONObject deviceErrorNum(JSONObject param); - - public JSONObject deviceManage(JSONObject param); - - public JSONObject deviceCensus(JSONObject param); - - public JSONObject deviceErrorInfo(JSONObject param); - - public JSONObject deviceUseRate(JSONObject param); - - public JSONObject deviceStatusList(JSONObject param); - - public JSONObject errCensus(JSONObject param); -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/ProductService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/ProductService.java deleted file mode 100644 index 4053082..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/ProductService.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.nl.wms.ext.bigScreen.service; - -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; - -import java.util.Map; - -@Service -public interface ProductService { - /** - * 计划达成 - * @param param 条件 - * @return Map - * - */ - Map planReached(@RequestBody Map param); - /** - * 今日排产生产进度跟踪 - * @param param 条件 - * @return Map - * - */ - Map productSchedule(@RequestBody Map param); - /** - * 今日产量 - * @param param 条件 - * @return Map - * - */ - Map output(@RequestBody Map param); - /** - * 近一周工段产量 - * @param param 条件 - * @return Map - * - */ - Map worksectionHarvest(@RequestBody Map param); - /** - * 今日Top10产量 - * @param param 条件 - * @return Map - * - */ - Map topHarvest(@RequestBody Map param); - /** - * 30天产量走势 - * @param param 条件 - * @return Map - * - */ - Map monthHarvest(@RequestBody Map param); - /** - * 今日未完成订单 - * @param param 条件 - * @return Map - * - */ - Map unfinishOrder(@RequestBody Map param); - /** - * 30天生产订单分布 - * @param param 条件 - * @return Map - * - */ - Map monthOrder(@RequestBody Map param); - - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/ShopinfoDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/ShopinfoDto.java deleted file mode 100644 index d5abb11..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/ShopinfoDto.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.dto; - -import lombok.Data; -import java.math.BigDecimal; -import java.io.Serializable; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; - -/** - * @description / - * @author geng by - * @date 2022-07-14 - **/ -@Data -public class ShopinfoDto implements Serializable { - - /** 标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long shop_id; - - /** 今日计划量(pcs) */ - private BigDecimal production_plan1; - - /** 今日计划量(吨) */ - private BigDecimal production_plan2; - - /** 今日入库数(吨) */ - private BigDecimal today_in2; - - /** 今日入库数(pcs) */ - private BigDecimal today_in1; - - /** 车间原材料数(吨) */ - private BigDecimal materials_num; - - /** 今日出库数(吨) */ - private BigDecimal today_out2; - - /** 今日出库数(pcs) */ - private BigDecimal today_out1; - - /** 昨日入库数(吨) */ - private BigDecimal yesterday_in2; - - /** 昨日入库数(pcs) */ - private BigDecimal yesterday_in1; - - /** 昨日出库数(吨) */ - private BigDecimal yesterday_out2; - - /** 昨日出库数(pcs) */ - private BigDecimal yesterday_out1; - - /** 车间人数 */ - private BigDecimal person_num; - - /** 车间成品数(吨) */ - private BigDecimal product_num2; - - /** 车间成品数(pcs) */ - private BigDecimal product_num1; - - /** 车间在制品数(吨) */ - private BigDecimal processed_num2; - - /** 车间在制品数(pcs) */ - private BigDecimal processed_num1; - - /** 车间工艺路线数 */ - private BigDecimal route_num; - - /** 车间设备数 */ - private BigDecimal device_num; - - /** 今日生产量(pcs) */ - private BigDecimal production_today1; - - /** 今日生产量(吨) */ - private BigDecimal production_today2; - - /** 完成率 */ - private BigDecimal completion_rate; - - /** 更新时间 */ - private String b_date; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/StockDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/StockDto.java deleted file mode 100644 index 13f4b5d..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/StockDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.dto; - -import lombok.Data; -import java.math.BigDecimal; -import java.io.Serializable; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; - -/** - * @description / - * @author geng by - * @date 2022-07-14 - **/ -@Data -public class StockDto implements Serializable { - - /** 标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long id; - - /** 日期 */ - private String date; - - /** 不足的 */ - private BigDecimal not_enough; - - /** 库容量 */ - private BigDecimal storagecapacity_weight; - - /** 库存量 */ - private BigDecimal repertory; - - /** 足够的 */ - private BigDecimal enough; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/SupplyDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/SupplyDto.java deleted file mode 100644 index e26118e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/SupplyDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.dto; - -import lombok.Data; -import java.math.BigDecimal; -import java.io.Serializable; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; - -/** - * @description / - * @author geng by - * @date 2022-07-14 - **/ -@Data -public class SupplyDto implements Serializable { - - /** 标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long id; - - /** 日期 */ - private String date; - - /** 不足的 */ - private BigDecimal not_enough; - - /** 供 */ - private BigDecimal planinventory_weight; - - /** 需 */ - private BigDecimal need_num; - - /** 足够的 */ - private BigDecimal enough; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/TodayandplannumDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/TodayandplannumDto.java deleted file mode 100644 index 05544e4..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/TodayandplannumDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.dto; - -import lombok.Data; -import java.math.BigDecimal; -import java.io.Serializable; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; - -/** - * @description / - * @author geng by - * @date 2022-07-14 - **/ -@Data -public class TodayandplannumDto implements Serializable { - - /** 标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long pro_id; - - /** 今日产量 */ - private BigDecimal num_today; - - /** 今日产品名称 */ - private String name_today; - - /** 计划数量 */ - private BigDecimal num_plan; - - private BigDecimal isBigZero = new BigDecimal(0); -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/YearinoutDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/YearinoutDto.java deleted file mode 100644 index 1cc198e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/dto/YearinoutDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.dto; - -import lombok.Data; -import java.math.BigDecimal; -import java.io.Serializable; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; - -/** - * @description / - * @author geng by - * @date 2022-07-14 - **/ -@Data -public class YearinoutDto implements Serializable { - - /** 标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long id; - - /** 车道工序数 */ - private BigDecimal process_num; - - /** 生产规格数 */ - private BigDecimal product_num; - - /** 总设计年产量(pcs) */ - private BigDecimal total_input1; - - /** 总设计年产量(吨) */ - private BigDecimal total_input2; - - /** 一期设计年产量(pcs) */ - private BigDecimal year_output1; - - /** 一期设计年产量(吨) */ - private BigDecimal year_output2; - - /** 日期 */ - private String b_date; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/AgvBigScreenServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/AgvBigScreenServiceImpl.java deleted file mode 100644 index adb6af2..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/AgvBigScreenServiceImpl.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.impl; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.mongodb.MongoClient; -import com.mongodb.client.MongoDatabase; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.wms.ext.bigScreen.service.AgvBigScreenService; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - -@Service -@RequiredArgsConstructor -@Slf4j -public class AgvBigScreenServiceImpl implements AgvBigScreenService { - - @Override - public JSONObject getTask(JSONObject whereJson) { - JSONObject result = new JSONObject(); - try { - JSONObject param = new JSONObject(); - // 1.获取总任务数 - String today = DateUtil.today(); - HashMap map = new HashMap<>(); - map.put("flag", "1"); - map.put("today", "%"+today+"%"); - JSONObject jsonAll = WQL.getWO("AGVBIGSCREEN01").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonAll)) { - param.put("all_task_number",jsonAll.getString("all_task_number")); - } else { - param.put("all_task_number","0"); - } - - // 2.获取已执行任务数 状态 = 99 - map.put("flag", "2"); - JSONObject jsonFinish = WQL.getWO("AGVBIGSCREEN01").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonFinish)) { - param.put("finish_task_number",jsonFinish.getString("finish_task_number")); - } else { - param.put("finish_task_number","0"); - } - - // 3.获取取消的任务数 是否删除 = 1 - map.put("flag", "3"); - JSONObject jsonCancel = WQL.getWO("AGVBIGSCREEN01").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonCancel)) { - param.put("cancel_task_number",jsonCancel.getString("cancel_task_number")); - } else { - param.put("cancel_task_number","0"); - } - - // 4.获取未执行任务数 状态 <> 99 - map.put("flag", "4"); - JSONObject jsonNotFinish = WQL.getWO("AGVBIGSCREEN01").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonNotFinish)) { - param.put("not_finish_task_number",jsonNotFinish.getString("not_finish_task_number")); - } else { - param.put("not_finish_task_number","0"); - } - - result.put("code", "1"); - result.put("desc", "查询成功"); - result.put("srb", param); - } catch (Exception e) { - result.put("code", "0"); - result.put("desc", "查询失败:"+e.getMessage()); - } - return result; - } - - @Override - public JSONObject getAgvMsg(JSONObject whereJson) { - JSONObject result = new JSONObject(); - try { - WQLObject agvTab = WQLObject.getWQLObject("DS_AGV_AgvStatus"); - JSONObject srb = new JSONObject(); - JSONArray errorArr = new JSONArray(); - - JSONArray agv_info = new JSONArray(); - for (int i = 1; i <= 7; i++) { - JSONObject json = new JSONObject(); - String agv_code = String.valueOf(i); - JSONObject jsonAgv = agvTab.query("agv_code = '" + agv_code + "'").uniqueResult(0); - // 1.车号 - json.put("agv_code", agv_code); - // 2.任务: 0为无任务、1为有任务 - json.put("agv_statetype", jsonAgv.getString("agv_statetype")); - // 3.电量 - json.put("agv_power", jsonAgv.getString("agv_power")); - // 4.预警: 0为正常,1为报警 - String error_status = jsonAgv.getString("error_status"); - if (StrUtil.equals(error_status,"1")) { - // 只要有一辆车有报警信息 状态则为1 - srb.put("error_status", "1"); - // 5.预警信息 - errorArr.add(jsonAgv.getString("error_info")); - } - // 6.agv名称 - json.put("agv_name", jsonAgv.getString("agv_name")); - // 7.x坐标 - json.put("x_coordinate", jsonAgv.getString("x_coordinate")); - // 8.y坐标 - json.put("y_coordinate", jsonAgv.getString("y_coordinate")); - // 9.方向类型 - json.put("direction_type", jsonAgv.getString("direction_type")); - - agv_info.add(json); - } - srb.put("agv_info_arr", agv_info); - srb.put("agv_error_arr", errorArr); - - result.put("srb", srb); - result.put("code", "1"); - result.put("desc", "查询成功"); - } catch (Exception e) { - result.put("code", "0"); - result.put("desc", "查询失败:"+e.getMessage()); - } - return result; - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/BigScreenServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/BigScreenServiceImpl.java deleted file mode 100644 index 97f3386..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/BigScreenServiceImpl.java +++ /dev/null @@ -1,307 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.MapUtils; -import org.nl.start.auto.initial.ApplicationAutoInitial; -import org.nl.wms.ext.bigScreen.service.BigScreenService; -import org.nl.wms.ext.bigScreen.service.dto.*; -import org.nl.wql.core.bean.ResultBean; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.*; - -@Service -@RequiredArgsConstructor -@Slf4j -public class BigScreenServiceImpl implements BigScreenService, ApplicationAutoInitial { - List todayandplannumDtos = new ArrayList<>(); - YearinoutDto yearinoutDtos = new YearinoutDto(); - List supplyDtos = new ArrayList<>(); - List stockDtos = new ArrayList<>(); - ShopinfoDto shopinfoDtos = new ShopinfoDto(); - @Override - public JSONObject getData(JSONObject param) { - Integer todayPcsSum = 0; - Integer planPcsSum = 0; - JSONObject map = new JSONObject(); - Random random = new Random(); - for (int i = 0; i < todayandplannumDtos.size(); i++) { - TodayandplannumDto todayandplannumDto = todayandplannumDtos.get(i); - int compareTo = todayandplannumDto.getNum_plan().compareTo(BigDecimal.ZERO); - if (compareTo != 0) { - BigDecimal num_plan = todayandplannumDto.getNum_plan(); - BigDecimal everyPro = num_plan.divide(new BigDecimal(12 * 60 * 12),4, BigDecimal.ROUND_HALF_UP); - int compare = todayandplannumDto.getIsBigZero().compareTo(new BigDecimal(1)); - int compare1 = everyPro.compareTo(new BigDecimal(1)); - if (compare1 != -1){ - todayandplannumDto.setNum_today(todayandplannumDto.getNum_today().add(everyPro).setScale(0,BigDecimal.ROUND_DOWN)); - } else { - if (compare == -1){ - todayandplannumDto.setIsBigZero(todayandplannumDto.getIsBigZero().add(everyPro)); - } else { - todayandplannumDto.setNum_today(todayandplannumDto.getNum_today().add(todayandplannumDto.getIsBigZero()).setScale(0,BigDecimal.ROUND_DOWN)); - todayandplannumDto.setIsBigZero(new BigDecimal(0)); - } - } - } - todayPcsSum += Integer.parseInt(todayandplannumDto.getNum_today().toString()); - planPcsSum += Integer.parseInt(todayandplannumDto.getNum_plan().toString()); - } - map.put("production", todayandplannumDtos); - shopinfoDtos.setProduction_today1(BigDecimal.valueOf(todayPcsSum)); - shopinfoDtos.setProduction_plan1(BigDecimal.valueOf(planPcsSum)); - shopinfoDtos.setCompletion_rate(shopinfoDtos.getProduction_today1().divide(shopinfoDtos.getProduction_plan1(), 4, BigDecimal.ROUND_HALF_UP).movePointRight(2)); - map.put("shopData", shopinfoDtos); - Object[] objects = stockDtos.toArray(); - JSONObject st = new JSONObject(); - st.put("xDate", objects); - Object[] objects1 = supplyDtos.toArray(); - JSONObject su = new JSONObject(); - su.put("xDate", objects1); - map.put("data_bar2", st); - map.put("data_bar1", su); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", map); - return returnjo; - } - - @Override - public JSONObject query3Dcartoon(JSONObject param) { - //String str="{\"desc\":\"查询成功\",\"code\":\"1\",\"result\":{\"total_input1\":\"17500.00\",\"total_input2\":\"3500.00\",\"year_output1\":\"25000.00\",\"year_output2\":\"5000.00\",\"product_num\":\"205\",\"process_num\":\"8\",\"b_date\":\"2019-05-05\"}}"; - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", yearinoutDtos); - return returnjo; - } - - @Override - public JSONObject workScreen(JSONObject param) { - String web_flag = param.getString("web_flag"); - String str = ""; - //1车间下料看板 - if ("1".equals(web_flag)) { - str = "{\"code\":\"1\",\"desc\":\"查询成功\",\"result\":{\"screenname\":\"车间下料看板\",\"arr1\":[{\"workprocedure_name\":\"盘管双斜口下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"5\",\"device_num\":\"5\"},{\"workprocedure_name\":\"直管双斜口下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"1\",\"device_num\":\"1\"},{\"workprocedure_name\":\"盘管无屑下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"1\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"3\",\"device_num\":\"4\"},{\"workprocedure_name\":\"直管无屑下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"1\",\"device_num\":\"1\"}],\"arr2\":[{\"produceschedule_date\":\"2021-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"推弯一体机加工\",\"sysdic_name\":\"弯头工段\",\"worksection_type_scode\":\"01\",\"finishproduce_qty\":\"0\",\"produce_qty\":\"4200\",\"waiting_qty\":\"4200\",\"progress_qty\":\"0\"},{\"produceschedule_date\":\"2020-09-16\",\"produceorder_code\":\"0916014\",\"workprocedure_name\":\"盘管无屑下料\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"3500\",\"produce_qty\":\"3500\",\"waiting_qty\":\"0\",\"progress_qty\":\"100\"},{\"produceschedule_date\":\"2020-12-31\",\"produceorder_code\":\"1231013\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"790\",\"produce_qty\":\"3500\",\"waiting_qty\":\"2710\",\"progress_qty\":\"23\"},{\"produceschedule_date\":\"2020-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"4225\",\"produce_qty\":\"6000\",\"waiting_qty\":\"1775\",\"progress_qty\":\"70\"}],\"jo3\":{\"sumproduce_qty\":\"0\",\"sumfinishproduce_qty\":\"0\",\"sumproducing_qty\":\"0\",\"sumweek_qty\":\"0\"},\"arr4\":[{\"device_name\":\"L28\",\"devicestatus_name\":\"急停报警\",\"update_date\":\" 00:00:30\"},{\"device_name\":\"1-L22\",\"devicestatus_name\":\"急停报警\",\"update_date\":\" 00:00:24\"},{\"device_name\":\"L22-2\",\"devicestatus_name\":\"急停报警\",\"update_date\":\" 00:00:21\"},{\"device_name\":\"L22-1\",\"devicestatus_name\":\"急停报警\",\"update_date\":\" 00:00:20\"}],\"arr5\":[[\"product\",\"昨日\",\"今日\"],[\"盘管双斜口\",\"2\",\"2\"],[\"直管双斜口\",\"1\",\"1\"],[\"盘管无屑\",\"1\",\"1\"],[\"直管无屑\",\"0\",\"0\"]],\"jo6\":{\"sumproduce_orderqty\":\"\",\"sumfinishproduce_orderqty\":\"\",\"sumproducing_orderqty\":\"\"},\"arr7\":[{\"count\":\"0\",\"date\":\"07-10\"},{\"count\":\"0\",\"date\":\"07-11\"},{\"count\":\"0\",\"date\":\"07-12\"},{\"count\":\"0\",\"date\":\"07-13\"},{\"count\":\"0\",\"date\":\"07-14\"},{\"count\":\"0\",\"date\":\"07-15\"},{\"count\":\"0\",\"date\":\"07-16\"}]}}"; - } - //2车间旋压看板 - if ("2".equals(web_flag)) { - str = "{\"code\":\"1\",\"desc\":\"查询成功\",\"result\":{\"screenname\":\"车间旋压看板\",\"arr1\":[{\"workprocedure_name\":\"旋压下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"12\",\"device_num\":\"12\"},{\"workprocedure_name\":\"滚槽/打点\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"3\",\"device_num\":\"3\"},{\"workprocedure_name\":\"直管有屑下料\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"3\",\"device_num\":\"3\"}],\"arr2\":[{\"produceschedule_date\":\"2021-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"推弯一体机加工\",\"sysdic_name\":\"弯头工段\",\"worksection_type_scode\":\"01\",\"finishproduce_qty\":\"0\",\"produce_qty\":\"4200\",\"waiting_qty\":\"4200\",\"progress_qty\":\"0\"},{\"produceschedule_date\":\"2020-09-16\",\"produceorder_code\":\"0916014\",\"workprocedure_name\":\"盘管无屑下料\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"3500\",\"produce_qty\":\"3500\",\"waiting_qty\":\"0\",\"progress_qty\":\"100\"},{\"produceschedule_date\":\"2020-12-31\",\"produceorder_code\":\"1231013\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"790\",\"produce_qty\":\"3500\",\"waiting_qty\":\"2710\",\"progress_qty\":\"23\"},{\"produceschedule_date\":\"2020-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"4225\",\"produce_qty\":\"6000\",\"waiting_qty\":\"1775\",\"progress_qty\":\"70\"}],\"jo3\":{\"sumproduce_qty\":\"0\",\"sumfinishproduce_qty\":\"0\",\"sumproducing_qty\":\"0\",\"sumweek_qty\":\"0\"},\"arr4\":[],\"arr5\":[[\"product\",\"昨日\",\"今日\"],[\"旋压下料\",\"1\",\"0\"],[\"滚槽/打点\",\"0\",\"0\"],[\"直管有屑下料\",\"0\",\"0\"]],\"jo6\":{\"sumproduce_orderqty\":\"\",\"sumfinishproduce_orderqty\":\"\",\"sumproducing_orderqty\":\"\"},\"arr7\":[{\"count\":\"0\",\"date\":\"07-10\"},{\"count\":\"0\",\"date\":\"07-11\"},{\"count\":\"0\",\"date\":\"07-12\"},{\"count\":\"0\",\"date\":\"07-13\"},{\"count\":\"0\",\"date\":\"07-14\"},{\"count\":\"0\",\"date\":\"07-15\"},{\"count\":\"0\",\"date\":\"07-16\"}]}}"; - } - //3车间三通看板 - if ("3".equals(web_flag)) { - str = "{\"code\":\"1\",\"desc\":\"查询成功\",\"result\":{\"screenname\":\"车间三通看板\",\"arr1\":[{\"workprocedure_name\":\"三通拉伸\",\"device_runningnum\":\"1\",\"device_errornum\":\"0\",\"device_waitingnum\":\"1\",\"shutdownnum\":\"7\",\"device_num\":\"9\"},{\"workprocedure_name\":\"三通一体机加工\",\"device_runningnum\":\"1\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"8\",\"device_num\":\"9\"}],\"arr2\":[{\"produceschedule_date\":\"2021-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"推弯一体机加工\",\"sysdic_name\":\"弯头工段\",\"worksection_type_scode\":\"01\",\"finishproduce_qty\":\"0\",\"produce_qty\":\"4200\",\"waiting_qty\":\"4200\",\"progress_qty\":\"0\"},{\"produceschedule_date\":\"2020-09-16\",\"produceorder_code\":\"0916014\",\"workprocedure_name\":\"盘管无屑下料\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"3500\",\"produce_qty\":\"3500\",\"waiting_qty\":\"0\",\"progress_qty\":\"100\"},{\"produceschedule_date\":\"2020-12-31\",\"produceorder_code\":\"1231013\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"790\",\"produce_qty\":\"3500\",\"waiting_qty\":\"2710\",\"progress_qty\":\"23\"},{\"produceschedule_date\":\"2020-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"4225\",\"produce_qty\":\"6000\",\"waiting_qty\":\"1775\",\"progress_qty\":\"70\"}],\"jo3\":{\"sumproduce_qty\":\"0\",\"sumfinishproduce_qty\":\"0\",\"sumproducing_qty\":\"0\",\"sumweek_qty\":\"0\"},\"arr4\":[{\"device_name\":\"L22-3\",\"devicestatus_name\":\"专机故障报警\",\"update_date\":\" 00:00:29\"},{\"device_name\":\"L22-1\",\"devicestatus_name\":\"专机故障报警\",\"update_date\":\" 00:00:29\"},{\"device_name\":\"L15-4\",\"devicestatus_name\":\"专机故障报警\",\"update_date\":\" 00:00:29\"},{\"device_name\":\"L15-3\",\"devicestatus_name\":\"专机故障报警\",\"update_date\":\" 00:00:28\"}],\"arr5\":[[\"product\",\"昨日\",\"今日\"],[\"三通\",\"4\",\"4\"],[\"三通一体机\",\"0\",\"0\"]],\"jo6\":{\"sumproduce_orderqty\":\"\",\"sumfinishproduce_orderqty\":\"\",\"sumproducing_orderqty\":\"\"},\"arr7\":[{\"count\":\"0\",\"date\":\"07-10\"},{\"count\":\"0\",\"date\":\"07-11\"},{\"count\":\"0\",\"date\":\"07-12\"},{\"count\":\"0\",\"date\":\"07-13\"},{\"count\":\"0\",\"date\":\"07-14\"},{\"count\":\"0\",\"date\":\"07-15\"},{\"count\":\"0\",\"date\":\"07-16\"}]}}"; - } - //4车间推弯看板 - if ("4".equals(web_flag)) { - str = "{\"code\":\"1\",\"desc\":\"查询成功\",\"result\":{\"screenname\":\"车间推弯看板\",\"arr1\":[{\"workprocedure_name\":\"推弯一体机加工\",\"device_runningnum\":\"3\",\"device_errornum\":\"9\",\"device_waitingnum\":\"3\",\"shutdownnum\":\"16\",\"device_num\":\"31\"}],\"arr2\":[{\"produceschedule_date\":\"2021-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"推弯一体机加工\",\"sysdic_name\":\"弯头工段\",\"worksection_type_scode\":\"01\",\"finishproduce_qty\":\"0\",\"produce_qty\":\"4200\",\"waiting_qty\":\"4200\",\"progress_qty\":\"0\"},{\"produceschedule_date\":\"2020-09-16\",\"produceorder_code\":\"0916014\",\"workprocedure_name\":\"盘管无屑下料\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"3500\",\"produce_qty\":\"3500\",\"waiting_qty\":\"0\",\"progress_qty\":\"100\"},{\"produceschedule_date\":\"2020-12-31\",\"produceorder_code\":\"1231013\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"790\",\"produce_qty\":\"3500\",\"waiting_qty\":\"2710\",\"progress_qty\":\"23\"},{\"produceschedule_date\":\"2020-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"4225\",\"produce_qty\":\"6000\",\"waiting_qty\":\"1775\",\"progress_qty\":\"70\"}],\"jo3\":{\"sumproduce_qty\":\"31952\",\"sumfinishproduce_qty\":\"108048\",\"sumproducing_qty\":\"0\",\"sumweek_qty\":\"140000\"},\"arr4\":[],\"arr5\":[[\"product\",\"昨日\",\"今日\"],[\"推弯一体机加工\",\"0\",\"0\"]],\"jo6\":{\"sumproduce_orderqty\":\"\",\"sumfinishproduce_orderqty\":\"\",\"sumproducing_orderqty\":\"\"},\"arr7\":[{\"count\":\"0\",\"date\":\"07-10\"},{\"count\":\"0\",\"date\":\"07-11\"},{\"count\":\"0\",\"date\":\"07-12\"},{\"count\":\"0\",\"date\":\"07-13\"},{\"count\":\"0\",\"date\":\"07-14\"},{\"count\":\"0\",\"date\":\"07-15\"},{\"count\":\"0\",\"date\":\"07-16\"}]}}"; - } - //6车间刻字包装看板 - if ("6".equals(web_flag)) { - str = "{\"code\":\"1\",\"desc\":\"查询成功\",\"result\":{\"screenname\":\"车间刻字包装看板\",\"arr1\":[{\"workprocedure_name\":\"刻字\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"13\",\"device_num\":\"13\"},{\"workprocedure_name\":\"包装\",\"device_runningnum\":\"2\",\"device_errornum\":\"0\",\"device_waitingnum\":\"0\",\"shutdownnum\":\"0\",\"device_num\":\"2\"},{\"workprocedure_name\":\"码盘\",\"device_runningnum\":\"0\",\"device_errornum\":\"0\",\"device_waitingnum\":\"1\",\"shutdownnum\":\"0\",\"device_num\":\"1\"}],\"arr2\":[{\"produceschedule_date\":\"2021-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"推弯一体机加工\",\"sysdic_name\":\"弯头工段\",\"worksection_type_scode\":\"01\",\"finishproduce_qty\":\"0\",\"produce_qty\":\"4200\",\"waiting_qty\":\"4200\",\"progress_qty\":\"0\"},{\"produceschedule_date\":\"2020-09-16\",\"produceorder_code\":\"0916014\",\"workprocedure_name\":\"盘管无屑下料\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"3500\",\"produce_qty\":\"3500\",\"waiting_qty\":\"0\",\"progress_qty\":\"100\"},{\"produceschedule_date\":\"2020-12-31\",\"produceorder_code\":\"1231013\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"790\",\"produce_qty\":\"3500\",\"waiting_qty\":\"2710\",\"progress_qty\":\"23\"},{\"produceschedule_date\":\"2020-05-06\",\"produceorder_code\":\"0506009\",\"workprocedure_name\":\"三通拉伸\",\"sysdic_name\":\"综合工段\",\"worksection_type_scode\":\"02\",\"finishproduce_qty\":\"4225\",\"produce_qty\":\"6000\",\"waiting_qty\":\"1775\",\"progress_qty\":\"70\"}],\"jo3\":{\"sumproduce_qty\":\"0\",\"sumfinishproduce_qty\":\"0\",\"sumproducing_qty\":\"0\",\"sumweek_qty\":\"0\"},\"arr4\":[{\"device_name\":\"激光打标机06\",\"devicestatus_name\":\"急停报警\",\"update_date\":\" 00:00:35\"}],\"arr5\":[[\"product\",\"昨日\",\"今日\"],[\"刻字\",\"1\",\"1\"],[\"包装\",\"1\",\"0\"],[\"码盘\",\"0\",\"0\"]],\"jo6\":{\"sumproduce_orderqty\":\"\",\"sumfinishproduce_orderqty\":\"\",\"sumproducing_orderqty\":\"\"},\"arr7\":[{\"count\":\"0\",\"date\":\"07-10\"},{\"count\":\"0\",\"date\":\"07-11\"},{\"count\":\"0\",\"date\":\"07-12\"},{\"count\":\"0\",\"date\":\"07-13\"},{\"count\":\"0\",\"date\":\"07-14\"},{\"count\":\"0\",\"date\":\"07-15\"},{\"count\":\"0\",\"date\":\"07-16\"}]}}"; - } - - return JSONObject.parseObject(str); - } - - @Override - public Map queryInfo(Map whereJson, Pageable page) { - String queryType = MapUtils.getString(whereJson, "queryType"); - if (queryType.equals("shopInfo")) { - WQLObject wo_shopInfo = WQLObject.getWQLObject("EXT_BIG_ShopInfo"); - ResultBean rb = wo_shopInfo.pagequery(WqlUtil.getHttpContext(page), " 1 = 1", ""); - final JSONObject json = rb.pageResult(); - return json; - } - if (queryType.equals("todayAndPlanNum")) { - WQLObject wo_plan = WQLObject.getWQLObject("EXT_BIG_TodayAndPlanNum"); - ResultBean rb = wo_plan.pagequery(WqlUtil.getHttpContext(page), " 1 = 1", ""); - final JSONObject json = rb.pageResult(); - return json; - } - if (queryType.equals("stock")) { - WQLObject wo_stock = WQLObject.getWQLObject("EXT_BIG_Stock"); - ResultBean rb = wo_stock.pagequery(WqlUtil.getHttpContext(page), " 1 = 1", ""); - final JSONObject json = rb.pageResult(); - return json; - } - if (queryType.equals("supply")) { - WQLObject wo_supply = WQLObject.getWQLObject("EXT_BIG_Supply"); - ResultBean rb = wo_supply.pagequery(WqlUtil.getHttpContext(page), " 1 = 1", ""); - final JSONObject json = rb.pageResult(); - return json; - } - if (queryType.equals("yearInOut")) { - WQLObject wo_yearInOut = WQLObject.getWQLObject("EXT_BIG_YearInOut"); - ResultBean rb = wo_yearInOut.pagequery(WqlUtil.getHttpContext(page), " 1 = 1", ""); - final JSONObject json = rb.pageResult(); - return json; - } - return null; - } - - @Override - public void add(JSONObject param) throws Exception { - String addType = MapUtils.getString(param, "addType"); - if (addType.equals("shopInfo")) { - WQLObject wo_shopInfo = WQLObject.getWQLObject("EXT_BIG_ShopInfo"); - JSONObject jsonObject = wo_shopInfo.query().uniqueResult(0); - wo_shopInfo.delete(jsonObject); - param.put("shop_id", IdUtil.getSnowflake(1, 1).nextId()); - param.put("data", DateUtil.today()); - wo_shopInfo.insert(param); - } - if (addType.equals("todayAndPlanNum")) { - WQLObject wo_plan = WQLObject.getWQLObject("EXT_BIG_TodayAndPlanNum"); - param.put("pro_id", IdUtil.getSnowflake(1, 1).nextId()); - wo_plan.insert(param); - } - if (addType.equals("stock")) { - WQLObject wo_stock = WQLObject.getWQLObject("EXT_BIG_Stock"); - JSONArray resultJSONArray = wo_stock.query().getResultJSONArray(0); - for (int i = 0; i < resultJSONArray.size(); i++) { - JSONObject jsonObject = resultJSONArray.getJSONObject(i); - wo_stock.delete(jsonObject); - } - Date now = DateUtil.parseDate(DateUtil.today()); - for (int i = 1; i <= 14; i++) { - Date data = DateUtil.offsetDay(now, -i); - String formatbz = DateUtil.formatDate(data); - param.put("date", formatbz); - param.put("id", IdUtil.getSnowflake(1, 1).nextId()); - wo_stock.insert(param); - } - } - if (addType.equals("supply")) { - WQLObject wo_supply = WQLObject.getWQLObject("EXT_BIG_Supply"); - JSONArray resultJSONArray = wo_supply.query().getResultJSONArray(0); - for (int i = 0; i < resultJSONArray.size(); i++) { - JSONObject jsonObject = resultJSONArray.getJSONObject(i); - wo_supply.delete(jsonObject); - } - Date now = DateUtil.parseDate(DateUtil.today()); - for (int i = 1; i <= 14; i++) { - Date data = DateUtil.offsetDay(now, i); - String formatbz = DateUtil.formatDate(data); - param.put("date", formatbz); - param.put("id", IdUtil.getSnowflake(1, 1).nextId()); - wo_supply.insert(param); - } - } - if (addType.equals("yearInOut")) { - WQLObject wo_yearInOut = WQLObject.getWQLObject("EXT_BIG_YearInOut"); - JSONObject jsonObject = wo_yearInOut.query().uniqueResult(0); - wo_yearInOut.delete(jsonObject); - param.put("id", IdUtil.getSnowflake(1, 1).nextId()); - wo_yearInOut.insert(param); - } - this.autoInitial(); - } - - @Override - public void edit(JSONObject param) throws Exception { - String addType = MapUtils.getString(param, "addType"); - if (addType.equals("shopInfo")) { - WQLObject wo_shopInfo = WQLObject.getWQLObject("EXT_BIG_ShopInfo"); - wo_shopInfo.update(param); - } - if (addType.equals("todayAndPlanNum")) { - WQLObject wo_plan = WQLObject.getWQLObject("EXT_BIG_TodayAndPlanNum"); - wo_plan.update(param); - } - if (addType.equals("stock")) { - WQLObject wo_stock = WQLObject.getWQLObject("EXT_BIG_Stock"); - wo_stock.update(param); - } - if (addType.equals("supply")) { - WQLObject wo_supply = WQLObject.getWQLObject("EXT_BIG_Supply"); - wo_supply.update(param); - } - if (addType.equals("yearInOut")) { - WQLObject wo_yearInOut = WQLObject.getWQLObject("EXT_BIG_YearInOut"); - wo_yearInOut.update(param); - } - this.autoInitial(); - } - - @Override - public void del(Long[] ids) throws Exception { - Long id = ids[0]; - JSONObject param = new JSONObject(); - WQLObject wo_shopInfo = WQLObject.getWQLObject("EXT_BIG_ShopInfo"); - wo_shopInfo.delete("shop_id = '"+id+"'"); - - - WQLObject wo_plan = WQLObject.getWQLObject("EXT_BIG_TodayAndPlanNum"); - wo_plan.delete("pro_id = '"+id+"'"); - - - WQLObject wo_stock = WQLObject.getWQLObject("EXT_BIG_Stock"); - wo_stock.delete("id = '"+id+"'"); - - - WQLObject wo_supply = WQLObject.getWQLObject("EXT_BIG_Supply"); - wo_supply.delete("id = '"+id+"'"); - - - WQLObject wo_yearInOut = WQLObject.getWQLObject("EXT_BIG_YearInOut"); - wo_yearInOut.delete("id = '"+id+"'"); - - this.autoInitial(); - } - - @Override - public void autoInitial() throws Exception { - WQLObject wo_plan = WQLObject.getWQLObject("EXT_BIG_TodayAndPlanNum"); - WQLObject wo_shopInfo = WQLObject.getWQLObject("EXT_BIG_ShopInfo"); - WQLObject wo_stock = WQLObject.getWQLObject("EXT_BIG_Stock"); - WQLObject wo_supply = WQLObject.getWQLObject("EXT_BIG_Supply"); - WQLObject wo_yearInOut = WQLObject.getWQLObject("EXT_BIG_YearInOut"); - JSONArray planArray = wo_plan.query().getResultJSONArray(0); - JSONObject jsonObject = wo_shopInfo.query().uniqueResult(0); - JSONArray stockArray = wo_stock.query().getResultJSONArray(0); - JSONArray supplyArray = wo_supply.query().getResultJSONArray(0); - JSONObject yearInOutArray = wo_yearInOut.query().uniqueResult(0); - Random random = new Random(); - if (ObjectUtil.isNotEmpty(jsonObject)) { - shopinfoDtos = JSONObject.toJavaObject(jsonObject, ShopinfoDto.class); - } - if (ObjectUtil.isNotEmpty(planArray)) { - todayandplannumDtos = planArray.toJavaList(TodayandplannumDto.class); - } - if (ObjectUtil.isNotEmpty(stockArray)) { - stockDtos = stockArray.toJavaList(StockDto.class); - Iterator iterator = stockDtos.iterator(); - while (iterator.hasNext()) { - StockDto stockDto = iterator.next(); - stockDto.setRepertory(new BigDecimal(random.nextInt(30) + 170)); - } - } - if (ObjectUtil.isNotEmpty(supplyArray)) { - supplyDtos = supplyArray.toJavaList(SupplyDto.class); - Iterator iterator = supplyDtos.iterator(); - while (iterator.hasNext()) { - SupplyDto supplyDto = iterator.next(); - supplyDto.setNeed_num(new BigDecimal(random.nextInt(2) + 3)); - } - } - if (ObjectUtil.isNotEmpty(yearInOutArray)) { - yearinoutDtos = yearInOutArray.toJavaObject(YearinoutDto.class); - } - - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java deleted file mode 100644 index a1d20b6..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/DeviceScreenServiceImpl.java +++ /dev/null @@ -1,514 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUnit; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.wms.ext.bigScreen.service.DeviceScreenService; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.springframework.stereotype.Service; - -import java.util.Date; - -@Service -@RequiredArgsConstructor -@Slf4j -public class DeviceScreenServiceImpl implements DeviceScreenService { - @Override - public JSONObject deviceStatus(JSONObject param) { - //正常运行:有工单正在工作的;暂未生产:有工单没有在工作的;空闲设备:没有工单的,没故障的;故障设备:状态为故障的 - JSONArray device_rows = WQLObject.getWQLObject("PDM_BI_Device").query("is_active = '1' AND is_delete = '0'").getResultJSONArray(0); - int total_num = device_rows.size(); - - //查询故障设备 - JSONArray err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "7").process().getResultJSONArray(0); - int err_device = err_rows.size(); - - //查询运行设备 - JSONArray run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "8").process().getResultJSONArray(0); - int run_device = run_rows.size(); - - //查询有工单,没有故障的设备 - JSONArray task_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "9").process().getResultJSONArray(0); - //查询暂未生产设备 - int prepare_device = task_rows.size() - run_device; - - //空闲设备 - int free_device = total_num - task_rows.size() - err_device; - - - JSONArray result = new JSONArray(); - JSONObject run = new JSONObject(); - run.put("name","正常运行"); - run.put("value",run_device); - result.add(run); - JSONObject pre = new JSONObject(); - pre.put("name","暂未生产"); - pre.put("value",prepare_device); - result.add(pre); - JSONObject free = new JSONObject(); - free.put("name","空闲设备"); - free.put("value",free_device); - result.add(free); - JSONObject err = new JSONObject(); - err.put("name","故障设备"); - err.put("value",err_device); - result.add(err); - JSONObject jo = new JSONObject(); - jo.put("ja",result); - jo.put("total_num",total_num); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", jo); - return returnjo; - } - - @Override - public JSONObject oeeAndTeep(JSONObject param) { - JSONObject oee = new JSONObject(); - JSONObject teep = new JSONObject(); - //value1:过去一个月;value2:目标;value3:实际 - oee.put("value1", "78.0"); - oee.put("value2", "67.0"); - oee.put("value3", "48.0"); - teep.put("value1", "46.0"); - teep.put("value2", "51.0"); - teep.put("value3", "32.0"); - JSONObject result = new JSONObject(); - result.put("oee", oee); - result.put("teep", teep); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject queryDeviceByWork(JSONObject param) { - JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "1").process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceErrorNum(JSONObject param) { - JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "2").process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceManage(JSONObject param) { - String today = DateUtil.today() + "%"; - Date today_begin = DateUtil.beginOfDay(DateUtil.date()); - //弯头工段 - JSONObject jo1 = new JSONObject(); - jo1.put("oee", "45.8%"); - double wt_mibf = 0; - double wt_mttr = 0; - //计算mibf - JSONArray wt_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < wt_run_rows.size(); i++) { - JSONObject device = wt_run_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - } - - //计算mmttr - JSONArray wt_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < wt_err_rows.size(); i++) { - JSONObject device = wt_err_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - } - - jo1.put("MIBF", wt_mibf); - jo1.put("MTTR", wt_mttr); - jo1.put("err_times", wt_err_rows.size()); - //综合工段 - JSONObject jo2 = new JSONObject(); - jo2.put("oee", "45.8%"); - double zh_mibf = 0; - double zh_mttr = 0; - //计算mibf - JSONArray zh_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < zh_run_rows.size(); i++) { - JSONObject device = zh_run_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - } - - //计算mmttr - JSONArray zh_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < zh_err_rows.size(); i++) { - JSONObject device = zh_err_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - } - - jo2.put("MIBF", zh_mibf); - jo2.put("MTTR", zh_mttr); - jo2.put("err_times", zh_err_rows.size()); - //成品工段 - JSONObject jo3 = new JSONObject(); - jo3.put("oee", "45.8%"); - double cp_mibf = 0; - double cp_mttr = 0; - //计算mibf - JSONArray cp_run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "3").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < cp_run_rows.size(); i++) { - JSONObject device = cp_run_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mibf += between; - } - } - - //计算mmttr - JSONArray cp_err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "4").addParam("worksection_type_scode", "01").addParam("today", today).process().getResultJSONArray(0); - for (int i = 0; i < cp_err_rows.size(); i++) { - JSONObject device = cp_err_rows.getJSONObject(i); - String start_time = device.getString("start_time"); - String end_time = device.getString("end_time"); - if (start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date1 = DateUtil.parse(start_time); - Date date2 = DateUtil.date(); - long between = DateUtil.between(date1, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isEmpty(end_time)) { - Date date2 = DateUtil.date(); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - if (!start_time.startsWith(today) && StrUtil.isNotEmpty(end_time)) { - Date date2 = DateUtil.parse(end_time); - long between = DateUtil.between(today_begin, date2, DateUnit.HOUR); - wt_mttr += between; - } - } - - jo3.put("MIBF", cp_mibf); - jo3.put("MTTR", cp_mttr); - jo3.put("err_times", cp_err_rows.size()); - - JSONObject result = new JSONObject(); - result.put("jo1", jo1); - result.put("jo2", jo2); - result.put("jo3", jo3); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceCensus(JSONObject param) { - JSONArray pro_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "10").process().getResultJSONArray(0); - JSONArray result = new JSONArray(); - for (int i = 0; i < pro_rows.size(); i++) { - JSONObject pro = pro_rows.getJSONObject(i); - JSONObject jo = new JSONObject(); - int total_num = pro.getIntValue("total_num"); - String workprocedure_id = pro.getString("workprocedure_id"); - //查询故障设备 - JSONArray err_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "7").addParam("workprocedure_id", workprocedure_id).process().getResultJSONArray(0); - int err_device = err_rows.size(); - - //查询运行设备 - JSONArray run_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "8").addParam("workprocedure_id", workprocedure_id).process().getResultJSONArray(0); - int run_device = run_rows.size(); - - //查询有工单,没有故障的设备 - JSONArray task_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "9").addParam("workprocedure_id", workprocedure_id).process().getResultJSONArray(0); - //查询暂未生产设备 - int prepare_device = task_rows.size() - run_device; - - //空闲设备 - int free_device = total_num - task_rows.size() - err_device; - - jo.put("run_device", run_device); - jo.put("prepare_device", prepare_device); - jo.put("free_device", free_device); - jo.put("err_device", err_device); - jo.put("workprocedure_name", pro.getString("workprocedure_name")); - result.add(jo); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceErrorInfo(JSONObject param) { - String today = DateUtil.today() + "%"; - JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "5").addParam("today", today).process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceUseRate(JSONObject param) { - JSONArray pro_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "10").process().getResultJSONArray(0); - JSONArray result = new JSONArray(); - for (int i = 0; i < pro_rows.size(); i++) { - JSONObject pro = pro_rows.getJSONObject(i); - JSONObject jo = new JSONObject(); - jo.put("workprocedure_name", pro.getString("workprocedure_name")); - jo.put("teep", (i + 1) * 10); - result.add(jo); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject deviceStatusList(JSONObject param) { - String date = DateUtil.today() + "%"; - JSONArray device_rows = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "11").process().getResultJSONArray(0); - JSONArray result = new JSONArray(); - for (int i = 0; i < device_rows.size(); i++) { - int product_qty = 0; - JSONObject device = device_rows.getJSONObject(i); - device.put("start_time",""); - device.put("end_time",""); - device.put("product_time",""); - String device_id = device.getString("device_id"); - JSONArray order_rows = WQLObject.getWQLObject("mps_bd_produceshiftorder").query("device_id = '" + device_id + "' AND produce_date like '" + date + "' AND is_delete = '0'").getResultJSONArray(0); - for (int j = 0; j < order_rows.size(); j++) { - JSONObject order = order_rows.getJSONObject(i); - product_qty += order.getIntValue("real_qty"); - } -// device.put("product_qty", product_qty); - - //查询最近的一条开机状态 - JSONObject start_jo = WQLObject.getWQLObject("pdm_bi_devicerunstatusrecord").query("device_id = '" + device_id + "' AND status_type = '02' order by end_time desc").uniqueResult(0); - if (ObjectUtil.isNotEmpty(start_jo)) { - device.put("start_time", start_jo.getString("end_time")); - } - if (StrUtil.isEmpty(device.getString("status_type"))) { - //查询最近的一条关机状态 - JSONObject end_jo = WQLObject.getWQLObject("pdm_bi_devicerunstatusrecord").query("device_id = '" + device_id + "' AND status_type = '01' order by end_time desc").uniqueResult(0); - if (ObjectUtil.isNotEmpty(end_jo)) { - device.put("end_time", end_jo.getString("end_time")); - } - } - -// //查询最近的一个工单 -// JSONObject order_jo = WQLObject.getWQLObject("mps_bd_produceshiftorder").query("device_id = '" + device_id + "' AND is_delete = '0' order by realproducestart_date desc").uniqueResult(0); -// if (ObjectUtil.isNotEmpty(order_jo)) { -// device.put("product_time", order_jo.getString("produce_date")); -// } - result.add(device); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public JSONObject errCensus(JSONObject param) { - JSONArray result = WQL.getWO("QDEVICE_SCREEN").addParam("flag", "6").process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "查询成功!"); - returnjo.put("result", result); - return returnjo; - } - - public JSONObject calculate(JSONObject jo) { - String date = jo.getString("date") + "%"; - String device_id = jo.getString("device_id"); - //type:1、目标;2、实际 - String type = jo.getString("type"); - - //查询当天该设备的产量 - int total_qty = 0; - JSONArray order_rows = WQLObject.getWQLObject("mps_bd_produceshiftorder").query("device_id = '" + device_id + "' AND produce_date like '" + date + "' AND is_delete = '0'").getResultJSONArray(0); - for (int i = 0; i < order_rows.size(); i++) { - JSONObject order = order_rows.getJSONObject(i); - total_qty += order.getIntValue("real_qty"); - } - - //查询该设备对应的产能 - JSONObject device = WQLObject.getWQLObject("PDM_BI_Device").query("device_id = '" + device_id + "'").uniqueResult(0); - double productivity = device.getDoubleValue("productivity"); - - //故障时间汇总 - JSONArray err_rows = WQLObject.getWQLObject("pdm_bi_devicerunstatusrecord").query("device_id = '" + device_id + "' AND status_type = '05' AND start_time like '" + date + "'").getResultJSONArray(0); - double err_time = 0; - for (int i = 0; i < err_rows.size(); i++) { - JSONObject err_jo = err_rows.getJSONObject(i); - String start_time = err_jo.getString("start_time"); - String end_time = err_jo.getString("end_time"); - if (StrUtil.isEmpty(end_time)) { - end_time = DateUtil.now(); - } - long between = DateUtil.between(DateUtil.parse(start_time), DateUtil.parse(end_time), DateUnit.MINUTE); - err_time += between; - } - - err_time = NumberUtil.round(err_time, 2).doubleValue(); - - double oee = 0.0; - //OEE计算目标:当天汇总/(产能x负荷时间);实际:(班制时间-故障时间)/班制时间 * (当天工单汇总/(产能*(符合时间-故障时间)))* 98% - if (type.equals("1")) { - //8是指符合时间,也就是每天的工作时间 - oee = NumberUtil.div(total_qty, NumberUtil.mul(8, productivity)); - } else { - //(班制时间-故障时间)/班制时间 - double value1 = NumberUtil.div(NumberUtil.sub(8 * 60, err_time), 8 * 60); - //(产能*(符合时间-故障时间) - double value2 = NumberUtil.div(total_qty, NumberUtil.mul(productivity, value1)); - oee = NumberUtil.mul(value1, value2); - } - - double teep = 0.0; - //TEEP计算:OEE*(班制时间-计划停机时间)/班制时间 - teep = NumberUtil.div(oee, 0.9); - JSONObject result = new JSONObject(); - result.put("oee", oee); - result.put("teep", teep); - return result; - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/ProductServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/ProductServiceImpl.java deleted file mode 100644 index ebb82d3..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/service/impl/ProductServiceImpl.java +++ /dev/null @@ -1,247 +0,0 @@ -package org.nl.wms.ext.bigScreen.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.wms.ext.bigScreen.service.ProductService; -import org.nl.wql.WQL; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -@Service -@RequiredArgsConstructor -@Slf4j -public class ProductServiceImpl implements ProductService { - private String now = DateUtil.now(); - private String today = DateUtil.today(); - //一个月的开始日期 - private String beginOfMonth = DateUtil.formatTime(DateUtil.beginOfMonth(DateUtil.parseDate(today))); - - @Override - public Map planReached(Map param) { - //计算当天的计划达成 - //01-弯头工段、02-综合工段、03-成品工段 - Map map = new HashMap(); - map.put("flag", "1"); - map.put("produce_date", today); - map.put("worksection_type_scode","01"); - JSONObject jo1 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - map.put("worksection_type_scode","02"); - JSONObject jo2 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - map.put("worksection_type_scode","03"); - JSONObject jo3 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - JSONObject dayResult = new JSONObject(); - dayResult.put("jo1",jo1); - dayResult.put("jo2",jo2); - dayResult.put("jo3",jo3); - - //计算一个月的计划达成 - JSONObject monthResult = new JSONObject(); - map.put("flag", "14"); - map.put("end_produce_date", today); - map.put("begin_produce_date", beginOfMonth); - map.put("worksection_type_scode","01"); - JSONObject joo1 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - map.put("worksection_type_scode","02"); - JSONObject joo2 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - map.put("worksection_type_scode","03"); - JSONObject joo3 = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - - monthResult.put("joo1",joo1); - monthResult.put("joo2",joo2); - monthResult.put("joo3",joo3); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("dayResult", dayResult); - returnjo.put("monthResult", monthResult); - return returnjo; - } - - @Override - public Map productSchedule(Map param) { - //今日排产生产进度跟踪 - Map map = new HashMap(); - map.put("flag", "2"); - map.put("produce_date", today); - JSONArray result = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", result); - return returnjo; - } - - @Override - public Map output(Map param) { - JSONObject result = new JSONObject(); - Map map = new HashMap(); - // map.put("flag", "3"); - map.put("flag", "7"); - map.put("produce_date", today); - //统计产量方式一: 1 计算工单物料 2 计算每个物料清洗前一个工序 3拿着工序+物料 关联工单表 统计总数 - //1激光下料——推弯——清洗 - //2旋压-清洗 - //3盘管无屑下料-三通拉伸-镗孔-清洗 - //4直管无屑下料-镗孔-清洗 - //统计产量方式二: 只需要统计 推弯,旋压。镗孔 3个工序工单的数量 ('07','06','02') - JSONObject joo = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - result.put("real_qty", joo.getString("real_qty")); - result.put("plan_qty", joo.getString("plan_qty")); - result.put("finish_rate", joo.getString("finish_rate")); - //统计工单个数 - map.put("flag", "4"); - int sum_qty = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("count"); - //统计延时工单 - map.put("product_date",today); - map.put("flag", "5"); - - int delayed_qty = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("count"); - result.put("sum_qty", sum_qty); - result.put("delayed_qty", delayed_qty); - result.put("normal_qty", sum_qty - delayed_qty); - - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", result); - return returnjo; - } - - - @Override - public Map worksectionHarvest(Map param) { - //近一周工段产量 - //获取一周的日期 - JSONArray dataArr = new JSONArray(); - JSONArray results = new JSONArray(); - for (int i = 0; i < 7; i++) { - DateTime dateTime = DateUtil.offsetDay(DateUtil.parse(now), -i); - dataArr.add(dateTime.toString().substring(0, 10)); - } - for (int i = 0; i < dataArr.size(); i++) { - JSONObject jo = new JSONObject(); - String date = dataArr.get(( dataArr.size()-i-1)).toString(); - - //01-弯头工段、02-综合工段、03-成品工段 - Map map = new HashMap(); - map.put("flag", "15"); - map.put("produce_date", date); - map.put("worksection_type_scode", "01"); - int elbow_qty = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("real_qty"); - jo.put("elbow_qty", elbow_qty); - map.put("worksection_type_scode", "02"); - int comprehensive_qty = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("real_qty"); - jo.put("comprehensive_qty", comprehensive_qty); - map.put("worksection_type_scode", "03"); - int end_product_qty = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("real_qty"); - jo.put("end_product_qty", end_product_qty); - jo.put("date",date.substring(5,date.length())); - results.add(jo); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", results); - return returnjo; - } - - @Override - public Map topHarvest(Map param) { - //今日Top10产量 - Map map = new HashMap(); - map.put("flag", "10"); - map.put("produce_date", today); - JSONArray results = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", results); - return returnjo; - } - - @Override - public Map monthHarvest(Map param) { - //30天产量走势 - JSONArray dataArr = new JSONArray(); - JSONArray results = new JSONArray(); - for (int i = 0; i < 30; i++) { - DateTime dateTime = DateUtil.offsetDay(DateUtil.parse(now), -i); - dataArr.add(dateTime.toString().substring(0, 10)); - } - for (int i = 0; i < dataArr.size(); i++) { - JSONObject jo = new JSONObject(); - String date = dataArr.get(dataArr.size()-i-1).toString(); - - Map map = new HashMap(); - map.put("flag", "9"); - map.put("produce_date", date); - int real_qty = 0; - JSONObject jsonObject = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonObject)) { - real_qty = jsonObject.getIntValue("real_qty"); - } - jo.put("real_qty", real_qty); - jo.put("date", date.substring(5,date.length())); - results.add(jo); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", results); - return returnjo; - } - - @Override - public Map unfinishOrder(Map param) { - Map map = new HashMap(); - map.put("flag", "11"); - map.put("produce_date", today); - JSONArray results = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().getResultJSONArray(0); - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", results); - return returnjo; - } - - @Override - public Map monthOrder(Map param) { - //计算前9种物料产能 - Map map = new HashMap(); - map.put("flag", "12"); - map.put("produce_date", today); - map.put("end_produce_date", today); - map.put("begin_produce_date", beginOfMonth); - JSONArray results = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().getResultJSONArray(0); - //计算所有的产能 - map.put("flag", "13"); - int sum_count = WQL.getWO("BIGSCREENPRODUCT").addParamMap(map).process().uniqueResult(0).getIntValue("real_qty"); - //前几种物料的总和 - int count_num_flag = 0; - //如果有9种物料则需要计算其他 - if (results.size() == 9) { - for (int i = 0; i < results.size(); i++) { - count_num_flag = count_num_flag + results.getJSONObject(i).getIntValue("real_qty"); - } - } - if (count_num_flag < sum_count) { - JSONObject joo = new JSONObject(); - joo.put("material_name", "其他"); - joo.put("material_spec", "其他"); - joo.put("real_qty", sum_count - count_num_flag); - results.add(joo); - } - JSONObject returnjo = new JSONObject(); - returnjo.put("code", "1"); - returnjo.put("desc", "操作成功!"); - returnjo.put("result", results); - return returnjo; - } -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/AGVBIGSCREEN01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/AGVBIGSCREEN01.wql deleted file mode 100644 index 6acd1de..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/AGVBIGSCREEN01.wql +++ /dev/null @@ -1,109 +0,0 @@ -[交易说明] - 交易名: AGV监控中心查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.today TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - count(task.task_id) AS all_task_number - FROM - SCH_BASE_Task task - WHERE - 1 = 1 - - OPTION 输入.today <> "" - task.create_time like 输入.today - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - count(task.task_id) AS finish_task_number - FROM - SCH_BASE_Task task - WHERE - task.task_status = '99' - - OPTION 输入.today <> "" - task.create_time like 输入.today - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "3" - QUERY - SELECT - count(task.task_id) AS cancel_task_number - FROM - SCH_BASE_Task task - WHERE - task.is_delete = '1' - - OPTION 输入.today <> "" - task.create_time like 输入.today - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "4" - QUERY - SELECT - count(task.task_id) AS not_finish_task_number - FROM - SCH_BASE_Task task - WHERE - task.task_status <> '99' - - OPTION 输入.today <> "" - task.create_time like 输入.today - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/BIGSCREENPRODUCT.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/BIGSCREENPRODUCT.wql deleted file mode 100644 index 445d543..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/BIGSCREENPRODUCT.wql +++ /dev/null @@ -1,387 +0,0 @@ -[交易说明] - 交易名: bom查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.workprocedure TYPEAS s_string - 输入.begin_time TYPEAS s_string - 输入.end_time TYPEAS s_string - 输入.now_time TYPEAS s_string - 输入.produce_date TYPEAS s_string - 输入.end_produce_date TYPEAS s_string - 输入.begin_produce_date TYPEAS s_string - 输入.worksection_type_scode TYPEAS s_string - - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - - sum( shiftorder.real_qty ) AS real_qty, - sum( shiftorder.plan_qty ) AS plan_qty , - convert(sum( shiftorder.real_qty )/sum( shiftorder.plan_qty ),DECIMAL(10,2))*100 as finish_rate - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - where - - shiftorder.is_delete='0' - OPTION 输入.worksection_type_scode <> "" - workprocedure.worksection_type_scode = 输入.worksection_type_scode - ENDOPTION - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - shiftorder.produceorder_code, - shiftorder.plan_qty, - shiftorder.real_qty, - (shiftorder.plan_qty - shiftorder.real_qty) AS gap_qty, - material.material_code, - material.material_name, - material.material_spec, - CONVERT ( ( shiftorder.real_qty / shiftorder.plan_qty ), DECIMAL ( 10, 3 ) ) * 100 AS finish_rate - FROM - mps_bd_produceshiftorder shiftorder - left join md_me_materialbase material on material.material_id =shiftorder.material_id - where - shiftorder.is_delete='0' - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - -IF 输入.flag = "3" - QUERY - SELECT - sum( shiftorder.real_qty ) AS real_qty, - sum( shiftorder.plan_qty ) AS plan_qty, - CONVERT ( sum( shiftorder.real_qty ) / sum( shiftorder.plan_qty ), DECIMAL ( 10, 3 ) ) * 100 AS finish_rate - FROM - mps_bd_produceshiftorder shiftorder - RIGHT JOIN ( - SELECT - route.material_id, - dtl.workprocedure_id - FROM - PDM_BI_ProductProcessRoute route - LEFT JOIN PDM_BI_ProductProcessRouteDtl dtl ON route.productprocess_id = dtl.productprocess_id - WHERE - route.material_id IN ( SELECT DISTINCT shiftorder.material_id FROM mps_bd_produceshiftorder shiftorder ) - AND dtl.nextworkprocedure_id = '1535144552481034240' - ) a ON a.material_id = shiftorder.material_id - AND a.workprocedure_id = shiftorder.workprocedure_id - where - 1=1 - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY -ENDIF - - IF 输入.flag = "4" - QUERY - SELECT - count(*) as count - FROM - mps_bd_produceshiftorder shiftorder - where - shiftorder.is_delete='0' - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "5" - QUERY - SELECT - count(*) as count - FROM - mps_bd_produceshiftorder shiftorder - where - shiftorder.realproduceend_date > shiftorder.planproduceend_date - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "7" - QUERY - SELECT - sum( real_qty ) AS real_qty, - sum( plan_qty ) AS plan_qty, - CONVERT ( sum( shiftorder.real_qty ) / sum( shiftorder.plan_qty ), DECIMAL ( 10, 3 ) ) * 100 AS finish_rate - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON workprocedure.workprocedure_id = shiftorder.workprocedure_id - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - -IF 输入.flag = "8" - QUERY - SELECT - workprocedure.worksection_type_scode, - sum( real_qty ) AS real_qty, - sum( plan_qty ) AS plan_qty, - shiftorder.produce_date as date, - CONVERT ( sum( shiftorder.real_qty ) / sum( shiftorder.plan_qty ), DECIMAL ( 10, 3 ) ) * 100 AS finish_rate - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - WHERE - shiftorder.is_delete='0' - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - GROUP BY worksection_type_scode,shiftorder.produce_date - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "9" - QUERY - SELECT - sum( real_qty ) AS real_qty - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - GROUP BY worksection_type_scode - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "10" - QUERY - SELECT - shiftorder.material_id, - material.material_code, - material.material_name, - material.material_spec, - sum( real_qty ) AS real_qty - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - left join md_me_materialbase material on material.material_id =shiftorder.material_id - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - GROUP BY - shiftorder.material_id, - material.material_code, - material.material_name, - material.material_spec - ORDER BY real_qty desc - LIMIT 0,10 - ENDSELECT - ENDQUERY -ENDIF - - -IF 输入.flag = "11" - QUERY - SELECT - shiftorder.produceorder_code, - shiftorder.material_id, - material.material_code, - material.material_name, - material.material_spec, - shiftorder. real_qty, - shiftorder.plan_qty, - shiftorder.plan_qty -shiftorder. real_qty as gap_qty, - shiftorder.produce_date as date - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - left join md_me_materialbase material on material.material_id =shiftorder.material_id - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - and shiftorder. real_qty < shiftorder.plan_qty - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY -ENDIF - - -IF 输入.flag = "12" - QUERY - SELECT - shiftorder.material_id, - material.material_code, - material.material_name, - material.material_spec, - sum( real_qty ) AS real_qty - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - left join md_me_materialbase material on material.material_id =shiftorder.material_id - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - OPTION 输入.end_produce_date <> "" - shiftorder.produce_date <= 输入.end_produce_date - ENDOPTION - OPTION 输入.begin_produce_date <> "" - shiftorder.produce_date >= 输入.begin_produce_date - ENDOPTION - GROUP BY - shiftorder.material_id, - material.material_code, - material.material_spec, - material.material_name - ORDER BY real_qty desc - LIMIT 0,9 - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "13" - QUERY - SELECT - sum( real_qty ) AS real_qty - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - left join md_me_materialbase material on material.material_id =shiftorder.material_id - WHERE - shiftorder.is_delete='0' - and workprocedure.workprocedure_code IN ( '07', '06', '02' ) - OPTION 输入.end_produce_date <> "" - shiftorder.produce_date <= 输入.end_produce_date - ENDOPTION - OPTION 输入.begin_produce_date <> "" - shiftorder.produce_date >= 输入.begin_produce_date - ENDOPTION - - ENDSELECT - ENDQUERY -ENDIF - -IF 输入.flag = "14" - QUERY - SELECT - - sum( shiftorder.real_qty ) AS real_qty, - sum( shiftorder.plan_qty ) AS plan_qty , - convert(sum( shiftorder.real_qty )/sum( shiftorder.plan_qty ),DECIMAL(10,2))*100 as finish_rate - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - where - shiftorder.is_delete='0' - OPTION 输入.worksection_type_scode <> "" - workprocedure.worksection_type_scode = 输入.worksection_type_scode - ENDOPTION - OPTION 输入.end_produce_date <> "" - shiftorder.produce_date <= 输入.end_produce_date - ENDOPTION - OPTION 输入.begin_produce_date <> "" - shiftorder.produce_date >= 输入.begin_produce_date - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "15" - QUERY - SELECT - sum( real_qty ) AS real_qty, - sum( plan_qty ) AS plan_qty, - CONVERT ( sum( shiftorder.real_qty ) / sum( shiftorder.plan_qty ), DECIMAL ( 10, 3 ) ) * 100 AS finish_rate - FROM - mps_bd_produceshiftorder shiftorder - LEFT JOIN pdm_bi_workprocedure workprocedure ON shiftorder.workprocedure_id = workprocedure.workprocedure_id - LEFT JOIN sys_dict_detail sys ON sys.VALUE= workprocedure.worksection_type_scode AND sys.dict_id = '87' - WHERE - shiftorder.is_delete='0' - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - OPTION 输入.worksection_type_scode <> "" - workprocedure.worksection_type_scode = 输入.worksection_type_scode - ENDOPTION - OPTION 输入.produce_date <> "" - shiftorder.produce_date = 输入.produce_date - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql deleted file mode 100644 index 6b2eb9f..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/QDEVICE_SCREEN.wql +++ /dev/null @@ -1,266 +0,0 @@ -[交易说明] - 交易名: 物料分页查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.worksection_type_scode TYPEAS s_string - 输入.today TYPEAS s_string - 输入.workprocedure_id TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - MAX( productivity ) AS max_productivity, - MIN( productivity ) AS min_productivity, - ROUND( SUM( productivity )/ COUNT( device_id ), 3 ) AS ave_productivity, - MAX(pro.workprocedure_name) AS workprocedure_name - FROM - pdm_bi_device device - LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id - WHERE - device.is_active = '1' - AND - device.is_delete = '0' - GROUP BY - device.workprocedure_id - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - COUNT(run.device_id) AS err_num, - MAX(device.device_name) AS device_name - FROM - pdm_bi_devicerunstatusrecord run - LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id - GROUP BY - run.device_id - ORDER BY err_num desc - LIMIT 10 - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "3" - QUERY - SELECT - device.device_id, - run.start_time, - run.end_time - FROM - pdm_bi_device device - LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id - INNER JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id - WHERE - pro.worksection_type_scode = 输入.worksection_type_scode - AND ( - run.start_time LIKE 输入.today - OR run.end_time LIKE 输入.today - OR run.end_time IS NULL - OR run.end_time = '' - ) - AND run.status_type = '03' - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "4" - QUERY - SELECT - device.device_id, - run.start_time, - run.end_time - FROM - pdm_bi_device device - LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id - INNER JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id - WHERE - pro.worksection_type_scode = 输入.worksection_type_scode - AND ( - run.start_time LIKE 输入.today - OR run.end_time LIKE 输入.today - OR run.end_time IS NULL - OR run.end_time = '' - ) - AND run.status_type = '05' - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "5" - QUERY - SELECT - run.start_time, - device.device_code, - device.device_name, - err.err_name - FROM - pdm_bi_devicerunstatusrecord run - LEFT JOIN pdm_bi_devicerunerrorlink err ON err.err_status_id = run.err_status_id - LEFT JOIN pdm_bi_device device ON run.device_id = device.device_id - WHERE - run.status_type = '05' - AND - run.start_time like 输入.today - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "6" - QUERY - SELECT - COUNT( record_id ) AS err_times, - MAX( device.device_name ) AS device_name - FROM - pdm_bi_devicerunstatusrecord run - LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id - WHERE - run.status_type = '05' - AND DATE_SUB( CURDATE(), INTERVAL 10 DAY ) <= date( start_time ) - GROUP BY - run.device_id - LIMIT 10 - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "7" - QUERY - SELECT - device.device_id - FROM - pdm_bi_devicerunstatusrecord run - LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id - WHERE - status_type = '05' - AND - IFNULL( end_time, '' ) = '' - OPTION 输入.workprocedure_id <> "" - device.workprocedure_id = 输入.workprocedure_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "8" - QUERY - SELECT - device.device_id - FROM - pdm_bi_devicerunstatusrecord run - LEFT JOIN pdm_bi_device device ON device.device_id = run.device_id - WHERE - status_type = '03' - AND - IFNULL( end_time, '' ) = '' - OPTION 输入.workprocedure_id <> "" - device.workprocedure_id = 输入.workprocedure_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "9" - QUERY - SELECT DISTINCT - device.device_id - FROM - pdm_bi_device device - LEFT JOIN mps_bd_produceshiftorder shift ON shift.device_id = device.device_id - LEFT JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id - WHERE - shift.is_delete = '0' - AND - shift.order_status <> '04' - AND - (run.status_type <> '05' OR (run.status_type = '05' AND IFNULL(run.end_time,'') <> '') OR run.status_type IS NULL) - OPTION 输入.workprocedure_id <> "" - device.workprocedure_id = 输入.workprocedure_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "10" - QUERY - SELECT - device.workprocedure_id, - COUNT(device_id) AS total_num, - MAX(pro.workprocedure_name) AS workprocedure_name - FROM - pdm_bi_device device - LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id - WHERE - device.is_delete = '0' - AND - device.is_active = '1' - GROUP BY - device.workprocedure_id - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "11" - QUERY - SELECT - device.device_code, - device.device_name, - pro.workprocedure_name, - (case when run.status_type is null then '关机' - when run.status_type = '02' then '开机' - when run.status_type = '03' then '生产中' - when run.status_type = '04' then '待机' - when run.status_type = '05' then '故障' - end - ) AS device_status, - device.device_id, - run.status_type - FROM - pdm_bi_device device - LEFT JOIN pdm_bi_devicerunstatusrecord run ON run.device_id = device.device_id AND IFNULL(run.end_time,'') = '' - LEFT JOIN pdm_bi_workprocedure pro ON pro.workprocedure_id = device.workprocedure_id - ENDSELECT - ENDQUERY - ENDIF - - - - - - - diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/bigScreen.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/bigScreen/wql/bigScreen.xls deleted file mode 100644 index b49844c74532083300bc5fbd3a6d81afb3fa6c4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224256 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%0A*SN%j#3#YY?_ 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

+!Nk#{Y@X^RnnXOjBfOVey|Y|7 z4Ent=J~DXkPAn05%{h^(m~WFr9q@~d3O?MgPMxMsniRmJLpEDB3i0sk(E(~HD{&c0 zcrnw|Q%;*@IpxT5l3?4sRq6C~_{xjG%D*vLe=%5T)ePX8dw@-s1SZ7EzXg1>2Ut12 z@-LCL%V0%rkd7cE!fV1}Q>dk$C%wHTK}+42zV9oUSUtIR@^DdPqMzPx2n2E#X@+*mv`$w*w#i7?^&_^SR7gJcF)2AKLPbx8M9kU^jT}8fNII zMx)3la04OW!lz7{$3V}rvcwN}sX1K6{d|=CmAY}wP3b4Z|Z2-=N zJrL=rhNDxZwQQuHn|4hB4(jK^aT?;F0XQn{!T%!|VdVKC91fVUZd!m7-Vh~Z9(1^_ zIO38s;)rzim2iXrZ0oM|$F7fXeqHOI1S4cHR0(-|>4p6t;dNc%p)J~Ao-5%Z@g0gv zq=CPTm*Q{#ByVB31nbQ^7~m{$1$50DD*cwVds}0#LR|D+;Q@~qrit*ZACyeUx3%!j zBX)xBuA+O;Wrg7W6EvA&F(}P1CGjZ$I*fe>9K4DO#`Q(;UXAePh!A?|zd_>u7c_@m zYWbf7tV1k9LEjI`qUL>ExV&5k<$Hz^de2KmwTeiS5s4k{No_-0yc*|6XWeTfM z*o85@utS z)Lv4#!89G#h1CC;i{hehJoO|3K(SL54DSwm9KzQcBzlCB2!^;I2;1N(>|V>Rf!F>l z;OVsuf?@ZXCr!-10Wk@mp4&ML;4Lo5k+w6iuuDo~qI}RBfACag3?^$SZ`Ex;s;|Cr z>iY9}HfSq6>$P_rrL-!V7E?AmAG+pi5Thv4v$3MRwsZHi-(;saF)g-n-)Xz^bP05f zzUkAIua?XBYWKSXWqqP&z7%*`4^T5WU|^~Q*0^8u|{Khy3v?8HX%JB>lR*`?wNRw}?RKrm?V1K1W@_ghQKfH7F#Oe2r9z8@enF%{6 zCzTgh%yw3JGD%3#X>H|2Iyz$Ng@*D~4AR@XBe2aC%!=4-rXDxE3JWB_Y2LS4h;YtM zk}MDgMM7YTED%N;LZDd|2*WKQFi{qW5~aJFl$mO{In!oKG@H_Gv11bwO|c0XwyfBc zgru>tNm&{2ihhF8mS9V~1zIq(qHxI~Xuwo?t;dX<2Spm9lk#HI8RXYL~|u~QtL z^pa|TMH_JoJWyexv#inzujs=;HAp=p1OeAn19QO~q0&)PT2SVUH>VonQ{v5LGY|#< ztkWi>8h{{1TT(*2IVEANbaftobZ?)Fh2Z{gP#g3dvr8R+{0rd2#qnR~^2^{wr^|CN z{<-Y&7wS`FW_0*&+Ku#uE8%T!d}kToLcdf8=f7U|{%aWY(lgev3^;xY#whr1JHD~L zobH_|rrS+=d*8S-X0VTomd``*rPALA%0DA!gM5HJD<^|8Ooll#!Dfd3h8KiSu%;T4 z;jp!ogp{!U+)J$`d4p7aI>y_vAn8jZq_Rq|mFp80mm zc)A=2M`d)%1`wnMYd8eX33$onMXE7|_xxLRT2IIC91+9En}y4iWCHl46jKZj;DSu( z3@e5v^%$DcW2m{u(8R8xog2G{Ct>Zw(CwW`0W_$WaBoHo@B#~$0xk|NC0r`F@Qoui z+%<4%#b-ab>)`T-D*!HBR|$kG2(Er`1;Z5rSAVz$z=e4X6z|BJ|L6YqQD7@0Y;?mh z=cT)Qn1?SN_`e3Z1+WD6Bk%ZVnBY;-jG8bdAZC}qF23bd#9pql`CV$#*XZuz1^xoc zOba@&tHXM?u4(w!583nePi|I|(UH5~M>8AF+hNK@=`s=SsJnB-u(@!@IdLUiXqH+il7>L2sNGno*k z>=HH+2!(PFre>5TNDDOc!PJ?4^QjE(NDG|YU_DmAg)~?V7usAl!iBU!8e!efz$K>* zh84o=HnB^}@mMV|{i4&;Jkf`Fqw9Jf3WcHd6-=MxxsMKhN)def(B8do>^*p%KD_>) zmp^p39({{G?D_G)KM!q(2Q=yK`udIY$NwXQfBQ;Qm|L$!;y6J zE2?N5Ei$xAU}kA`Wtn3+&XOo9XbR1T6Mk!>`RpSf2 z<=N$hPKrPF?y>a%%51s=5O~yD=oG~tG zY$8s(Y2HynoXMO}Y>ov(227s|%>}V3g$V_*=H!HUQ(<9JQ9*G5!uRCl_Mfg>MsQ6o uw2R>8VL}dVuN8$eq?0w5944$vOZ0nic93D6mk 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 diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/1.txt b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/DeliveryOrderController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/DeliveryOrderController.java deleted file mode 100644 index 2319a3d..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/DeliveryOrderController.java +++ /dev/null @@ -1,68 +0,0 @@ - -package org.nl.wms.pcs.rest; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.pcs.service.DeliveryOrderService; -import org.nl.wms.pcs.service.dto.DeliveryOrderDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** -* @author geng by -* @date 2022-06-01 -**/ -@RestController -@RequiredArgsConstructor -@Api(tags = "发货单管理") -@RequestMapping("/api/deliveryOrder") -@Slf4j -public class DeliveryOrderController { - - private final DeliveryOrderService deliveryOrderService; - - @GetMapping - @Log("查询发货单") - @ApiOperation("查询发货单") - //@PreAuthorize("@el.check('deliveryOrder:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(deliveryOrderService.queryAll(whereJson,page),HttpStatus.OK); - } - - @PostMapping - @Log("新增发货单") - @ApiOperation("新增发货单") - //@PreAuthorize("@el.check('deliveryOrder:add')") - public ResponseEntity create(@Validated @RequestBody DeliveryOrderDto dto){ - deliveryOrderService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改发货单") - @ApiOperation("修改发货单") - //@PreAuthorize("@el.check('deliveryOrder:edit')") - public ResponseEntity update(@Validated @RequestBody DeliveryOrderDto dto){ - deliveryOrderService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除发货单") - @ApiOperation("删除发货单") - //@PreAuthorize("@el.check('deliveryOrder:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - deliveryOrderService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/SaleOrderController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/SaleOrderController.java deleted file mode 100644 index e1d0263..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/rest/SaleOrderController.java +++ /dev/null @@ -1,68 +0,0 @@ - -package org.nl.wms.pcs.rest; - - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.annotation.Log; -import org.nl.wms.pcs.service.SaleOrderService; -import org.nl.wms.pcs.service.dto.SaleOrderDto; -import org.springframework.data.domain.Pageable; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** -* @author geng by -* @date 2022-06-01 -**/ -@RestController -@RequiredArgsConstructor -@Api(tags = "销售订单管理") -@RequestMapping("/api/saleOrder") -@Slf4j -public class SaleOrderController { - - private final SaleOrderService saleOrderService; - - @GetMapping - @Log("查询销售订单") - @ApiOperation("查询销售订单") - //@PreAuthorize("@el.check('saleOrder:list')") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ - return new ResponseEntity<>(saleOrderService.queryAll(whereJson,page),HttpStatus.OK); - } - - @PostMapping - @Log("新增销售订单") - @ApiOperation("新增销售订单") - //@PreAuthorize("@el.check('saleOrder:add')") - public ResponseEntity create(@Validated @RequestBody SaleOrderDto dto){ - saleOrderService.create(dto); - return new ResponseEntity<>(HttpStatus.CREATED); - } - - @PutMapping - @Log("修改销售订单") - @ApiOperation("修改销售订单") - //@PreAuthorize("@el.check('saleOrder:edit')") - public ResponseEntity update(@Validated @RequestBody SaleOrderDto dto){ - saleOrderService.update(dto); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - @Log("删除销售订单") - @ApiOperation("删除销售订单") - //@PreAuthorize("@el.check('saleOrder:del')") - @DeleteMapping - public ResponseEntity delete(@RequestBody Long[] ids) { - saleOrderService.deleteAll(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/DeliveryOrderService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/DeliveryOrderService.java deleted file mode 100644 index d339715..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/DeliveryOrderService.java +++ /dev/null @@ -1,65 +0,0 @@ - -package org.nl.wms.pcs.service; - -import org.nl.wms.pcs.service.dto.DeliveryOrderDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** -* @description 服务接口 -* @author geng by -* @date 2022-06-01 -**/ -public interface DeliveryOrderService { - - /** - * 查询数据分页 - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * @param deliver_id ID - * @return DeliveryOrder - */ - DeliveryOrderDto findById(Long deliver_id); - - /** - * 根据编码查询 - * @param code code - * @return DeliveryOrder - */ - DeliveryOrderDto findByCode(String code); - - - /** - * 创建 - * @param dto / - */ - void create(DeliveryOrderDto dto); - - /** - * 编辑 - * @param dto / - */ - void update(DeliveryOrderDto dto); - - /** - * 多选删除 - * @param ids / - */ - void deleteAll(Long[] ids); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/SaleOrderService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/SaleOrderService.java deleted file mode 100644 index 5dbf55e..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/SaleOrderService.java +++ /dev/null @@ -1,65 +0,0 @@ - -package org.nl.wms.pcs.service; - -import org.nl.wms.pcs.service.dto.SaleOrderDto; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Map; - -/** -* @description 服务接口 -* @author geng by -* @date 2022-06-01 -**/ -public interface SaleOrderService { - - /** - * 查询数据分页 - * @param whereJson 条件 - * @param page 分页参数 - * @return Map - */ - Map queryAll(Map whereJson, Pageable page); - - /** - * 查询所有数据不分页 - * @param whereJson 条件参数 - * @return List - */ - List queryAll(Map whereJson); - - /** - * 根据ID查询 - * @param sale_id ID - * @return SaleOrder - */ - SaleOrderDto findById(Long sale_id); - - /** - * 根据编码查询 - * @param code code - * @return SaleOrder - */ - SaleOrderDto findByCode(String code); - - - /** - * 创建 - * @param dto / - */ - void create(SaleOrderDto dto); - - /** - * 编辑 - * @param dto / - */ - void update(SaleOrderDto dto); - - /** - * 多选删除 - * @param ids / - */ - void deleteAll(Long[] ids); - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/DeliveryOrderDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/DeliveryOrderDto.java deleted file mode 100644 index 95efae2..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/DeliveryOrderDto.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.nl.wms.pcs.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** -* @description / -* @author geng by -* @date 2022-06-01 -**/ -@Data -public class DeliveryOrderDto implements Serializable { - - /** 发货单标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long deliver_id; - - /** 发货单号 */ - private String deliver_code; - - /** 明细序号 */ - private BigDecimal seq_no; - - /** 发货单类型 */ - private String deliver_type; - - /** 物料标识 */ - private Long material_id; - - /** 状态 */ - private String status; - - /** 发货数量 */ - private BigDecimal delivery_qty; - - /** 客户标识 */ - private Long cust_id; - - /** 计量单位标识 */ - private Long qty_unit_id; - - /** 销售单标识 */ - private Long sale_id; - - /** 销售单号 */ - private String sale_code; - - /** 销售明细序号 */ - private BigDecimal sale_seq_no; - - /** 创建人 */ - private Long create_id; - - /** 创建人 */ - private String create_name; - - /** 创建时间 */ - private String create_time; - - /** 修改人 */ - private Long update_optid; - - /** 修改人 */ - private String update_optname; - - /** 修改时间 */ - private String update_time; - - /** 客户编码 */ - private String cust_code; - - /** 客户名称 */ - private String cust_name; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/SaleOrderDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/SaleOrderDto.java deleted file mode 100644 index 4e10923..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/dto/SaleOrderDto.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.nl.wms.pcs.service.dto; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** -* @description / -* @author geng by -* @date 2022-06-01 -**/ -@Data -public class SaleOrderDto implements Serializable { - - /** 销售单标识 */ - /** 防止精度丢失 */ - @JsonSerialize(using= ToStringSerializer.class) - private Long sale_id; - - /** 销售单号 */ - private String sale_code; - - /** 明细序号 */ - private BigDecimal seq_no; - - /** 销售单类型 */ - private String sale_type; - - /** 物料标识 */ - private Long material_id; - - /** 状态 */ - private String status; - - /** 销售数量 */ - private BigDecimal sale_qty; - - /** 生产顺序 */ - private BigDecimal produce_seq; - - /** 客户标识 */ - private Long cust_id; - - /** 计量单位标识 */ - private Long qty_unit_id; - - /** 计划交期 */ - private String plandeliver_date; - - /** 创建人 */ - private Long create_id; - - /** 创建人 */ - private String create_name; - - /** 创建时间 */ - private String create_time; - - /** 修改人 */ - private Long update_optid; - - /** 修改人 */ - private String update_optname; - - /** 修改时间 */ - private String update_time; - - - /** 客户编码 */ - private String cust_code; - - /** 客户名称 */ - private String cust_name; -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/DeliveryOrderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/DeliveryOrderServiceImpl.java deleted file mode 100644 index 8e5458d..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/DeliveryOrderServiceImpl.java +++ /dev/null @@ -1,155 +0,0 @@ - -package org.nl.wms.pcs.service.impl; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.utils.SecurityUtils; -import org.nl.wms.basedata.master.service.ClassstandardService; -import org.nl.wms.pcs.service.DeliveryOrderService; -import org.nl.wms.pcs.service.dto.DeliveryOrderDto; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** -* @description 服务实现 -* @author geng by -* @date 2022-06-01 -**/ -@Service -@RequiredArgsConstructor -@Slf4j -public class DeliveryOrderServiceImpl implements DeliveryOrderService { - private final ClassstandardService classstandardService; - @Override - public Map queryAll(Map whereJson, Pageable page){ - String deliver_code = MapUtil.getStr(whereJson, "deliver_code"); - String material = MapUtil.getStr(whereJson, "material"); - String parent_id = MapUtil.getStr(whereJson, "product_series"); - String begin_time = MapUtil.getStr(whereJson, "begin_time"); - String end_time = MapUtil.getStr(whereJson, "end_time"); - String status = MapUtil.getStr(whereJson, "status"); - String product_series = ""; - HashMap map = new HashMap<>(); - map.put("flag", "1"); - map.put("begin_time", begin_time); - map.put("end_time", end_time); - map.put("status", status); - if (StrUtil.isNotEmpty(material)) { - map.put("material", "%" + material + "%"); - } - if (StrUtil.isNotEmpty(parent_id)) { - product_series = classstandardService.getChildIdStr(parent_id); - map.put("product_series", product_series); - } - if (StrUtil.isNotEmpty(deliver_code)) { - map.put("deliver_code", "%" + deliver_code + "%"); - } - JSONObject json = WQL.getWO("PCS_DELIVERYORDER001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "deliveryorder.create_time desc"); - return json; - } - - @Override - public List queryAll(Map whereJson){ - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(DeliveryOrderDto.class); - return null; - } - - @Override - public DeliveryOrderDto findById(Long deliver_id) { - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - JSONObject json = wo.query("deliver_id = '" + deliver_id + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( DeliveryOrderDto.class); - } - return null; - } - - @Override - public DeliveryOrderDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( DeliveryOrderDto.class); - } - return null; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(DeliveryOrderDto dto) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - dto.setDeliver_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(DeliveryOrderDto dto) { - DeliveryOrderDto entity = this.findById(dto.getDeliver_id()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("pcs_delivery_order"); - for (Long deliver_id: ids) { - JSONObject param = new JSONObject(); - param.put("deliver_id", String.valueOf(deliver_id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/SaleOrderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/SaleOrderServiceImpl.java deleted file mode 100644 index 53f8edb..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/service/impl/SaleOrderServiceImpl.java +++ /dev/null @@ -1,155 +0,0 @@ - -package org.nl.wms.pcs.service.impl; - - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.utils.SecurityUtils; -import org.nl.wms.basedata.master.service.ClassstandardService; -import org.nl.wms.pcs.service.SaleOrderService; -import org.nl.wms.pcs.service.dto.SaleOrderDto; -import org.nl.wql.WQL; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** -* @description 服务实现 -* @author geng by -* @date 2022-06-01 -**/ -@Service -@RequiredArgsConstructor -@Slf4j -public class SaleOrderServiceImpl implements SaleOrderService { - private final ClassstandardService classstandardService; - @Override - public Map queryAll(Map whereJson, Pageable page){ - String sale_code = MapUtil.getStr(whereJson, "sale_code"); - String material = MapUtil.getStr(whereJson, "material"); - String parent_id = MapUtil.getStr(whereJson, "product_series"); - String begin_time = MapUtil.getStr(whereJson, "begin_time"); - String end_time = MapUtil.getStr(whereJson, "end_time"); - String status = MapUtil.getStr(whereJson, "status"); - String product_series = ""; - HashMap map = new HashMap<>(); - map.put("flag", "1"); - map.put("begin_time", begin_time); - map.put("end_time", end_time); - map.put("status", status); - if (StrUtil.isNotEmpty(sale_code)) { - map.put("sale_code", "%" + sale_code + "%"); - } - if (StrUtil.isNotEmpty(material)) { - map.put("material", "%" + material + "%"); - } - if (StrUtil.isNotEmpty(parent_id)) { - product_series = classstandardService.getChildIdStr(parent_id); - map.put("product_series", product_series); - } - JSONObject json = WQL.getWO("PCS_SALEORDER001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "saleorder.create_time desc"); - return json; - } - - @Override - public List queryAll(Map whereJson){ - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(SaleOrderDto.class); - return null; - } - - @Override - public SaleOrderDto findById(Long sale_id) { - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - JSONObject json = wo.query("sale_id = '" + sale_id + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( SaleOrderDto.class); - } - return null; - } - - @Override - public SaleOrderDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( SaleOrderDto.class); - } - return null; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(SaleOrderDto dto) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - dto.setSale_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - dto.setUpdate_time(now); - dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(SaleOrderDto dto) { - SaleOrderDto entity = this.findById(dto.getSale_id()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("pcs_sale_order"); - for (Long sale_id: ids) { - JSONObject param = new JSONObject(); - param.put("sale_id", String.valueOf(sale_id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); - } - } - -} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_DELIVERYORDER001.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_DELIVERYORDER001.wql deleted file mode 100644 index 25c25dc..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_DELIVERYORDER001.wql +++ /dev/null @@ -1,85 +0,0 @@ -[交易说明] - 交易名: 发货单查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.deliver_code TYPEAS s_string - 输入.material TYPEAS s_string - 输入.product_series TYPEAS f_string - 输入.status TYPEAS s_string - 输入.begin_time TYPEAS s_string - 输入.end_time TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - deliveryorder.*, - material.material_code, - material.material_name, - unit.unit_name - FROM - PCS_delivery_order deliveryorder - left join md_me_materialbase material on deliveryorder.material_id = material.material_id - left join md_pb_measureunit unit on deliveryorder.qty_unit_id = unit.measure_unit_id - WHERE - 1 = 1 - OPTION 输入.deliver_code <> "" - (deliveryorder.deliver_code like 输入.deliver_code) - ENDOPTION - OPTION 输入.status <> "" - deliveryorder.status = 输入.status - ENDOPTION - OPTION 输入.product_series <> "" - material.product_series in 输入.product_series - ENDOPTION - OPTION 输入.begin_time <> "" - deliveryorder.create_time >= 输入.begin_time - ENDOPTION - OPTION 输入.end_time <> "" - deliveryorder.create_time <= 输入.end_time - ENDOPTION - OPTION 输入.material <> "" - ( - material.material_code like 输入.material or - material.material_name like 输入.material or - material.material_spec like 输入.material - ) - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_SALEORDER001.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_SALEORDER001.wql deleted file mode 100644 index 7447c5d..0000000 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/PCS_SALEORDER001.wql +++ /dev/null @@ -1,85 +0,0 @@ -[交易说明] - 交易名: 销售订单查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.sale_code TYPEAS s_string - 输入.material TYPEAS s_string - 输入.product_series TYPEAS f_string - 输入.status TYPEAS s_string - 输入.begin_time TYPEAS s_string - 输入.end_time TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - saleorder.*, - material.material_code, - material.material_name, - unit.unit_name - FROM - PCS_sale_order saleorder - left join md_me_materialbase material on saleorder.material_id = material.material_id - left join md_pb_measureunit unit on saleorder.qty_unit_id = unit.measure_unit_id - WHERE - 1 = 1 - OPTION 输入.sale_code <> "" - (saleorder.sale_code like 输入.sale_code) - ENDOPTION - OPTION 输入.status <> "" - saleorder.status = 输入.status - ENDOPTION - OPTION 输入.product_series <> "" - material.product_series in 输入.product_series - ENDOPTION - OPTION 输入.begin_time <> "" - saleorder.create_time >= 输入.begin_time - ENDOPTION - OPTION 输入.end_time <> "" - saleorder.create_time <= 输入.end_time - ENDOPTION - OPTION 输入.material <> "" - ( - material.material_code like 输入.material or - material.material_name like 输入.material or - material.material_spec like 输入.material - ) - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/pcs.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pcs/wql/pcs.xls deleted file mode 100644 index 04d430dbd03187a8d0940ec39b0b3eba537ae5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291328 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 - - - info - - - diff --git a/mes/hd/新建文本文档.txt b/mes/hd/新建文本文档.txt deleted file mode 100644 index dd1ec20..0000000 --- a/mes/hd/新建文本文档.txt +++ /dev/null @@ -1 +0,0 @@ -132 \ No newline at end of file