From 427a3084a49cbf7499b718995c80998f1c9dc501 Mon Sep 17 00:00:00 2001 From: liuxy Date: Wed, 30 Aug 2023 18:17:11 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E4=B8=89=E7=BA=BF=E6=89=8B=E6=8C=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=EF=BC=9A=20=E5=8D=8A=E6=88=90=E5=93=81?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E3=80=81=E5=8D=8A=E6=88=90=E5=93=81=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E3=80=81=E7=A9=BA=E7=AE=B1=E5=87=BA=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/mapper/MdMeMaterialbaseMapper.xml | 3 +- .../nl/wms/storage_manage/pda/PDAEnum.java | 6 +- .../PdaStHrBcpEmpOutController.java | 52 +++++ .../controller/PdaStHrBcpInController.java | 60 ++++++ .../controller/PdaStHrBcpOutController.java | 54 ++++++ .../pda/service/PdaStHrBcpEmpOutService.java | 33 ++++ .../pda/service/PdaStHrBcpInService.java | 42 ++++ .../pda/service/PdaStHrBcpOutService.java | 34 ++++ .../impl/PdaStHrBcpEmpOutServiceImpl.java | 182 ++++++++++++++++++ .../service/impl/PdaStHrBcpInServiceImpl.java | 152 +++++++++++++++ .../impl/PdaStHrBcpOutServiceImpl.java | 157 +++++++++++++++ .../iostorInv/dao/StIvtIostorinvOrder.java | 7 +- .../impl/StIvtIostorinvEmpBcpServiceImpl.java | 2 +- .../mapper/xml/StIvtStructivtHrBcpMapper.xml | 1 + .../java/org/nl/wms/storage_manage/stivt.xls | Bin 436224 -> 436736 bytes 15 files changed, 780 insertions(+), 5 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpEmpOutController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpInController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpOutController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpEmpOutService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpInService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpOutService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpEmpOutServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpInServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpOutServiceImpl.java diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/masterdata_manage/service/material/dao/mapper/MdMeMaterialbaseMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/masterdata_manage/service/material/dao/mapper/MdMeMaterialbaseMapper.xml index 264b1a2c..1211fabb 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/masterdata_manage/service/material/dao/mapper/MdMeMaterialbaseMapper.xml +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/masterdata_manage/service/material/dao/mapper/MdMeMaterialbaseMapper.xml @@ -15,7 +15,8 @@ 1 = 1 and mater.material_type_id = '1528555445302726656' AND (mater.material_code LIKE '%${query.material_code}%' or - mater.material_name LIKE '%${query.material_code}%') + mater.material_name LIKE '%${query.material_code}%') or + mater.material_spec LIKE '%${query.material_code}%') order by mater.material_code ASC diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/PDAEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/PDAEnum.java index 2a11bca4..f8ade71d 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/PDAEnum.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/PDAEnum.java @@ -13,14 +13,16 @@ import java.util.Map; public enum PDAEnum { //点位区域 REGION_CODE(MapOf.of("半成品入库区域", "A1_BCPRK01", "半成品出库区域", "A1_BCPCK01","成品入库区域", - "A1_CPRK01","半成品盘点区域", "A1_BCP_PP","海柔半成品出库区域","A3_BCPCK01", - "发货区域","A1_FH01")), + "A1_CPRK01","半成品盘点区域", "A1_BCP_PP","海柔半成品出库区域","A3_BCPCK01","海柔半成品入库区域","A3_BCPRK01", + "发货区域","A1_FH01","三线半成品空箱出库区域","A3_BCPKXCK01")), //库区编码 SECT_CODE(MapOf.of("半成品库区", "KQ005")), //库区id SECT_ID(MapOf.of("成品库区", "1528631043496742912")), //仓库id STOR_ID(MapOf.of("紫铜三线半成品仓库", "15286279952695336963")), + //车间 + WORKSHOP_ID(MapOf.of("智能三线车间", "A3")), //物料类别 MATERIAL_CLASS(MapOf.of("管件原材料", "1503644349995552768","管件半成品", "1528555443906023424","管件成品", "1528555444031852544")), ; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpEmpOutController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpEmpOutController.java new file mode 100644 index 00000000..13e14969 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpEmpOutController.java @@ -0,0 +1,52 @@ +package org.nl.wms.storage_manage.pda.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.common.anno.Log; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpEmpOutService; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + *

+ * 手持半成品出库 前端控制器 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@RestController +@RequestMapping("/api/pda/hrBcp/empOut") +public class PdaStHrBcpEmpOutController { + + @Autowired + private PdaStHrBcpEmpOutService pdaStHrBcpEmpOutService; + + @PostMapping("/getIvt") + @Log("获取库存") + //("获取库存") + public ResponseEntity getMaterial(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaStHrBcpEmpOutService.getIvt(whereJson), HttpStatus.OK); + } + + @PostMapping("/getPoint") + @Log("获取入库点") + //("获取入库点") + public ResponseEntity getPoint() { + return new ResponseEntity<>(pdaStHrBcpEmpOutService.getPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("出库确认") + //("出库确认") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaStHrBcpEmpOutService.confirm(whereJson), HttpStatus.OK); + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpInController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpInController.java new file mode 100644 index 00000000..3e9601c5 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpInController.java @@ -0,0 +1,60 @@ +package org.nl.wms.storage_manage.pda.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.common.anno.Log; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpInService; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + *

+ * 手持半成品入库 前端控制器 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@RestController +@RequestMapping("/api/pda/hrBcp/iosIn") +public class PdaStHrBcpInController { + + @Autowired + private PdaStHrBcpInService pdaStHrBcpInService; + + @PostMapping("/getMaterial") + @Log("查询物料") + //("查询物料") + public ResponseEntity getMaterial(@RequestBody JSONObject whereJson, PageQuery pageQuery) { + return new ResponseEntity<>(pdaStHrBcpInService.getMaterial(whereJson,pageQuery), HttpStatus.OK); + } + + @PostMapping("/getWork") + @Log("获取工序下拉框") + //("获取工序下拉框") + public ResponseEntity getWork() { + return new ResponseEntity<>(pdaStHrBcpInService.getWork(), HttpStatus.OK); + } + + @PostMapping("/getPoint") + @Log("获取入库点") + //("获取入库点") + public ResponseEntity getPoint() { + return new ResponseEntity<>(pdaStHrBcpInService.getPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("确认入库") + //("确认入库") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaStHrBcpInService.confirm(whereJson), HttpStatus.OK); + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpOutController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpOutController.java new file mode 100644 index 00000000..a5ef4926 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/controller/PdaStHrBcpOutController.java @@ -0,0 +1,54 @@ +package org.nl.wms.storage_manage.pda.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.common.anno.Log; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpInService; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpOutService; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + *

+ * 手持半成品出库 前端控制器 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@RestController +@RequestMapping("/api/pda/hrBcp/iosOut") +public class PdaStHrBcpOutController { + + @Autowired + private PdaStHrBcpOutService pdaStHrBcpOutService; + + @PostMapping("/getIvt") + @Log("获取库存") + //("获取库存") + public ResponseEntity getMaterial(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaStHrBcpOutService.getIvt(whereJson), HttpStatus.OK); + } + + @PostMapping("/getPoint") + @Log("获取入库点") + //("获取入库点") + public ResponseEntity getPoint() { + return new ResponseEntity<>(pdaStHrBcpOutService.getPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("出库确认") + //("出库确认") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaStHrBcpOutService.confirm(whereJson), HttpStatus.OK); + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpEmpOutService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpEmpOutService.java new file mode 100644 index 00000000..0f698720 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpEmpOutService.java @@ -0,0 +1,33 @@ +package org.nl.wms.storage_manage.pda.service; + +import com.alibaba.fastjson.JSONObject; + +/** + *

+ * 手持半成品出库 服务类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +public interface PdaStHrBcpEmpOutService { + + /** + * 获取库存 + * @param whereJson / + * @return / + */ + JSONObject getIvt(JSONObject whereJson); + + /** + * 获取入库点 + * @return / + */ + JSONObject getPoint(); + + /** + * 出库确认 + * @return / + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpInService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpInService.java new file mode 100644 index 00000000..bd59a677 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpInService.java @@ -0,0 +1,42 @@ +package org.nl.wms.storage_manage.pda.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.domain.query.PageQuery; + +/** + *

+ * 手持半成品入库 服务类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +public interface PdaStHrBcpInService { + + /** + * 查询物料 + * @param whereJson / + * @return JSONObject / + */ + JSONObject getMaterial(JSONObject whereJson, PageQuery pageQuery); + + /** + * 获取工序下拉框 + * @return / + */ + JSONObject getWork(); + + /** + * 确认入库 + * @param whereJson / + * @return / + */ + JSONObject confirm(JSONObject whereJson); + + /** + * 获取入库点 + * @return / + */ + JSONObject getPoint(); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpOutService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpOutService.java new file mode 100644 index 00000000..a59c465b --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/PdaStHrBcpOutService.java @@ -0,0 +1,34 @@ +package org.nl.wms.storage_manage.pda.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.common.domain.query.PageQuery; + +/** + *

+ * 手持半成品出库 服务类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +public interface PdaStHrBcpOutService { + + /** + * 获取库存 + * @param whereJson / + * @return / + */ + JSONObject getIvt(JSONObject whereJson); + + /** + * 获取入库点 + * @return / + */ + JSONObject getPoint(); + + /** + * 出库确认 + * @return / + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpEmpOutServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpEmpOutServiceImpl.java new file mode 100644 index 00000000..95e50e14 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpEmpOutServiceImpl.java @@ -0,0 +1,182 @@ +package org.nl.wms.storage_manage.pda.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.modules.common.exception.BadRequestException; +import org.nl.modules.wql.util.SpringContextHolder; +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.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.product_manage.service.workprocedure.IPdmBiWorkprocedureService; +import org.nl.wms.scheduler_manage.service.point.ISchBasePointService; +import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint; +import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask; +import org.nl.wms.storage_manage.IOSEnum; +import org.nl.wms.storage_manage.IVTEnum; +import org.nl.wms.storage_manage.pda.PDAEnum; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpEmpOutService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl.StIvtIostorinvEmpBcpServiceImpl; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper.StIvtStructivtHrBcpMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + *

+ * 手持半成品入库 服务实现类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@Service +public class PdaStHrBcpEmpOutServiceImpl implements PdaStHrBcpEmpOutService { + + @Autowired + private IMdMeMaterialbaseService iMdMeMaterialbaseService; // 物料服务 + + @Autowired + private IPdmBiWorkprocedureService iPdmBiWorkprocedureService; // 工序服务 + + @Autowired + private IStIvtIostorinvOrderService iStIvtIostorinvOrderService; // 出入库顺序服务 + + @Autowired + private ISchBasePointService iSchBasePointService; // 点位服务 + + @Autowired + private StIvtStructivtHrBcpMapper stIvtStructivtHrBcpMapper; //库存服务mapper + + @Autowired + protected IMdPbMeasureunitService iMdPbMeasureunitService; // 计量单位服务 + + @Autowired + private IStIvtStructattrService structattrService; // 仓位服务 + + @Autowired + private IStIvtSectattrService sectattrService; // 库区服务 + + @Override + public JSONObject getIvt(JSONObject whereJson) { + + StIvtSectattr sect = sectattrService.getOne( + new QueryWrapper().lambda() + .eq(StIvtSectattr::getSect_name, "海柔半成品库区") + ); + + List list = new ArrayList<>(); + if (ObjectUtil.isEmpty(whereJson.getString("storagevehicle_code"))) { + list = structattrService.list( + new QueryWrapper().lambda() + .eq(StIvtStructattr::getSect_id, sect.getSect_id()) + .eq(StIvtStructattr::getStor_id, sect.getStor_id()) + .eq(StIvtStructattr::getIs_used, true) + .eq(StIvtStructattr::getIs_emptyvehicle, true) + .eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .and(qr -> qr.ne(StIvtStructattr::getStoragevehicle_code, "") + .or().isNull(StIvtStructattr::getStoragevehicle_code) + ) + .orderByDesc(StIvtStructattr::getXqty) + .orderByAsc(StIvtStructattr::getYqty) + ); + } else { + list = structattrService.list( + new QueryWrapper().lambda() + .eq(StIvtStructattr::getSect_id, sect.getSect_id()) + .eq(StIvtStructattr::getStor_id, sect.getStor_id()) + .eq(StIvtStructattr::getIs_used, true) + .eq(StIvtStructattr::getIs_emptyvehicle, true) + .eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .and(qr -> qr.ne(StIvtStructattr::getStoragevehicle_code, "") + .or().isNull(StIvtStructattr::getStoragevehicle_code) + ) + .likeRight(StIvtStructattr::getStoragevehicle_code, whereJson.getString("storagevehicle_code")) + .orderByDesc(StIvtStructattr::getXqty) + .orderByAsc(StIvtStructattr::getYqty) + ); + } + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("message", "查询成功"); + return result; + } + + @Override + public JSONObject getPoint() { + List list = iSchBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_code, PDAEnum.REGION_CODE.code("三线半成品空箱出库区域")) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_USED.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_USED.code("否")) + ); + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("message", "查询成功"); + return result; + } + + @Override + @Transactional + public JSONObject confirm(JSONObject whereJson) { + String point_code = whereJson.getString("point_code"); + + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空!"); + + JSONArray rows = whereJson.getJSONArray("rows"); + + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.getJSONObject(i); + + StIvtStructattr attrDao = structattrService.getById(json.getString("struct_id")); + + // 1.生成任务 + SchBaseTask taskDao = new SchBaseTask(); + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_HR_EMP_OUT) + .acs_task_type("16") + .task_group_id(IdUtil.getStringId()) + .point_code1(attrDao.getStruct_code()) + .point_code3(point_code) + .vehicle_code(attrDao.getStoragevehicle_code()) + .product_area("A3") + .callback((Consumer) taskDao::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + + // 2.下发任务 + StIvtIostorinvEmpBcpServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvEmpBcpServiceImpl.class); + bean.sendTask(taskDao.getTask_id()); + + // 3.锁定货位 + attrDao.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁")); + structattrService.updateById(attrDao); + + } + + JSONObject result = new JSONObject(); + result.put("data", ""); + result.put("message", "出库成功"); + return result; + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpInServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpInServiceImpl.java new file mode 100644 index 00000000..81e049e6 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpInServiceImpl.java @@ -0,0 +1,152 @@ +package org.nl.wms.storage_manage.pda.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.IdUtil; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService; +import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase; +import org.nl.wms.product_manage.service.workprocedure.IPdmBiWorkprocedureService; +import org.nl.wms.scheduler_manage.service.point.ISchBasePointService; +import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint; +import org.nl.wms.storage_manage.IOSEnum; +import org.nl.wms.storage_manage.pda.PDAEnum; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpInService; +import org.nl.wms.storage_manage.pda.service.dto.PdaQuery; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 手持半成品入库 服务实现类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@Service +public class PdaStHrBcpInServiceImpl implements PdaStHrBcpInService { + + @Autowired + private IMdMeMaterialbaseService iMdMeMaterialbaseService; // 物料服务 + + @Autowired + private IPdmBiWorkprocedureService iPdmBiWorkprocedureService; // 工序服务 + + @Autowired + private IStIvtIostorinvOrderService iStIvtIostorinvOrderService; // 出入库顺序服务 + + @Autowired + private ISchBasePointService iSchBasePointService; // 点位服务 + + @Override + public JSONObject getMaterial(JSONObject whereJson1, PageQuery pageQuery) { + PdaQuery whereJson = new PdaQuery(); + whereJson.setMaterial_code(whereJson1.getString("material_spec")); + int size = whereJson1.getIntValue("size"); + + int totalCount = 0; + + List list = new ArrayList<>(); + if (ObjectUtil.isEmpty(whereJson1.getString("material_spec"))) { + List list1 = iMdMeMaterialbaseService.list( + new QueryWrapper().lambda() + .eq(MdMeMaterialbase::getMaterial_type_id, "1528555445302726656") + ); + list = list1.subList(0, Math.min(list1.size(), size)); + totalCount = list1.size(); + } else { + List list1 = iMdMeMaterialbaseService.getPdaBcpGetMaterial(whereJson, pageQuery); + list = list1.subList(0, Math.min(list1.size(), size)); + totalCount = list1.size(); + } + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("totalCount", totalCount); + result.put("message", "查询成功"); + return result; + } + + @Override + public JSONObject getWork() { + JSONArray array = iPdmBiWorkprocedureService.downSelect(PDAEnum.WORKSHOP_ID.code("智能三线车间")); + + JSONObject result = new JSONObject(); + result.put("data", array); + result.put("message", "查询成功"); + return result; + + } + + @Override + public JSONObject getPoint() { + List list = iSchBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_code, PDAEnum.REGION_CODE.code("海柔半成品入库区域")) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_USED.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_USED.code("否")) + ); + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("message", "查询成功"); + return result; + } + + @Override + @Transactional + public JSONObject confirm(JSONObject whereJson) { + // 校验 + if (ObjectUtil.isEmpty(whereJson.getString("material_code"))) throw new BadRequestException("请选择物料!"); + if (ObjectUtil.isEmpty(whereJson.getString("qty"))) throw new BadRequestException("请填写数量!"); + if (ObjectUtil.isEmpty(whereJson.getString("bar_code"))) throw new BadRequestException("请扫码!"); + if (ObjectUtil.isEmpty(whereJson.getString("point_code"))) throw new BadRequestException("请选择点位!"); + + + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getOne( + new QueryWrapper().lambda() + .eq(MdMeMaterialbase::getMaterial_code, whereJson.getString("material_code")) + , false); + + // 插入出入库顺序表 + StIvtIostorinvOrder dao = new StIvtIostorinvOrder(); + dao.setOrder_id(IdUtil.getStringId()); + dao.setWorkshop_id(PDAEnum.WORKSHOP_ID.code("智能三线车间")); + dao.setStor_id(PDAEnum.STOR_ID.code("紫铜三线半成品仓库")); + dao.setIn_device(whereJson.getString("point_code")); + dao.setBar_code(whereJson.getString("bar_code")); + dao.setMaterial_id(materDao.getMaterial_id()); + dao.setSale_id(whereJson.getString("sale_id")); + + // 重量 : kg + double weight = NumberUtil.div(NumberUtil.mul(materDao.getNet_weight().doubleValue(), whereJson.getDoubleValue("qty")), 1000); + dao.setWeight(BigDecimal.valueOf(weight)); + dao.setQty(whereJson.getBigDecimal("qty")); + dao.setType(IOSEnum.IO_TYPE.check("入库")); + dao.setIs_delete(false); + dao.setCreate_time(DateUtil.now()); + dao.setBiz_date(DateUtil.today()); + dao.setWorkprocedure_id(whereJson.getString("workprocedure_id")); + iStIvtIostorinvOrderService.save(dao); + + JSONObject result = new JSONObject(); + result.put("data", ""); + result.put("message", "操作成功"); + return result; + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpOutServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpOutServiceImpl.java new file mode 100644 index 00000000..6b675b95 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/pda/service/impl/PdaStHrBcpOutServiceImpl.java @@ -0,0 +1,157 @@ +package org.nl.wms.storage_manage.pda.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.nl.modules.common.exception.BadRequestException; +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.storage.service.storage.IStIvtStructattrService; +import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr; +import org.nl.wms.product_manage.service.workprocedure.IPdmBiWorkprocedureService; +import org.nl.wms.scheduler_manage.service.point.ISchBasePointService; +import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint; +import org.nl.wms.storage_manage.IOSEnum; +import org.nl.wms.storage_manage.IVTEnum; +import org.nl.wms.storage_manage.pda.PDAEnum; +import org.nl.wms.storage_manage.pda.service.PdaStHrBcpOutService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpOutService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper.StIvtStructivtHrBcpMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 手持半成品入库 服务实现类 + *

+ * + * @author Liuxy + * @since 2023-08-30 + */ +@Service +public class PdaStHrBcpOutServiceImpl implements PdaStHrBcpOutService { + + @Autowired + private IMdMeMaterialbaseService iMdMeMaterialbaseService; // 物料服务 + + @Autowired + private ISchBasePointService iSchBasePointService; // 点位服务 + + @Autowired + private StIvtStructivtHrBcpMapper stIvtStructivtHrBcpMapper; //库存服务mapper + + @Autowired + protected IMdPbMeasureunitService iMdPbMeasureunitService; // 计量单位服务 + + @Autowired + private IStIvtStructattrService structattrService; // 仓位服务 + + @Autowired + private IStIvtIostorinvHrBcpOutService iStIvtIostorinvHrBcpOutService; // 半成品出库服务 + + @Override + public JSONObject getIvt(JSONObject whereJson) { + + JSONObject param = new JSONObject(); + param.put("material_code", whereJson.getString("material_spec")); + + List list = stIvtStructivtHrBcpMapper.getPdaBcpIvt(param); + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("message", "查询成功"); + return result; + } + + @Override + public JSONObject getPoint() { + List list = iSchBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_code, PDAEnum.REGION_CODE.code("海柔半成品出库区域")) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_USED.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_USED.code("否")) + ); + + JSONObject result = new JSONObject(); + result.put("data", JSONArray.parseArray(JSON.toJSONString(list))); + result.put("message", "查询成功"); + return result; + } + + @Override + @Transactional + public JSONObject confirm(JSONObject whereJson) { + String point_code = whereJson.getString("point_code"); + + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空!"); + + // 组织数据出库 + JSONArray rows = whereJson.getJSONArray("rows"); + + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.getJSONObject(i); + + JSONObject jsonMst = new JSONObject(); + jsonMst.put("biz_date", DateUtil.today()); + jsonMst.put("bill_type", IOSEnum.BILL_TYPE_HR.code("生产出库")); + jsonMst.put("remark", "手持PDA创建" ); + jsonMst.put("product_code", PDAEnum.WORKSHOP_ID.code("智能三线车间") ); + jsonMst.put("point_code", point_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", json.getString("material_id")); + jsonDtl.put("pcsn", ""); + jsonDtl.put("plan_qty", json.getString("canuse_qty")); + jsonDtl.put("quality_scode", IVTEnum.QUALITY_SCODE.code("合格品")); + jsonDtl.put("base_bill_code", ""); + + 物料信息: + { + MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById( json.getString("material_id")); + MdPbMeasureunit untiDao = iMdPbMeasureunitService.getById(materDao.getBase_unit_id()); + + jsonDtl.put("qty_unit_id", untiDao.getMeasure_unit_id()); + jsonDtl.put("qty_unit_name", untiDao.getUnit_name()); + jsonDtl.put("unit_weight", materDao.getNet_weight()); + jsonDtl.put("storagevehicle_code", json.getString("storagevehicle_code")); + } + + 仓位信息: + { + StIvtStructattr attrDao = structattrService.getById(json.getString("struct_id")); + + jsonDtl.put("sect_id", attrDao.getSect_id()); + jsonDtl.put("sect_code", attrDao.getSect_code()); + jsonDtl.put("sect_name", attrDao.getSect_name()); + jsonDtl.put("struct_id", attrDao.getStruct_id()); + jsonDtl.put("struct_code", attrDao.getStruct_code()); + jsonDtl.put("struct_name", attrDao.getStruct_name()); + } + + tableData.add(jsonDtl); + jsonMst.put("tableData",tableData); + + // 调用出库服务 + iStIvtIostorinvHrBcpOutService.create(jsonMst); + } + + JSONObject result = new JSONObject(); + result.put("data", ""); + result.put("message", "出库成功"); + return result; + } +} 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 index 224b7fa3..b754543f 100644 --- 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 @@ -89,10 +89,15 @@ public class StIvtIostorinvOrder implements Serializable { */ private String type; + /** + * 工序标识 + */ + private String workprocedure_id; + /** * 是否删除 */ - private boolean is_delete; + private Boolean is_delete; /** * 创建时间 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 index aecb3f03..1a89659e 100644 --- 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 @@ -262,7 +262,7 @@ public class StIvtIostorinvEmpBcpServiceImpl implements IStIvtIostorinvEmpBcpSe * 下发任务 * @param task_id / */ - private void sendTask(String task_id) { + public void sendTask(String task_id) { SchBaseTask taskDao = iSchBaseTaskService.getById(task_id); JSONArray param = new JSONArray(); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml index 07fa7c66..49fd4310 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml @@ -160,6 +160,7 @@ unit.unit_name, ROUND(ivt.canuse_qty / mater.net_weight,3) AS qty, attr.struct_name, + attr.struct_code, attr.sect_code, attr.sect_name, attr.stor_name, 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 ff3593955c606e4a24d744094316912e90150efd..ed3c910616e123ee182a5c8d3be7433bc7eab8e5 100644 GIT binary patch delta 10156 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 delta 10341 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