From 60058e963fe6233588aa0664d861daedabd70d89 Mon Sep 17 00:00:00 2001 From: liuxy Date: Fri, 11 Aug 2023 18:56:01 +0800 Subject: [PATCH] =?UTF-8?q?rev=EF=BC=9A1.=E6=B5=B7=E6=9F=94=E5=8D=8A?= =?UTF-8?q?=E6=88=90=E5=93=81acs=E4=B8=8Emes=E6=8E=A5=E5=8F=A3=202.?= =?UTF-8?q?=E5=8D=8A=E6=88=90=E5=93=81=E3=80=81=E6=88=90=E5=93=81=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=A2=9E=E5=8A=A0=E5=8D=95=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/common/enums/AcsTaskEnum.java | 4 +- .../acs/rest/AcsToWmsController.java | 8 + .../acs/service/AcsToWmsService.java | 13 + .../acs/service/impl/AcsToWmsServiceImpl.java | 94 +++++- .../org/nl/wms/storage_manage/IOSEnum.java | 6 +- .../structIvt/dao/StIvtStructivtCp.java | 5 + .../dao/mapper/StIvtStructivtCpMapper.xml | 1 + .../impl/StIvtStructivtCpServiceImpl.java | 1 + .../productmanage/util/RuleUtil.java | 6 + .../util/impl/DivRuleCpServiceImpl.java | 15 + .../storage_manage/semimanage/TASKEnum.java | 9 + .../impl/StIvtIostorinvBcpServiceImpl.java | 1 + .../structIvt/dao/StIvtStructivtBcp.java | 5 + .../IStIvtIostorinvEmpBcpService.java | 47 +++ .../IStIvtIostorinvHrBcpInService.java | 10 + .../IStIvtIostorinvOrderService.java | 16 + .../iostorInv/dao/StIvtIostorinvOrder.java | 102 +++++++ .../dao/mapper/StIvtIostorinvOrderMapper.java | 17 ++ .../mapper/xml/StIvtIostorinvOrderMapper.xml | 4 + .../impl/StIvtIostorinvEmpBcpServiceImpl.java | 286 ++++++++++++++++++ .../StIvtIostorinvHrBcpInServiceImpl.java | 73 +++++ .../impl/StIvtIostorinvOrderServiceImpl.java | 19 ++ .../java/org/nl/wms/storage_manage/stivt.xls | Bin 432128 -> 436224 bytes .../product/productIvt/index.vue | 5 + .../semiproduct/semiproductIvt/index.vue | 5 + 25 files changed, 745 insertions(+), 7 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvEmpBcpService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvOrderService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvOrder.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvOrderMapper.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvOrderMapper.xml create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvEmpBcpServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvOrderServiceImpl.java diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java index 99c52985..acce4100 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/AcsTaskEnum.java @@ -43,7 +43,9 @@ public enum AcsTaskEnum { TASK_STRUCT_HR_IN("26","入库-海柔半成品-生产入库"), TASK_STRUCT_HR_OUT("27","出库-海柔半成品-生产出库"), TASK_STRUCT_HR_CHECK("28","海柔半成品-盘点"), - TASK_STRUCT_CP_CHECK("13","-盘点"), + TASK_STRUCT_HR_EMP_IN("29","入库-海柔半成品-空托盘"), + TASK_STRUCT_HR_EMP_OUT("30","出库-海柔半成品-空托盘"), + TASK_STRUCT_CP_CHECK("13","成品-盘点"), TASK_WASH_LACK("20","清洗机-缺料请求"), TASK_WASH_EMP("21","清洗机-空框请求"), TASK_WASH_FULL_AUTO("22","清洗机-满料请求自动"),//去半成品入库:参数不全也去异常处理位 diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/rest/AcsToWmsController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/rest/AcsToWmsController.java index 20472e0a..0fa7616e 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/rest/AcsToWmsController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/rest/AcsToWmsController.java @@ -120,6 +120,14 @@ public class AcsToWmsController { return new ResponseEntity<>( HttpStatus.OK); } + @PostMapping("/deviceApply") + @Log("海柔半成品任务申请") + //("海柔半成品任务申请") + @SaIgnore + public ResponseEntity deviceApply(@RequestBody JSONObject string) { + return new ResponseEntity<>(acsToWmsService.deviceApply(string),HttpStatus.OK); + } + @GetMapping("/taskPublish") @Log("taskPublish") diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/AcsToWmsService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/AcsToWmsService.java index f34d183e..13eaebdf 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/AcsToWmsService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/AcsToWmsService.java @@ -82,4 +82,17 @@ public interface AcsToWmsService { * @return */ void feedOrderRealQty(JSONObject string); + + /** + * + * @param json { + * type: 类型 + * device_code1: 设备1 + * barcode1: 条码1 + * device_code2: 设备2 + * barcode2: 条码2 + * } + * @return / + */ + Map deviceApply(JSONObject json); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/impl/AcsToWmsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/impl/AcsToWmsServiceImpl.java index 628d0751..d47ffee9 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/impl/AcsToWmsServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext_manage/acs/service/impl/AcsToWmsServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.wms.ext_manage.acs.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -32,6 +33,8 @@ import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService; import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder; import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService; import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; @@ -61,9 +64,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{ private IPdmBiDeviceService deviceService; @Autowired private ISchBaseTaskService itaskService; - - - + @Autowired + private IStIvtIostorinvHrBcpInService iStIvtIostorinvHrBcpInService; + @Autowired + private IStIvtIostorinvEmpBcpService iStIvtIostorinvEmpBcpService; @Override public Map apply(JSONObject param) { @@ -342,4 +346,88 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{ .set("dq_real_qty",dq_real_qty).eq("workorder_code",workorderCode)); } } + + @Override + public Map deviceApply(JSONObject json) { + /* + * 1.申请入满箱任务 + * 2.申请入空箱任务 + * 3.申请出满箱任务 + * 4.申请出空箱任务 + */ + HashMap result = new HashMap<>(); + + String type = json.getString("type"); + + try { + String device_code1 = json.getString("device_code1"); + String barcode1 = json.getString("barcode1"); + + if (ObjectUtil.isEmpty(device_code1)) throw new BadRequestException("设备不能为空!"); + + if (StrUtil.equals(type, "1")) { + /* 1.申请入满箱任务 */ + + if (ObjectUtil.isEmpty(barcode1)) throw new BadRequestException("条码不能为空!"); + + JSONObject param = new JSONObject(); + param.put("device_code",device_code1); + param.put("barcode",barcode1); + + // 1.调用入库服务 + iStIvtIostorinvHrBcpInService.fullIn(param); + + // 2.判断device_code2、barcode2 是否为空 + if (ObjectUtil.isNotEmpty(json.getString("device_code2")) && ObjectUtil.isNotEmpty(json.getString("barcode2"))) { + + param.put("device_code",json.getString("device_code2")); + param.put("barcode",json.getString("barcode2")); + iStIvtIostorinvHrBcpInService.fullIn(param); + } + } else if (StrUtil.equals(type, "2")) { + /* 2.申请入空箱任务 */ + + if (ObjectUtil.isEmpty(barcode1)) throw new BadRequestException("条码不能为空!"); + + JSONObject param = new JSONObject(); + param.put("device_code",device_code1); + param.put("barcode",barcode1); + + // 1.调用空托盘入库服务 + iStIvtIostorinvEmpBcpService.InEmp(param); + + // 2.判断device_code2、barcode2 是否为空 + if (ObjectUtil.isNotEmpty(json.getString("device_code2")) && ObjectUtil.isNotEmpty(json.getString("barcode2"))) { + param.put("device_code",json.getString("device_code2")); + param.put("barcode",json.getString("barcode2")); + iStIvtIostorinvEmpBcpService.InEmp(param); + } + } else if (StrUtil.equals(type, "3")) { + /* 3.申请出满箱任务 */ + + } else if (StrUtil.equals(type, "4")) { + /* 4.申请出空箱任务 */ + + JSONObject param = new JSONObject(); + param.put("device_code",device_code1); + param.put("barcode",barcode1); + + // 1.调用空托盘出库库服务 + iStIvtIostorinvEmpBcpService.OutEmp(param); + + // 2.判断device_code2、barcode2 是否为空 + if (ObjectUtil.isNotEmpty(json.getString("device_code2"))) { + param.put("device_code",json.getString("device_code2")); + iStIvtIostorinvEmpBcpService.OutEmp(param); + } + } + + } catch (Exception e) { + result.put("status", HttpStatus.BAD_REQUEST.value()); + result.put("message", e.getMessage()); + } + result.put("status", HttpStatus.OK.value()); + result.put("message", ""); + return result; + } } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/IOSEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/IOSEnum.java index 5a0ed5e3..2f829017 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/IOSEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/IOSEnum.java @@ -20,7 +20,7 @@ public enum IOSEnum { //是否 IS_USED(MapOf.of("是", "1", "否", "0")), //仓库编码 - STOR_CODE(MapOf.of("原材料仓", "1528627964823080960", "半成品仓库", "15286279952695336962","成品库", "1528627995269533696")), + STOR_CODE(MapOf.of("原材料仓", "1528627964823080960", "半成品仓库", "15286279952695336962","成品库", "1528627995269533696","海柔半成品","15286279952695336963")), //库区编码 SECT_CODE(MapOf.of("成品库区", "1528631043496742912", "半成品库区", "1528631044482404352")), //托盘超限类型 @@ -36,8 +36,8 @@ public enum IOSEnum { ORDER_STATUS(MapOf.of("生成", "10", "提交", "20", "发货中", "30", "确认", "99")), //锁定类型 LOCK_TYPE(MapOf.of("未锁定", "0", "入库锁", "1", "出库锁", "2","盘点锁", "3","损溢锁", "4","拼盘锁","5","其他锁","99")), - // 海柔半成品出库类型 - BILL_TYPE_HR(MapOf.of("生产出库", "1001", "盘点出库", "1002", "手工出库", "1009")), + // 海柔半成品出入库类型 + BILL_TYPE_HR(MapOf.of("生产出库", "1001", "盘点出库", "1002", "手工出库", "1009","生产入库","0001")), ; private Map code; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/StIvtStructivtCp.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/StIvtStructivtCp.java index d455b865..5582c51e 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/StIvtStructivtCp.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/StIvtStructivtCp.java @@ -121,5 +121,10 @@ public class StIvtStructivtCp implements Serializable { */ private BigDecimal unit_weight; + /** + * 单据类型 + */ + private String bill_type; + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/mapper/StIvtStructivtCpMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/mapper/StIvtStructivtCpMapper.xml index df77f750..4afe6843 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/mapper/StIvtStructivtCpMapper.xml +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/dao/mapper/StIvtStructivtCpMapper.xml @@ -152,6 +152,7 @@ mater.material_spec, attr.storagevehicle_code, ivt.canuse_qty, + ivt.bill_type, ivt.frozen_qty, ivt.ivt_qty, ivt.warehousing_qty, diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/impl/StIvtStructivtCpServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/impl/StIvtStructivtCpServiceImpl.java index fb1461fb..932a8355 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/impl/StIvtStructivtCpServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/service/structIvt/impl/StIvtStructivtCpServiceImpl.java @@ -187,6 +187,7 @@ public class StIvtStructivtCpServiceImpl extends ServiceImpl().lambda() + .eq(StIvtStructattr::getStor_id, stor_id) + .eq(StIvtStructattr::getSect_id, sect_id) + .eq(StIvtStructattr::getIs_used, IOSEnum.IS_USED.code("是")) + .eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .and(qr -> qr.ne(StIvtStructattr::getStoragevehicle_code,"") + .or().isNull(StIvtStructattr::getStoragevehicle_code) + ) + .eq(StIvtStructattr::getIs_emptyvehicle, true) + .orderByDesc(StIvtStructattr::getXqty) + .orderByAsc(StIvtStructattr::getYqty) + , false); + break; default: return null; } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/TASKEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/TASKEnum.java index e8c73611..c5587518 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/TASKEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/TASKEnum.java @@ -16,6 +16,7 @@ import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcp import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcpService; import org.nl.wms.storage_manage.semimanage.service.shutFrame.IStIvtShutframeinvBcpService; import org.nl.wms.storage_manage.semimanagehr.service.check.IStIvtCheckmstHrBcpService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpOutService; @@ -81,6 +82,14 @@ public enum TASKEnum implements FunctionStrategy { IStIvtCheckmstHrBcpService bean = SpringContextHolder.getBean(IStIvtCheckmstHrBcpService.class); bean.taskOperate(form); }), + HR_BCP_EMP_IN_TASK(type -> AcsTaskEnum.TASK_STRUCT_HR_EMP_IN.getCode().equals(type), form -> { + IStIvtIostorinvEmpBcpService bean = SpringContextHolder.getBean(IStIvtIostorinvEmpBcpService.class); + bean.taskOperateIn(form); + }), + HR_BCP_EMP_OUT_TASK(type -> AcsTaskEnum.TASK_STRUCT_HR_EMP_OUT.getCode().equals(type), form -> { + IStIvtIostorinvEmpBcpService bean = SpringContextHolder.getBean(IStIvtIostorinvEmpBcpService.class); + bean.taskOperateOut(form); + }), ; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/service/iostorInv/impl/StIvtIostorinvBcpServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/service/iostorInv/impl/StIvtIostorinvBcpServiceImpl.java index 207f3641..3729eebe 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/service/iostorInv/impl/StIvtIostorinvBcpServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanage/service/iostorInv/impl/StIvtIostorinvBcpServiceImpl.java @@ -264,6 +264,7 @@ public class StIvtIostorinvBcpServiceImpl extends ServiceImpl + * 半成品空载具服务 服务类 + *

+ * + * @author generator + * @since 2023-08-01 + */ +public interface IStIvtIostorinvEmpBcpService { + + /** + * acs申请入空箱 + * @param json { + * device_code: 设备 + * barcode: 条码 + * } + */ + void InEmp(JSONObject json); + + /** + * 入空托盘任务反馈 + * @param form / + */ + void taskOperateIn(JSONObject form); + + + /** + * acs申请出空箱 + * @param json { + * device_code: 设备 + * } + */ + void OutEmp(JSONObject json); + + /** + * 出空托盘任务反馈 + * @param form / + */ + void taskOperateOut(JSONObject form); + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java index 4794ea8c..841f0727 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java @@ -59,4 +59,14 @@ public interface IStIvtIostorinvHrBcpInService extends IService getPdaAll(JSONObject form); + /** + * acs 申请入满箱任务 + * @param / + * { + * device_code : 设备 + * barcode : 条码 + * } + */ + void fullIn(JSONObject json); + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvOrderService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvOrderService.java new file mode 100644 index 00000000..2ac3d2d2 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvOrderService.java @@ -0,0 +1,16 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder; + +/** + *

+ * 出入库顺序表 服务类 + *

+ * + * @author generator + * @since 2023-08-01 + */ +public interface IStIvtIostorinvOrderService extends IService { + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvOrder.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvOrder.java new file mode 100644 index 00000000..224b7fa3 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvOrder.java @@ -0,0 +1,102 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * 出入库顺序表 + *

+ * + * @author generator + * @since 2023-08-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_iostorinv_order_bcp") +public class StIvtIostorinvOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 顺序标识 + */ + @TableId(value = "order_id") + private String order_id; + + /** + * 车间 + */ + private String workshop_id; + + /** + * 仓库标识 + */ + private String stor_id; + + /** + * 输送设备 + */ + private String out_device; + + /** + * 来源设备 + */ + private String in_device; + + /** + * 条码 + */ + private String bar_code; + + /** + * 业务日期 + */ + private String biz_date; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 订单 + */ + private String sale_id; + + /** + * 工单 + */ + private String workorder_id; + + /** + * 重量 + */ + private BigDecimal weight; + + /** + * 数量 + */ + private BigDecimal qty; + + /** + * 出入类型 + */ + private String type; + + /** + * 是否删除 + */ + private boolean is_delete; + + /** + * 创建时间 + */ + private String create_time; + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvOrderMapper.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvOrderMapper.java new file mode 100644 index 00000000..d02d6f9e --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvOrderMapper.java @@ -0,0 +1,17 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.common.anno.Datazhuazhua; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder; + +/** + *

+ * 出入库顺序表 Mapper 接口 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Datazhuazhua +public interface StIvtIostorinvOrderMapper extends BaseMapper { +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvOrderMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvOrderMapper.xml new file mode 100644 index 00000000..29ec6dc7 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvOrderMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvEmpBcpServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvEmpBcpServiceImpl.java new file mode 100644 index 00000000..13ad6406 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvEmpBcpServiceImpl.java @@ -0,0 +1,286 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.nl.common.enums.AcsTaskEnum; +import org.nl.common.publish.BussEventMulticaster; +import org.nl.common.publish.event.PointEvent; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.MapOf; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext_manage.acs.service.WmsToAcsService; +import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtSectattrService; +import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService; +import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtSectattr; +import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr; +import org.nl.wms.scheduler_manage.service.extendtask.manage.TaskStatusEnum; +import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService; +import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask; +import org.nl.wms.storage_manage.IOSEnum; +import org.nl.wms.storage_manage.productmanage.util.DivRuleCpService; +import org.nl.wms.storage_manage.productmanage.util.RuleUtil; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; +import java.util.function.Consumer; + +/** + *

+ * 半成品空载具 服务实现类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Service +public class StIvtIostorinvEmpBcpServiceImpl implements IStIvtIostorinvEmpBcpService { + + @Autowired + private IStIvtSectattrService sectattrService; // 库区服务 + + @Autowired + protected IStIvtStructattrService iStIvtStructattrService; // 仓位属性服务 + + @Autowired + private DivRuleCpService divRuleCpService; // 分配规则服务 + + @Autowired + private ISchBaseTaskService iSchBaseTaskService; // 任务表服务 + + @Override + @Transactional + public void InEmp(JSONObject json) { + /* + * 1.找一个空货位 + * 2.生成任务 + * 3.下发任务 + * 4.锁住货位 + */ + String device_code = json.getString("device_code"); // 设备 + String barcode = json.getString("barcode"); // 条码 + + if (ObjectUtil.isEmpty(device_code)) throw new BadRequestException("设备不能为空!"); + if (ObjectUtil.isEmpty(barcode)) throw new BadRequestException("条码不能为空!"); + + // 1.找一个空货位 + StIvtSectattr sect = sectattrService.getOne( + new QueryWrapper().lambda() + .eq(StIvtSectattr::getSect_name, "海柔半成品库区") + ); + + JSONObject jo = new JSONObject(); + jo.put("sect_id", sect.getSect_id()); + jo.put("stor_id", sect.getStor_id()); + jo.put("rule_type", RuleUtil.PRODUCTION_IN_1); + + // 调用服务 + StIvtStructattr arrtDao = divRuleCpService.divRuleIn(jo); + + if (ObjectUtil.isEmpty(arrtDao)) { + throw new BadRequestException("无可分配货位"); + } + + // 2.生成任务 + SchBaseTask taskDao = new SchBaseTask(); + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_HR_EMP_IN) + .acs_task_type("7") + .task_group_id(IdUtil.getStringId()) + .point_code1(device_code) + .point_code3(barcode) + .vehicle_code(barcode) + .product_area("A3") + .callback((Consumer) taskDao::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + + // 3.下发任务 + sendTask(taskDao.getTask_id()); + + // 4.锁定货位 + arrtDao.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); + iStIvtStructattrService.updateById(arrtDao); + } + + @Override + @Transactional + public void taskOperateIn(JSONObject form) { + String task_id = form.getString("task_id"); + String status = form.getString("status"); + SchBaseTask taskDao = iSchBaseTaskService.getById(task_id); + + if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) { + /* 完成 */ + + // 1.更新任务为完成 + taskDao.setTask_status(TaskStatusEnum.FINISHED.getCode()); + iSchBaseTaskService.updateById(taskDao); + + // 2.更新仓位:解锁仓位、更新载具、更新是否是空载具 + iStIvtStructattrService.update( + new UpdateWrapper().lambda() + .set(StIvtStructattr::getStoragevehicle_code, taskDao.getVehicle_code()) + .set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getIs_emptyvehicle, true) + .eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3()) + ); + + } else if (status.equals(AcsTaskEnum.STATUS_START.getCode())){ + /* 执行中 */ + + // 1.更新任务为执行中 + taskDao.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + iSchBaseTaskService.updateById(taskDao); + + }else if (status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())){ + /* 取消 */ + + // 1.更新任务为取消 + taskDao.setTask_status(TaskStatusEnum.CANCEL.getCode()); + iSchBaseTaskService.updateById(taskDao); + + // 2.更新仓位:解锁仓位 + iStIvtStructattrService.update( + new UpdateWrapper().lambda() + .set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3()) + ); + + } + } + + @Override + @Transactional + public void OutEmp(JSONObject json) { + /* + * 1.找一个空载具的货位 + * 2.生成任务 + * 3.下发任务 + */ + String device_code = json.getString("device_code"); + + // 1.找一个空载具的货位 + StIvtSectattr sect = sectattrService.getOne( + new QueryWrapper().lambda() + .eq(StIvtSectattr::getSect_name, "海柔半成品库区") + ); + + JSONObject jo = new JSONObject(); + jo.put("sect_id", sect.getSect_id()); + jo.put("stor_id", sect.getStor_id()); + jo.put("rule_type", RuleUtil.PRODUCTION_EMP_OUT_1); + + // 调用服务 + StIvtStructattr arrtDao = divRuleCpService.divRuleIn(jo); + + if (ObjectUtil.isEmpty(arrtDao)) { + throw new BadRequestException("没有可用的空托盘!"); + } + + // 2.生成任务 + SchBaseTask taskDao = new SchBaseTask(); + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_HR_EMP_OUT) + .acs_task_type("7") + .task_group_id(IdUtil.getStringId()) + .point_code1(arrtDao.getStruct_code()) + .point_code3(device_code) + .vehicle_code(arrtDao.getStoragevehicle_code()) + .product_area("A3") + .callback((Consumer) taskDao::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + + // 3.下发任务 + sendTask(taskDao.getTask_id()); + + // 4.锁定货位 + arrtDao.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); + iStIvtStructattrService.updateById(arrtDao); + + } + + @Override + @Transactional + public void taskOperateOut(JSONObject form) { + String task_id = form.getString("task_id"); + String status = form.getString("status"); + SchBaseTask taskDao = iSchBaseTaskService.getById(task_id); + + if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) { + /* 完成 */ + + // 1.更新任务为完成 + taskDao.setTask_status(TaskStatusEnum.FINISHED.getCode()); + iSchBaseTaskService.updateById(taskDao); + + // 2.更新仓位:解锁仓位、更新载具、更新是否是空载具 + iStIvtStructattrService.update( + new UpdateWrapper().lambda() + .set(StIvtStructattr::getStoragevehicle_code, "") + .set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getIs_emptyvehicle, false) + .eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code1()) + ); + + } else if (status.equals(AcsTaskEnum.STATUS_START.getCode())){ + /* 执行中 */ + + // 1.更新任务为执行中 + taskDao.setTask_status(TaskStatusEnum.EXECUTING.getCode()); + iSchBaseTaskService.updateById(taskDao); + + }else if (status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())){ + /* 取消 */ + + // 1.更新任务为取消 + taskDao.setTask_status(TaskStatusEnum.CANCEL.getCode()); + iSchBaseTaskService.updateById(taskDao); + + // 2.更新仓位:解锁仓位 + iStIvtStructattrService.update( + new UpdateWrapper().lambda() + .set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3()) + ); + + } + } + + /** + * 下发任务 + * @param task_id / + */ + private void sendTask(String task_id) { + + SchBaseTask taskDao = iSchBaseTaskService.getById(task_id); + JSONArray param = new JSONArray(); + param.add(JSON.parseObject(JSONUtil.toJsonStr(taskDao))); + + // 1.下发任务 + WmsToAcsService bean = SpringContextHolder.getBean(WmsToAcsService.class); + Map result = bean.issueTaskToAcs3(param); + + // 反馈失败报错 + if (!ObjectUtil.equal(MapUtil.getStr(result, "status"),"200")) { + throw new BadRequestException("下发失败:"+MapUtil.getStr(result, "message")); + } + + // 2.更新任务状态 + taskDao.setTask_status(TaskStatusEnum.ISSUE.getCode()); + iSchBaseTaskService.updateById(taskDao); + } + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java index 575c8c64..3a1b69a3 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java @@ -27,6 +27,8 @@ import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext_manage.acs.service.WmsToAcsService; +import org.nl.wms.masterdata_manage.service.master.IMdPbMeasureunitService; +import org.nl.wms.masterdata_manage.service.master.dao.MdPbMeasureunit; import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService; import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase; import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService; @@ -49,7 +51,9 @@ import org.nl.wms.storage_manage.productmanage.util.ChangeIvtUtil; import org.nl.wms.storage_manage.productmanage.util.DivRuleCpService; import org.nl.wms.storage_manage.productmanage.util.RuleUtil; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper.StIvtIostorinvHrBcpMapper; import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtHrBcpService; @@ -104,6 +108,15 @@ public class StIvtIostorinvHrBcpInServiceImpl extends ServiceImpl page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); @@ -420,6 +433,66 @@ public class StIvtIostorinvHrBcpInServiceImpl extends ServiceImpl().lambda() + .eq(StIvtIostorinvOrder::getIn_device, device_code) + .eq(StIvtIostorinvOrder::getBar_code, barcode) + .eq(StIvtIostorinvOrder::getType, IOSEnum.IO_TYPE.code("入库")) + .orderByDesc(StIvtIostorinvOrder::getCreate_time) + , false + ); + + if (ObjectUtil.isEmpty(orderDao)) throw new BadRequestException("此条码在系统中不存在记录"); + + // 2.创建入库单 + JSONObject jsonMst = new JSONObject(); + jsonMst.put("biz_date", DateUtil.today()); + jsonMst.put("bill_type", IOSEnum.BILL_TYPE_HR.code("生产入库")); + jsonMst.put("remark", "" ); + jsonMst.put("product_code", "A3" ); + jsonMst.put("point_code", device_code ); + jsonMst.put("stor_id", IOSEnum.STOR_CODE.code("海柔半成品")); + jsonMst.put("auto_send", "1"); // 是否自动创建任务并下发 + + JSONArray tableData = new JSONArray(); + + JSONObject jsonDtl = new JSONObject(); + jsonDtl.put("material_id", orderDao.getMaterial_id()); + jsonDtl.put("pcsn", ""); + jsonDtl.put("plan_qty", orderDao.getWeight()); + jsonDtl.put("quality_scode", IVTEnum.QUALITY_SCODE.code("合格品")); + + 物料信息: + { + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById(orderDao.getMaterial_id()); + MdPbMeasureunit untiDao = iMdPbMeasureunitService.getById(materDao.getBase_unit_id()); + + jsonDtl.put("base_unit_id", untiDao.getMeasure_unit_id()); + jsonDtl.put("base_unit_name", untiDao.getUnit_name()); + jsonDtl.put("unit_weight", materDao.getNet_weight()); + jsonDtl.put("storagevehicle_code", barcode); + } + tableData.add(jsonDtl); + jsonMst.put("tableData",tableData); + + // 调用创建方法并自动创建任务下发 + create(jsonMst); + } + private void delTask(String task_id) { StIvtIostorinvHrBcp mstDao = this.getOne( diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvOrderServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvOrderServiceImpl.java new file mode 100644 index 00000000..1bf0b451 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvOrderServiceImpl.java @@ -0,0 +1,19 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper.StIvtIostorinvOrderMapper; +import org.springframework.stereotype.Service; + +/** + *

+ * 出入库顺序表 服务实现类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Service +public class StIvtIostorinvOrderServiceImpl extends ServiceImpl implements IStIvtIostorinvOrderService { +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/stivt.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/stivt.xls index 620e21b7103a3e10b5b87dfbea5febad857a9c93..ff3593955c606e4a24d744094316912e90150efd 100644 GIT binary patch delta 14442 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 + @@ -140,6 +141,7 @@ export default { }, mixins: [presenter(), header(), crud()], // 数据字典 + dicts: ['ST_INV_CP_IN_TYPE'], data() { return { height: document.documentElement.clientHeight - 180 + 'px;', @@ -160,6 +162,9 @@ export default { }) }, methods: { + formatBillType(row, column) { + return this.dict.label.ST_INV_CP_IN_TYPE[row.bill_type] + } } } diff --git a/mes/qd/src/views/wms/storage_manage/semiproduct/semiproductIvt/index.vue b/mes/qd/src/views/wms/storage_manage/semiproduct/semiproductIvt/index.vue index 29f91a1d..ddfb78e1 100644 --- a/mes/qd/src/views/wms/storage_manage/semiproduct/semiproductIvt/index.vue +++ b/mes/qd/src/views/wms/storage_manage/semiproduct/semiproductIvt/index.vue @@ -88,6 +88,7 @@ + @@ -126,6 +127,7 @@ export default { }, mixins: [presenter(), header(), crud()], // 数据字典 + dicts: ['ST_INV_BCP_IN_TYPE'], data() { return { height: document.documentElement.clientHeight - 180 + 'px;', @@ -151,6 +153,9 @@ export default { this.crud.notify('导出成功', CRUD.NOTIFICATION_TYPE.SUCCESS) }) }, + formatBillType(row, column) { + return this.dict.label.ST_INV_BCP_IN_TYPE[row.bill_type] + } } }