From 2938cb17a45cf8096b6555884da4941f000374af Mon Sep 17 00:00:00 2001 From: liuxy Date: Tue, 1 Aug 2023 17:56:53 +0800 Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=B5=B7=E6=9F=94=E5=8D=8A?= =?UTF-8?q?=E6=88=90=E5=93=81=E5=85=A5=E5=BA=93=E3=80=81=E6=B5=B7=E6=9F=94?= =?UTF-8?q?=E5=8D=8A=E6=88=90=E5=93=81=E5=BA=93=E5=AD=98=E3=80=81=E6=B5=B7?= =?UTF-8?q?=E6=9F=94=E5=8D=8A=E6=88=90=E5=93=81=E5=BA=93=E5=AD=98=E5=8F=98?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/common/enums/AcsTaskEnum.java | 1 + .../util/impl/DivRuleCpServiceImpl.java | 6 +- .../storage_manage/semimanage/TASKEnum.java | 5 + .../StIvtIostorinvHrBcpInController.java | 125 ++++ .../StIvtIostorinvHrBcpOutController.java | 103 ++++ .../StIvtStructivtHrBcpController.java | 79 +++ .../StIvtStructivtflowHrBcpController.java | 36 ++ .../IStIvtIostorinvHrBcpInService.java | 62 ++ .../IStIvtIostorinvHrBcpOutService.java | 84 +++ .../iostorInv/dao/StIvtIostorinvHrBcp.java | 232 ++++++++ .../dao/mapper/StIvtIostorinvHrBcpMapper.java | 26 + .../mapper/xml/StIvtIostorinvHrBcpMapper.xml | 82 +++ .../iostorInv/dto/HrBcpIostorInvQuery.java | 38 ++ .../StIvtIostorinvHrBcpInServiceImpl.java | 477 +++++++++++++++ .../StIvtIostorinvHrBcpOutServiceImpl.java | 556 ++++++++++++++++++ .../IStIvtStructivtHrBcpService.java | 32 + .../IStIvtStructivtflowHrService.java | 30 + .../structIvt/dao/StIvtStructivtHrBcp.java | 105 ++++ .../structIvt/dao/StIvtStructivtflowHr.java | 139 +++++ .../dao/mapper/StIvtStructivtHrBcpMapper.java | 39 ++ .../mapper/StIvtStructivtflowHrBcpMapper.java | 22 + .../mapper/xml/StIvtStructivtHrBcpMapper.xml | 244 ++++++++ .../xml/StIvtStructivtflowHrBcpMapper.xml | 48 ++ .../structIvt/dto/StructIvtHrBcpQuery.java | 37 ++ .../impl/StIvtStructivtHrBcpServiceImpl.java | 62 ++ .../impl/StIvtStructivtflowHrServiceImpl.java | 135 +++++ .../java/org/nl/wms/storage_manage/stivt.xls | Bin 403456 -> 431616 bytes .../semiproductIvthrFlow/index.vue | 209 +++++++ .../semiproductIvthrFlow/productivthrFlow.js | 31 + .../semiproducthrIn/AddDialog.vue | 411 +++++++++++++ .../semiproducthrIn/ViewDialog.vue | 253 ++++++++ .../semiproducthr/semiproducthrIn/index.vue | 350 +++++++++++ .../semiproducthrIn/semiproducthrIn.js | 58 ++ .../semiproducthr/semiproducthrIvt/index.vue | 161 +++++ .../semiproducthrIvt/semiproducthrivt.js | 40 ++ .../semiproducthrout/AddDialog.vue | 380 ++++++++++++ .../semiproducthrout/StructIvt.vue | 154 +++++ .../semiproducthrout/ViewDialog.vue | 252 ++++++++ .../semiproducthr/semiproducthrout/index.vue | 348 +++++++++++ .../semiproducthrout/semiproducthrout.js | 58 ++ 40 files changed, 5508 insertions(+), 2 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpInController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpOutController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtHrBcpController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtflowHrBcpController.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpOutService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvHrBcp.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvHrBcpMapper.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvHrBcpMapper.xml create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dto/HrBcpIostorInvQuery.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpOutServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtHrBcpService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtflowHrService.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtHrBcp.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtflowHr.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtHrBcpMapper.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtflowHrBcpMapper.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtflowHrBcpMapper.xml create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dto/StructIvtHrBcpQuery.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtHrBcpServiceImpl.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtflowHrServiceImpl.java create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproductIvthrFlow/index.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproductIvthrFlow/productivthrFlow.js create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/AddDialog.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/ViewDialog.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/index.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/semiproducthrIn.js create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/index.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/semiproducthrivt.js create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/AddDialog.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/StructIvt.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/ViewDialog.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/index.vue create mode 100644 mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/semiproducthrout.js 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 69a6c984..2bbf5035 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 @@ -40,6 +40,7 @@ public enum AcsTaskEnum { TASK_STRUCT_BCP_EMPOUT("17","半成品-空托盘出库"), TASK_STRUCT_CP_IN("11","入库-成品-生产入库"), TASK_STRUCT_CP_OUT("12","出库-成品-生产出库"), + TASK_STRUCT_HR_IN("26","入库-海柔半成品-生产入库"), TASK_STRUCT_CP_CHECK("13","-盘点"), TASK_WASH_LACK("20","清洗机-缺料请求"), TASK_WASH_EMP("21","清洗机-空框请求"), diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/util/impl/DivRuleCpServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/util/impl/DivRuleCpServiceImpl.java index 33f670c0..faee4278 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/util/impl/DivRuleCpServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/productmanage/util/impl/DivRuleCpServiceImpl.java @@ -62,8 +62,10 @@ public class DivRuleCpServiceImpl implements DivRuleCpService { .eq(StIvtStructattr::getSect_id, sect_id) .eq(StIvtStructattr::getIs_used, IOSEnum.IS_USED.code("是")) .eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) - .eq(StIvtStructattr::getStoragevehicle_code, "") - .eq(StIvtStructattr::getIs_emptyvehicle, false) + .and(qr -> qr.eq(StIvtStructattr::getStoragevehicle_code,"") + .or().isNull(StIvtStructattr::getStoragevehicle_code) + ) + .ne(StIvtStructattr::getIs_emptyvehicle, true) .orderByAsc(StIvtStructattr::getStruct_code) , false); break; 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 d3b931d4..2b775bab 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 @@ -15,6 +15,7 @@ import org.nl.wms.storage_manage.semimanage.service.check.IStIvtCheckmstBcpServi import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcpOutService; 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.iostorInv.IStIvtIostorinvHrBcpInService; import java.util.function.Consumer; import java.util.function.Predicate; @@ -66,6 +67,10 @@ public enum TASKEnum implements FunctionStrategy { ISchBasePointService bean = SpringContextHolder.getBean(ISchBasePointService.class); bean.taskOperate(form); }), + HR_CP_IN_TASK(type -> AcsTaskEnum.TASK_STRUCT_HR_IN.getCode().equals(type), form -> { + IStIvtIostorinvHrBcpInService bean = SpringContextHolder.getBean(IStIvtIostorinvHrBcpInService.class); + bean.taskOperate(form); + }), ; diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpInController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpInController.java new file mode 100644 index 00000000..9c205ff3 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpInController.java @@ -0,0 +1,125 @@ +package org.nl.wms.storage_manage.semimanagehr.controller.iostorInv; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.anno.Log; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService; +import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleext; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 出入库记录表 前端控制器 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@RestController +@Api(tags = "海柔半成品入库") +@RequestMapping("/api/in/semiproductHr") +@Slf4j +@SaIgnore +public class StIvtIostorinvHrBcpInController { + + @Autowired + private IStIvtIostorinvHrBcpInService stIvtIostorinvBcpService; // 海柔半成品入库服务 + + @Autowired + private IMdPbStoragevehicleextService iMdPbStoragevehicleextService; // 载具扩展属性信息表服务 + + @GetMapping + @Log("查询入库单据") + //("查询入库单据") + public ResponseEntity query(HrBcpIostorInvQuery query, PageQuery page) { + return new ResponseEntity<>(stIvtIostorinvBcpService.queryDtl(query,page), HttpStatus.OK); + } + + @PostMapping("/create") + @Log("新增入库单") + //("新增入库单") + public ResponseEntity create(@RequestBody JSONObject form) { + stIvtIostorinvBcpService.create(form); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @Log("删除出入库单") + //("删除出入库单") + @PostMapping("/delete") + public ResponseEntity delete(@RequestBody Long[] ids) { + if (ids.length>0){ + stIvtIostorinvBcpService.update(new UpdateWrapper() + .set("is_delete","1") + .in("iostorinv_id",ids)); + + List bcps = stIvtIostorinvBcpService.listByIds(Arrays.asList(ids)); + List collect = bcps.stream().map(StIvtIostorinvHrBcp::getStoragevehicle_code).collect(Collectors.toList()); + // 更新载具扩展属性 - 释放载具对应物料关系 清空数量 + if (!CollectionUtils.isEmpty(collect)){ + iMdPbStoragevehicleextService.update( + new MdPbStoragevehicleext() + .setMaterial_id("") + .setStorage_qty(BigDecimal.valueOf(0)), + new QueryWrapper().lambda() + .in(MdPbStoragevehicleext::getStoragevehicle_code,collect) + ); + } + } + return new ResponseEntity<>(HttpStatus.OK); + } + + + @PostMapping("/update") + @Log("修改入库单") + //("修改入库单") + public ResponseEntity update(@RequestBody JSONObject whereJson) { + stIvtIostorinvBcpService.updateBill(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + + @PostMapping("/getIODtl") + @Log("查询入库分配明细") + //("查询入库分配明细") + public ResponseEntity getIODtl(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(stIvtIostorinvBcpService.getIoDtl(whereJson.toJavaObject(HrBcpIostorInvQuery.class)), HttpStatus.OK); + } + + + @PostMapping("/confirm") + @Log("完成单据") + //("完成单据") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + stIvtIostorinvBcpService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/confirmTask") + @Log("下发任务") + //("下发任务") + public ResponseEntity confirmTask(@RequestBody JSONObject whereJson) { + stIvtIostorinvBcpService.confirmTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpOutController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpOutController.java new file mode 100644 index 00000000..995277d9 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/iostorInv/StIvtIostorinvHrBcpOutController.java @@ -0,0 +1,103 @@ +package org.nl.wms.storage_manage.semimanagehr.controller.iostorInv; + + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.anno.Log; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpOutService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + *

+ * 出入库记录表 前端控制器 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@RestController +@Api(tags = "海柔半成品出库") +@RequestMapping("/api/out/semiproductHr") +@Slf4j +@SaIgnore +public class StIvtIostorinvHrBcpOutController { + + @Autowired + private IStIvtIostorinvHrBcpOutService bcpOutService; + + @GetMapping + @Log("查询入库单据") + //("查询入库单据") + public ResponseEntity query(HrBcpIostorInvQuery query, PageQuery page) { + return new ResponseEntity<>(bcpOutService.queryDtl(query,page), HttpStatus.OK); + } + + @PostMapping("/create") + @Log("新增出库单") + //("新增出库单") + public ResponseEntity create(@RequestBody JSONObject form) { + bcpOutService.create(form); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @Log("删除出入库单") + //("删除出入库单") + @PostMapping("/delete") + public ResponseEntity delete(@RequestBody Long[] ids) { + bcpOutService.delete(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + + @PostMapping("/update") + @Log("修改出库单") + //("修改出库单") + public ResponseEntity update(@RequestBody JSONObject whereJson) { + bcpOutService.updateBill(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + + @PostMapping("/commit") + @Log("出入单提交") + //("出入单提交") + public ResponseEntity commit(@RequestBody Map whereJson) { + //semiProductInService.commit(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/getIODtl") + @Log("查询入库分配明细") + //("查询入库分配明细") + public ResponseEntity getIODtl(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(bcpOutService.getIoDtl(whereJson.toJavaObject(HrBcpIostorInvQuery.class)), HttpStatus.OK); + } + + + @PostMapping("/confirm") + @Log("完成单据") + //("完成单据") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + bcpOutService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/confirmTask") + @Log("下发任务") + //("下发任务") + public ResponseEntity confirmTask(@RequestBody JSONObject whereJson) { + bcpOutService.confirmTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtHrBcpController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtHrBcpController.java new file mode 100644 index 00000000..af13f58f --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtHrBcpController.java @@ -0,0 +1,79 @@ +package org.nl.wms.storage_manage.semimanagehr.controller.structLvt; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.anno.Log; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.MapOf; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dto.StIvtStructivtBcpVo; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtHrBcpService; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dto.StructIvtHrBcpQuery; +import org.nl.wms.system_manage.service.tableData.ColumnInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + *

+ * 仓位库存表 前端控制器 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@RestController +@RequestMapping("/api/bcp/hr") +public class StIvtStructivtHrBcpController { + + @Autowired + private IStIvtStructivtHrBcpService bcpService; + @Autowired + private ColumnInfoService columnInfoService; + + @GetMapping + @Log("半成品库存查询") + //("半成品库存查询") + public ResponseEntity query(StructIvtHrBcpQuery query, PageQuery page) { + return new ResponseEntity<>(bcpService.packageQuery(query,page), HttpStatus.OK); + } + @PostMapping("/bypda") + @Log("半成品库存查询") + //("半成品库存查询") + public ResponseEntity bypdaQuery(@RequestBody PageQuery query) { + query.setPage(0); + return new ResponseEntity<>(bcpService.packageQuery(new StructIvtHrBcpQuery(),query), HttpStatus.OK); + } + + @GetMapping("/getBcpIvt") + @Log("查询可用的半成品库存") + //("查询可用的半成品库存") + public ResponseEntity getBcpIvt(StructIvtHrBcpQuery query, PageQuery page) { + return new ResponseEntity<>(bcpService.getBcpIvt(query, page), HttpStatus.OK); + } + + @PostMapping("/getBcpIvtInfo") + @Log("查询可用的半成品库存") + //("查询可用的半成品库存") + public ResponseEntity getBcpIvtInfo(@RequestBody JSONObject jo) { + return new ResponseEntity<>(bcpService.getBcpIvtInfo(jo), HttpStatus.OK); + } + + @GetMapping("/download") + @Log("半成品库存导出") + //("半成品库存查询") + public ResponseEntity download(StructIvtHrBcpQuery query, PageQuery page, HttpServletResponse response) { + List maps = bcpService.queryAll(query); + String s = JSON.toJSONString(maps); + List bcpVos = JSONArray.parseArray(s, StIvtStructivtBcpVo.class); + columnInfoService.exportFile(bcpVos,response, MapOf.of("stor_name","仓库名称","material_name","物料名称","material_spec","物料规格")); + return new ResponseEntity<>(HttpStatus.OK); + } +} + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtflowHrBcpController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtflowHrBcpController.java new file mode 100644 index 00000000..92d17792 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/controller/structLvt/StIvtStructivtflowHrBcpController.java @@ -0,0 +1,36 @@ +package org.nl.wms.storage_manage.semimanagehr.controller.structLvt; + + +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.productmanage.service.structIvt.dto.IvtFlowQuery; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtflowHrService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + *

+ * 仓位库存变动记录表 前端控制器 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@RestController +@RequestMapping("/api/stIvtStructivtflowHrBcp") +public class StIvtStructivtflowHrBcpController { + + @Autowired + private IStIvtStructivtflowHrService iStIvtStructivtflowService; + + + @GetMapping + public ResponseEntity query(IvtFlowQuery query, PageQuery page) { + return new ResponseEntity<>(iStIvtStructivtflowService.queryAll(query,page), HttpStatus.OK); + } +} + 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 new file mode 100644 index 00000000..4794ea8c --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpInService.java @@ -0,0 +1,62 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 出入库记录表 服务类 + *

+ * + * @author generator + * @since 2023-08-01 + */ +public interface IStIvtIostorinvHrBcpInService extends IService { + + + Object queryDtl(HrBcpIostorInvQuery query, PageQuery page); + + List getIoDtl(HrBcpIostorInvQuery query); + /** + * 新增 + * @param form + * @return + */ + void create(JSONObject form); + /** + * 完成 + * @param form + * @return + */ + String confirm(JSONObject form); + + /** + * 库存变动 + * @param form + * @return + */ + void onlyConfirm(JSONObject form); + /** + * 下发单据 + * @param form + * @return + */ + String confirmTask(JSONObject form); + /** + * 修改单据 + * @param form + * @return + */ + String updateBill(JSONObject form); + + void taskOperate(JSONObject form); + + List getPdaAll(JSONObject form); + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpOutService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpOutService.java new file mode 100644 index 00000000..75c044d9 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/IStIvtIostorinvHrBcpOutService.java @@ -0,0 +1,84 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 出入库记录表 服务类 + *

+ * + * @author generator + * @since 2023-08-01 + */ +public interface IStIvtIostorinvHrBcpOutService extends IService { + + + Object queryDtl(HrBcpIostorInvQuery query, PageQuery page); + + List getIoDtl(HrBcpIostorInvQuery query); + /** + * 新增 + * @param form + * @return + */ + void create(JSONObject form); + + /** + * 新增 + * @param ids + * @return + */ + void delete(Long[] ids); + + /** + * 完成 + * @param form + * @return + */ + String confirm(JSONObject form); + + /** + * 出库确认 + * @param form + * @return + */ + void onlyConfirm(JSONObject form); + + /** + * 自动出库 + * @param param + * param.put("stor_id", form.getString("stor_id")); + * param.put("sect_id", form.getString("sect_id")); + * param.put("material_id", form.getString("material_id")); + * @return + */ + StIvtStructivtBcp autoConfirmout(JSONObject param); + + StIvtStructattr autoConfirmin(JSONObject param); + + void lockStruct(String struct,String type,String inv_code); + /** + * 下发单据 + * @param form + * @return + */ + String confirmTask(JSONObject form); + /** + * 修改单据 + * @param form + * @return + */ + String updateBill(JSONObject form); + + void taskOperate(JSONObject form); + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvHrBcp.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvHrBcp.java new file mode 100644 index 00000000..7545547e --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/StIvtIostorinvHrBcp.java @@ -0,0 +1,232 @@ +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_hr_bcp") +public class StIvtIostorinvHrBcp implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 出入单标识 + */ + @TableId(value = "iostorinv_id") + private String iostorinv_id; + + /** + * 单据编号 + */ + private String bill_code; + + /** + * 出入类型 + */ + private String io_type; + + /** + * 业务类型 + */ + private String buss_type; + + /** + * 单据类型 + */ + private String bill_type; + /** + * 单据zhuangtai + */ + private String bill_status; + + /** + * 业务日期 + */ + private String biz_date; + + /** + * 关联单据 + */ + private String base_bill_code; + + /** + * 车间标识 + */ + private String workshop_id; + + /** + * 仓库标识 + */ + private String stor_id; + + /** + * 仓库编码 + */ + private String stor_code; + + /** + * 仓库名称 + */ + private String stor_name; + + /** + * 库区标识 + */ + private String sect_id; + + /** + * 库区编码 + */ + private String sect_code; + + /** + * 库区名称 + */ + private String sect_name; + + /** + * 仓位标识 + */ + private String struct_id; + + /** + * 仓位编码 + */ + private String struct_code; + + /** + * 仓位名称 + */ + private String struct_name; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 批次 + */ + private String pcsn; + + /** + * 品质类型 + */ + private String quality_scode; + + /** + * 库存等级 + */ + private String ivt_level; + + /** + * 是否可用 + */ + private Boolean is_active; + + /** + * 数量 + */ + private BigDecimal plan_qty; + + /** + * 数量计量单位标识 + */ + private String qty_unit_id; + + /** + * 数量计量单位名称 + */ + private String qty_unit_name; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人姓名 + */ + + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_id; + + /** + * 修改人姓名 + */ + private String update_name; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 执行状态 + */ + private String work_status; + + /** + * 任务标识 + */ + private String task_id; + + /** + * 存储载具标识 + */ + private String storagevehicle_id; + + /** + * 存储载具编码 + */ + private String storagevehicle_code; + + /** + * 存储载具类型 + */ + private String storagevehicle_type; + + /** + * 单重 + */ + private BigDecimal unit_weight; + + /** + * 是否删除 + */ + private Boolean is_delete; + + /** + * 备注 + */ + private String remark; + /** + * 入库点 + */ + private String point_code; + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvHrBcpMapper.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvHrBcpMapper.java new file mode 100644 index 00000000..2b2e959b --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/StIvtIostorinvHrBcpMapper.java @@ -0,0 +1,26 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.nl.common.anno.Datazhuazhua; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 出入库记录表 Mapper 接口 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Datazhuazhua +public interface StIvtIostorinvHrBcpMapper extends BaseMapper { + List getIostorinv(@Param("query") HrBcpIostorInvQuery query); + + List getPdaAll(JSONObject form); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvHrBcpMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvHrBcpMapper.xml new file mode 100644 index 00000000..725f1593 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dao/mapper/xml/StIvtIostorinvHrBcpMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dto/HrBcpIostorInvQuery.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dto/HrBcpIostorInvQuery.java new file mode 100644 index 00000000..59643365 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/dto/HrBcpIostorInvQuery.java @@ -0,0 +1,38 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto; + +import lombok.Data; +import org.nl.common.domain.query.BaseQuery; +import org.nl.common.domain.query.QParam; +import org.nl.common.enums.QueryTEnum; +import org.nl.wms.storage_manage.semimanage.service.iostorInv.dao.StIvtIostorinvBcp; + +/* + * @author LXY + * @Date 2023/08/01 19:49 + */ +@Data +public class HrBcpIostorInvQuery extends BaseQuery { + + + private String stor_id; + + private String iostorinv_id; + + private String bill_status; + + private String bill_type; + + private String bill_code; + + private String io_type; + + private Boolean is_delete = false; + + + @Override + public void paramMapping() { + super.doP.put("bill_code", QParam.builder().k(new String[]{"bill_code"}).type(QueryTEnum.LK).build()); + } + + +} 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 new file mode 100644 index 00000000..575c8c64 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpInServiceImpl.java @@ -0,0 +1,477 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl; + +import cn.hutool.core.date.DateUtil; +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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import io.jsonwebtoken.lang.Assert; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.common.utils.RedissonUtils; +import org.nl.common.utils.SecurityUtils; +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.material.IMdMeMaterialbaseService; +import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase; +import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService; +import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleinfoService; +import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleext; +import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleinfo; +import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService; +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.StIvtBsrealstorattr; +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.IVTEnum; +import org.nl.wms.storage_manage.basedata.service.record.service.IStIvtStructivtflowService; +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.dao.StIvtIostorinvHrBcp; +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; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtflowHrService; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtHrBcp; +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; +import java.util.function.Consumer; + +/** + *

+ * 出入库记录表 服务实现类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Service +public class StIvtIostorinvHrBcpInServiceImpl extends ServiceImpl implements IStIvtIostorinvHrBcpInService { + + @Autowired + private IStIvtBsrealstorattrService storattrService; // 实物属性服务 + + @Autowired + private IStIvtStructivtHrBcpService structivtBcpService; // 仓库库存服务 + + @Autowired + private IStIvtStructattrService structattrService; // 仓位服务 + + @Autowired + private DivRuleCpService divRuleCpService; // 分配规则服务 + + @Autowired + private IStIvtSectattrService sectattrService; // 库区服务 + + @Autowired + private ISchBaseTaskService iSchBaseTaskService; // 任务表服务 + + @Autowired + private IMdMeMaterialbaseService materialbaseService; // 任务表服务 + + @Autowired + private IStIvtStructivtflowHrService iStIvtStructivtflowService; // 库存变动服务 + + @Autowired + protected IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; // 载具信息 + + @Autowired + protected IMdPbStoragevehicleextService iMdPbStoragevehicleextService; // 载具扩展属性信息表服务 + + @Override + public Object queryDtl(HrBcpIostorInvQuery query, PageQuery pageQuery) { + Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + TableDataInfo build = TableDataInfo.build(this.getIoDtl(query)); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + public List getIoDtl(HrBcpIostorInvQuery query) { + return this.baseMapper.getIostorinv(query); + } + + @Override + @Transactional + public void create(JSONObject form) { + Assert.notNull(form, "参数不能为空"); + for (Object item : form.getJSONArray("tableData")) { + StIvtIostorinvHrBcp mst = new StIvtIostorinvHrBcp(); + mst.setIostorinv_id(IdUtil.getStringId()); + mst.setBill_code(CodeUtil.getNewCode("IO_CODE")); + mst.setBiz_date(form.getString("biz_date")); + mst.setBill_type(form.getString("bill_type")); + mst.setIo_type(IOSEnum.IO_TYPE.code("入库")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + mst.setRemark(form.getString("remark")); + mst.setWorkshop_id(form.getString("product_code")); + mst.setPoint_code(form.getString("point_code")); + 仓库数据: + { + StIvtBsrealstorattr stor = storattrService.getOne(new QueryWrapper().eq("stor_id", form.getString("stor_id"))); + mst.setStor_id(stor.getStor_id()); + mst.setStor_code(stor.getStor_code()); + mst.setStor_name(stor.getStor_name()); + } + packageRow(mst, JSONObject.parseObject(JSON.toJSONString(item))); + mst.setCreate_id(SecurityUtils.getCurrentUserId()); + mst.setCreate_name(SecurityUtils.getCurrentNickName()); + mst.setCreate_time(DateUtil.now()); + this.save(mst); + + // 更新载具扩展属性 + iMdPbStoragevehicleextService.update( + new UpdateWrapper().lambda() + .set(MdPbStoragevehicleext::getMaterial_id, mst.getMaterial_id()) + .set(MdPbStoragevehicleext::getWeight, mst.getPlan_qty()) + .eq(MdPbStoragevehicleext::getStoragevehicle_code, mst.getStoragevehicle_code()) + ); + + // 判断是否自动下发 + if (ObjectUtil.isNotEmpty(form.getString("auto_send"))) { + confirmTask(JSONObject.parseObject(JSON.toJSONString(mst))); + } + } + } + + private void packageRow(StIvtIostorinvHrBcp mst, JSONObject row) { + mst.setMaterial_id(row.getString("material_id")); + mst.setPcsn(StringUtils.isNotEmpty(row.getString("pcsn")) ? row.getString("pcsn") : DateUtil.today()); + mst.setPlan_qty(row.getBigDecimal("plan_qty")); + mst.setQuality_scode(row.getString("quality_scode")); + mst.setQty_unit_id(row.getString("base_unit_id")); + mst.setBase_bill_code(row.getString("base_bill_code")); + mst.setQty_unit_name(row.getString("base_unit_name")); + mst.setUnit_weight(row.getBigDecimal("unit_weight")); + // 载具信息 + { + MdPbStoragevehicleinfo vehicleDao = iMdPbStoragevehicleinfoService.getOne( + new QueryWrapper().lambda() + .eq(MdPbStoragevehicleinfo::getStoragevehicle_code, row.getString("storagevehicle_code")) + ); + + if (ObjectUtil.isEmpty(vehicleDao)) throw new BadRequestException("载具不存在!"); + + mst.setStoragevehicle_code(vehicleDao.getStoragevehicle_code()); + mst.setStoragevehicle_id(vehicleDao.getStoragevehicle_id()); + + // 更新载具对应物料关系、数量 + MdPbStoragevehicleext vehicleExtDao = iMdPbStoragevehicleextService.getOne( + new QueryWrapper().lambda() + .eq(MdPbStoragevehicleext::getStoragevehicle_code, row.getString("storagevehicle_code")) + ); + if (ObjectUtil.isNotEmpty(vehicleExtDao)) { + vehicleExtDao.setWeight(mst.getPlan_qty()); + vehicleExtDao.setMaterial_id(mst.getMaterial_id()); + iMdPbStoragevehicleextService.updateById(vehicleExtDao); + } + } + } + + @Override + public void onlyConfirm(JSONObject form) { + Assert.notNull(new Object[]{form.getString("struct_id"),form.getString("stor_id"),form.getString("material_code")},"参数不全"); + structivtBcpService.removeById(form.getString("struct_id")); + StIvtBsrealstorattr stor = storattrService.getById(form.getString("stor_id")); + MdMeMaterialbase mdMeMaterialbase = materialbaseService.getOne(new QueryWrapper() + .eq("material_code",form.getString("material_code"))); + if (mdMeMaterialbase==null){ + throw new BadRequestException("物料编码不正确"+form.getString("material_code")); + } + //新增库存 + StIvtStructivtHrBcp ivtDao = StIvtStructivtHrBcp.builder() + .struct_id(form.getString("struct_id")) + .struct_code(form.getString("struct_code")) + .struct_name(form.getString("struct_name")) + .material_id(mdMeMaterialbase.getMaterial_id()) + .quality_scode(IVTEnum.QUALITY_SCODE.code("合格品")) + .pcsn(DateUtil.today()) + .ivt_level(IVTEnum.IVT_LEVEL.code("一级")) + .is_active(true) + .qty_unit_id(mdMeMaterialbase.getBase_unit_id()) + .instorage_time(DateUtil.now()) + .stor_id(form.getString("stor_id")) + .canuse_qty(form.getBigDecimal("qty")) + .workshop_id(stor.getProduct_area()) + .unit_weight(mdMeMaterialbase.getNet_weight()) + .build(); + structivtBcpService.save(ivtDao); + // 插入库存变动记录 + JSONObject param = JSONObject.parseObject(JSON.toJSONString(ivtDao)); + param.put("change_type", ChangeIvtUtil.SUBWAREHOUSING_ADDIVT_QTY); + param.put("change_qty", ivtDao.getCanuse_qty()); + param.put("result_qty", ivtDao.getCanuse_qty()); + param.put("bill_code",""); + param.put("inv_id",""); + param.put("bill_type_scode",""); + iStIvtStructivtflowService.insetIvtChange(param); + //维护载具 + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, form.getString("struct_code")) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getInv_code, "") + .set(StIvtStructattr::getStoragevehicle_code, form.getString("storagevehicle_code"))); + } + + @Override + @Transactional + public String confirm(JSONObject form) { + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = this.getById(form.getString("iostorinv_id")); + //checkParam(mst); + if (StringUtils.isEmpty(mst.getStruct_code())) { + throw new BadRequestException("当前入库单还未分配仓位!"); + } + + mst.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + mst.setUpdate_time(DateUtil.now()); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + this.updateById(mst); + + //新增库存 + StIvtStructivtHrBcp ivtDao = StIvtStructivtHrBcp.builder() + .struct_id(mst.getStruct_id()) + .struct_code(mst.getStruct_code()) + .struct_name(mst.getStruct_name()) + .material_id(mst.getMaterial_id()) + .quality_scode(mst.getQuality_scode()) + .pcsn(mst.getPcsn()) + .ivt_level(mst.getIvt_level()) + .is_active(mst.getIs_active()) + .qty_unit_id(mst.getQty_unit_id()) + .instorage_time(DateUtil.now()) + .stor_id(mst.getStor_id()) + .canuse_qty(mst.getPlan_qty()) + .workshop_id(mst.getWorkshop_id()) + .unit_weight(mst.getUnit_weight()) + .build(); + structivtBcpService.save(ivtDao); + + // 插入库存变动记录 + JSONObject param = JSONObject.parseObject(JSON.toJSONString(ivtDao)); + param.put("change_type", ChangeIvtUtil.SUBWAREHOUSING_ADDIVT_QTY); + param.put("change_qty", ivtDao.getCanuse_qty()); + param.put("result_qty", ivtDao.getCanuse_qty()); + param.put("bill_code",mst.getBill_code()); + param.put("inv_id",mst.getIostorinv_id()); + param.put("bill_type_scode",mst.getBill_type()); + iStIvtStructivtflowService.insetIvtChange(param); + + //维护载具 + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, mst.getStruct_code()) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getInv_code, "") + .set(StIvtStructattr::getStoragevehicle_code, mst.getStoragevehicle_code())); + + // 更新任务为完成 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getTask_id, mst.getTask_id()) + ); + return null; + } + + @Override + @Transactional + public String confirmTask(JSONObject form) { + RedissonUtils.lock(()->{ + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = this.getById(form.getString("iostorinv_id")); + checkParam(mst); + //分配货位。下发任务,更新主单据状态。更新明细任务 + 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 stIvtStructattr = divRuleCpService.divRuleIn(jo); + + if (ObjectUtil.isEmpty(stIvtStructattr)) { + throw new BadRequestException("无可分配货位"); + } + + 仓库信息: + { + mst.setSect_id(stIvtStructattr.getSect_id()); + mst.setSect_code(stIvtStructattr.getSect_code()); + mst.setSect_name(stIvtStructattr.getSect_name()); + mst.setStruct_id(stIvtStructattr.getStruct_id()); + mst.setStruct_code(stIvtStructattr.getStruct_code()); + mst.setStruct_name(stIvtStructattr.getStruct_name()); + } + + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_HR_IN) + .acs_task_type("7") + .task_group_id(IdUtil.getStringId()) + .point_code1(mst.getPoint_code()) + .point_code3(stIvtStructattr.getStruct_code()) + .vehicle_code(mst.getStoragevehicle_code()) + .product_area(mst.getWorkshop_id()) + .extParam(MapOf.of("material_id",mst.getMaterial_id(), + "material_qty",mst.getPlan_qty(),"table_fk_id",mst.getIostorinv_id())) + .callback((Consumer) mst::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + + mst.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + mst.setUpdate_time(DateUtil.now()); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + this.updateById(mst); + // 下发任务 + sendTask(mst.getTask_id()); + structattrService.lockStruct(stIvtStructattr.getStruct_code(), "入库锁",mst.getTask_id()); + },"banchengpin_ruku",2); + return null; + } + + private void checkParam(StIvtIostorinvHrBcp mst) { + if (mst == null || mst.getIs_delete() == true) { + throw new BadRequestException("单据不存在"); + } + if (!IOSEnum.BILL_STATUS.code("生成").equals(mst.getBill_status())) { + throw new BadRequestException("单据" + mst.getBill_code() + "状态不是生成状态"); + } + } + + @Override + @Transactional + public String updateBill(JSONObject form) { + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = form.toJavaObject(StIvtIostorinvHrBcp.class); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + mst.setUpdate_time(DateUtil.now()); + for (Object item : form.getJSONArray("tableData")) { + packageRow(mst, JSONObject.parseObject(JSON.toJSONString(item))); + } + this.updateById(mst); + return mst.getIostorinv_id(); + } + + @Override + @Transactional + public void taskOperate(JSONObject form) { + String task_id = form.getString("task_id"); + String status = form.getString("status"); + StIvtIostorinvHrBcp mst = this.getOne(new QueryWrapper().lambda().eq(StIvtIostorinvHrBcp::getTask_id, task_id)); + if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) { + if (mst!=null || !mst.getBill_status().equals(IOSEnum.BILL_STATUS.code("完成"))){ + this.update(new UpdateWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id) + .set(StIvtIostorinvHrBcp::getWork_status, IOSEnum.WORK_STATUS.code("完成"))); + JSONObject mst_jo = new JSONObject(); + mst_jo.put("iostorinv_id", mst.getIostorinv_id()); + this.confirm(mst_jo); + } + } else if (status.equals(AcsTaskEnum.STATUS_START.getCode())){ + //执行中 + this.update(new UpdateWrapper().lambda().eq(StIvtIostorinvHrBcp::getTask_id, task_id) + .set(StIvtIostorinvHrBcp::getWork_status, IOSEnum.WORK_STATUS.code("执行中"))); + + // 更新任务 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status,TaskStatusEnum.EXECUTING.getCode()) + .eq(SchBaseTask::getTask_id,task_id ) + ); + }else if (status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())){ + // 取消 + delTask(task_id); + } + } + + @Override + public List getPdaAll(JSONObject form) { + return this.baseMapper.getPdaAll(form); + } + + private void delTask(String task_id) { + + StIvtIostorinvHrBcp mstDao = this.getOne( + new QueryWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id) + ); + + // 解锁仓位 + structattrService.update( + new UpdateWrapper().lambda() + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .eq(StIvtStructattr::getStruct_id, mstDao.getStruct_id()) + ); + + // 删除任务 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()) + .eq(SchBaseTask::getTask_id, mstDao.getTask_id()) + ); + + // 更新主表 + mstDao.setSect_id(""); + mstDao.setSect_code(""); + mstDao.setSect_name(""); + mstDao.setStruct_id(""); + mstDao.setStruct_code(""); + mstDao.setStruct_name(""); + mstDao.setTask_id(""); + mstDao.setWork_status(IOSEnum.WORK_STATUS.code("未生成")); + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + this.updateById(mstDao); + } + + public 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/StIvtIostorinvHrBcpOutServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpOutServiceImpl.java new file mode 100644 index 00000000..1a7093d1 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/iostorInv/impl/StIvtIostorinvHrBcpOutServiceImpl.java @@ -0,0 +1,556 @@ +package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl; + +import cn.hutool.core.date.DateUtil; +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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import io.jsonwebtoken.lang.Assert; +import org.apache.commons.lang3.StringUtils; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.common.utils.RedissonUtils; +import org.nl.common.utils.SecurityUtils; +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.material.IMdMeMaterialbaseService; +import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase; +import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService; +import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleext; +import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService; +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.StIvtBsrealstorattr; +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.pcs_manage.PCSEnum; +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.basedata.service.record.service.IStIvtStructivtflowService; +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.semimanage.service.structIvt.IStIvtStructivtBcpService; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpOutService; +import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp; +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + *

+ * 出入库记录表 服务实现类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Service +public class StIvtIostorinvHrBcpOutServiceImpl extends ServiceImpl implements IStIvtIostorinvHrBcpOutService { + + @Autowired + private IStIvtBsrealstorattrService storattrService; + @Autowired + private IStIvtStructivtBcpService structivtBcpService; + @Autowired + private IStIvtStructattrService structattrService; + @Autowired + private DivRuleCpService divRuleCpService; + @Autowired + private IStIvtSectattrService sectattrService; + @Autowired + private ISchBaseTaskService iSchBaseTaskService; // 任务表服务 + @Autowired + private IMdMeMaterialbaseService materialbaseService; + @Autowired + private IStIvtStructivtflowService iStIvtStructivtflowService; // 库存变动服务 + @Autowired + protected IMdPbStoragevehicleextService iMdPbStoragevehicleextService; // 载具扩展属性信息表服务 + + @Override + public Object queryDtl(HrBcpIostorInvQuery query, PageQuery pageQuery) { + Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + TableDataInfo build = TableDataInfo.build(this.getIoDtl(query)); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + public List getIoDtl(HrBcpIostorInvQuery query) { + return this.baseMapper.getIostorinv(query); + } + + @Override + public void delete(Long[] ids) { + for (Long id : ids) { + StIvtIostorinvHrBcp dao = this.getOne(new QueryWrapper().eq("iostorinv_id", id)); + dao.setIs_delete(true); + + //仓位解锁 + structattrService.update(new UpdateWrapper().set("inv_code", "").set("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")).eq("struct_id", dao.getStruct_id())); + this.updateById(dao); + } + } + + @Override + @Transactional + public void create(JSONObject form) { + Assert.notNull(form, "参数不能为空"); + for (Object item : form.getJSONArray("tableData")) { + StIvtIostorinvHrBcp mst = new StIvtIostorinvHrBcp(); + mst.setIostorinv_id(IdUtil.getStringId()); + mst.setBill_code(CodeUtil.getNewCode("IO_CODE")); + mst.setBiz_date(form.getString("biz_date")); + mst.setBill_type(form.getString("bill_type")); + mst.setIo_type(IOSEnum.IO_TYPE.code("出库")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + mst.setRemark(form.getString("remark")); + mst.setWorkshop_id(form.getString("product_code")); + mst.setPoint_code(form.getString("point_code")); + 仓库数据: + { + StIvtBsrealstorattr stor = storattrService.getOne(new QueryWrapper().eq("stor_id", form.getString("stor_id"))); + mst.setStor_id(stor.getStor_id()); + mst.setStor_code(stor.getStor_code()); + mst.setStor_name(stor.getStor_name()); + } + packageRow(mst, JSONObject.parseObject(JSON.toJSONString(item))); + mst.setCreate_id(SecurityUtils.getCurrentUserId()); + mst.setCreate_name(SecurityUtils.getCurrentNickName()); + mst.setCreate_time(DateUtil.now()); + this.save(mst); + + //锁定起点 + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, mst.getStruct_code()) + .set(StIvtStructattr::getInv_code,mst.getBill_code()) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))); + + // 判断是否自动下发 + if (ObjectUtil.isNotEmpty(form.getString("auto_send"))) { + confirmTask(JSONObject.parseObject(JSON.toJSONString(mst))); + } + } + } + + private void packageRow(StIvtIostorinvHrBcp mst, JSONObject row) { + mst.setMaterial_id(row.getString("material_id")); + mst.setPcsn(StringUtils.isNotEmpty(row.getString("pcsn")) ? row.getString("pcsn") : DateUtil.today()); + mst.setPlan_qty(row.getBigDecimal("plan_qty")); + mst.setQuality_scode(row.getString("quality_scode")); + mst.setQty_unit_id(row.getString("qty_unit_id")); + mst.setBase_bill_code(row.getString("base_bill_code")); + mst.setQty_unit_name(row.getString("qty_unit_name")); + mst.setUnit_weight(row.getBigDecimal("unit_weight")); + mst.setStoragevehicle_code(row.getString("storagevehicle_code")); + mst.setStoragevehicle_id(row.getString("storagevehicle_id")); + mst.setSect_id(row.getString("sect_id")); + mst.setSect_code(row.getString("sect_code")); + mst.setSect_name(row.getString("sect_name")); + mst.setStruct_id(row.getString("struct_id")); + mst.setStruct_code(row.getString("struct_code")); + mst.setStruct_name(row.getString("struct_name")); + } + + @Override + @Transactional + public String confirm(JSONObject form) { + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = this.getById(form.getString("iostorinv_id")); + //checkParam(mst); + if (StringUtils.isEmpty(mst.getStruct_code())) { + throw new BadRequestException("当前入库单还未分配仓位!"); + } + + mst.setBill_status(IOSEnum.BILL_STATUS.code("完成")); + mst.setUpdate_time(DateUtil.now()); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + this.updateById(mst); + + StIvtStructivtBcp ivtDao = structivtBcpService.getById(mst.getStruct_id()); + //删除库存 + structivtBcpService.remove(new QueryWrapper().eq("struct_id", mst.getStruct_id())); + + // 插入库存变动记录 + JSONObject param = JSONObject.parseObject(JSON.toJSONString(ivtDao)); + param.put("change_type", ChangeIvtUtil.SUBFROZEN_SUBIVT_QTY); + param.put("change_qty", ivtDao.getCanuse_qty()); + param.put("result_qty", 0); + param.put("bill_code",mst.getBill_code()); + param.put("inv_id",mst.getIostorinv_id()); + param.put("bill_type_scode",mst.getBill_type()); + iStIvtStructivtflowService.insetIvtChange(param); + + //维护载具 + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, mst.getStruct_code()) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getInv_code,"") + .set(StIvtStructattr::getStoragevehicle_code, "")); + + // 更新任务为完成 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getTask_id, mst.getTask_id()) + ); + + // 更新载具扩展属性 - 释放载具对应物料关系 清空数量 + iMdPbStoragevehicleextService.update( + new MdPbStoragevehicleext() + .setMaterial_id("") + .setStorage_qty(BigDecimal.valueOf(0)), + new QueryWrapper().lambda() + .eq(MdPbStoragevehicleext::getStoragevehicle_code,mst.getStoragevehicle_code()) + ); + + return null; + } + + + @Override + @Transactional + public void onlyConfirm(JSONObject form) { + + StIvtStructivtBcp ivtDao = structivtBcpService.getById(form.getString("struct_id")); + if (ivtDao!=null){ + //删除库存 + structivtBcpService.remove(new QueryWrapper().eq("struct_id", form.getString("struct_id"))); + + // 插入库存变动记录 + JSONObject param = JSONObject.parseObject(JSON.toJSONString(ivtDao)); + param.put("change_type", ChangeIvtUtil.SUBFROZEN_SUBIVT_QTY); + param.put("change_qty", ivtDao.getCanuse_qty()); + param.put("result_qty", 0); + param.put("bill_code",""); + param.put("inv_id",""); + param.put("bill_type_scode",""); + iStIvtStructivtflowService.insetIvtChange(param); + //维护载具 + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, ivtDao.getStruct_code()) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) + .set(StIvtStructattr::getInv_code,"") + .set(StIvtStructattr::getStoragevehicle_code, StringUtils.isNotEmpty(form.getString("storagevehicle_code"))?form.getString("storagevehicle_code"):"")); + } + if (StringUtils.isNotEmpty(form.getString("storagevehicle_code"))){ + // 更新载具扩展属性 - 释放载具对应物料关系 清空数量 + iMdPbStoragevehicleextService.update( + new MdPbStoragevehicleext() + .setMaterial_id("") + .setStorage_qty(BigDecimal.valueOf(0)), + new QueryWrapper().lambda() + .eq(MdPbStoragevehicleext::getStoragevehicle_code,form.getString("storagevehicle_code")) + ); + } + } + + @Override + @Transactional + public StIvtStructivtBcp autoConfirmout(JSONObject form) { + StIvtStructivtBcp bcpStruct = RedissonUtils.lockAndReturn(() -> { + MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper().eq("material_id", form.getString("material_id"))); + JSONObject param = new JSONObject(); + param.put("stor_id", form.getString("stor_id")); + param.put("sect_id", form.getString("sect_id")); + param.put("material_id", form.getString("material_id")); + param.put("rule_type", RuleUtil.PRODUCTION_OUT_2); + // 2.锁定仓位 + StIvtStructivtBcp stIvtStructivtBcp; + if (form.get("stIvtStructivt")==null){ + stIvtStructivtBcp = divRuleCpService.divRuleOutBcp(param); + }else { + stIvtStructivtBcp=(StIvtStructivtBcp)form.get("stIvtStructivt"); + } + if ((stIvtStructivtBcp == null)){ + throw new BadRequestException("无可用货位"); + } + StIvtIostorinvHrBcp mst = new StIvtIostorinvHrBcp(); + mst.setIostorinv_id(IdUtil.getStringId()); + mst.setBill_code(CodeUtil.getNewCode("IO_CODE")); + mst.setBiz_date(form.getString("biz_date")); + mst.setBill_type(form.getString("bill_type")); + mst.setIo_type(IOSEnum.IO_TYPE.code("出库")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + mst.setRemark(form.getString("remark")); + mst.setWorkshop_id(form.getString("product_code")); + mst.setPoint_code(form.getString("point_code")); + mst.setMaterial_id(material.getMaterial_id()); + mst.setPcsn(StringUtils.isNotEmpty(form.getString("pcsn")) ? form.getString("pcsn") : DateUtil.today()); + mst.setPlan_qty(stIvtStructivtBcp.getCanuse_qty()); + mst.setQuality_scode(stIvtStructivtBcp.getQuality_scode()); + mst.setQty_unit_id(stIvtStructivtBcp.getQty_unit_id()); + mst.setBase_bill_code(""); + mst.setQty_unit_name(" "); + mst.setUnit_weight(material.getNet_weight()); + mst.setStoragevehicle_code(" "); + mst.setStoragevehicle_id(" "); + 仓库数据: + { + StIvtBsrealstorattr stor = storattrService.getOne(new QueryWrapper().eq("stor_id", form.getString("stor_id"))); + mst.setStor_id(stor.getStor_id()); + mst.setStor_code(stor.getStor_code()); + mst.setStor_name(stor.getStor_name()); + StIvtSectattr sect = sectattrService.getById(form.getString("sect_id")); + mst.setSect_code(sect.getSect_code()); + mst.setSect_id(sect.getSect_id()); + mst.setSect_name(sect.getSect_name()); + mst.setStruct_id(stIvtStructivtBcp.getStruct_id()); + mst.setStruct_code(stIvtStructivtBcp.getStruct_code()); + mst.setStruct_name(stIvtStructivtBcp.getStruct_name()); + } + mst.setCreate_id("1"); + mst.setCreate_name("acs"); + mst.setCreate_time(DateUtil.now()); + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_OUT) + .point_code1(stIvtStructivtBcp.getStruct_code()) + .point_code3(mst.getPoint_code()) + .acs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NON_WEIGHING_TASK_OF_PS20.getCode()) + .task_group_id(IdUtil.getStringId()) + .extParam(MapOf.of("material_qty",stIvtStructivtBcp.getCanuse_qty(), + "material_id",stIvtStructivtBcp.getMaterial_id(),"qtyArr",form.get("qtyArr"))) + .vehicle_code(mst.getStoragevehicle_code()) + .product_area(mst.getWorkshop_id()) + .callback((Consumer) mst::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + mst.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + this.save(mst); + this.lockStruct(stIvtStructivtBcp.getStruct_code(), "出库锁", mst.getTask_id()); + sendTask(mst.getTask_id()); + return stIvtStructivtBcp; + }, form.getString("material_id"), 1); + return bcpStruct; + } + + @Override + public StIvtStructattr autoConfirmin(JSONObject form) { + final StIvtStructattr[] structattr = new StIvtStructattr[1]; + RedissonUtils.lock(()->{ + MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper().eq("material_id", form.getString("material_id"))); + JSONObject param = new JSONObject(); + param.put("stor_id", form.getString("stor_id")); + param.put("sect_id", form.getString("sect_id")); + param.put("material_id", form.getString("material_id")); + param.put("rule_type", RuleUtil.PRODUCTION_OUT_2); + // 2.锁定仓位 + structattr[0] = divRuleCpService.divRuleIn(param); + if (structattr[0] != null){ + StIvtIostorinvHrBcp mst = new StIvtIostorinvHrBcp(); + mst.setIostorinv_id(IdUtil.getStringId()); + mst.setBill_code(CodeUtil.getNewCode("IO_CODE")); + mst.setBiz_date(form.getString("biz_date")); + mst.setBill_type(form.getString("bill_type")); + mst.setIo_type(IOSEnum.IO_TYPE.code("出库")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + mst.setRemark(form.getString("remark")); + mst.setWorkshop_id(form.getString("product_code")); + mst.setPoint_code(form.getString("point_code")); + mst.setMaterial_id(material.getMaterial_id()); + mst.setPcsn(StringUtils.isNotEmpty(form.getString("pcsn")) ? form.getString("pcsn") : DateUtil.today()); + mst.setBase_bill_code(""); + mst.setQty_unit_name(" "); + mst.setUnit_weight(material.getNet_weight()); + mst.setStoragevehicle_code(" "); + mst.setStoragevehicle_id(" "); + 仓库数据: + { + StIvtBsrealstorattr stor = storattrService.getOne(new QueryWrapper().eq("stor_id", form.getString("stor_id"))); + mst.setStor_id(stor.getStor_id()); + mst.setStor_code(stor.getStor_code()); + mst.setStor_name(stor.getStor_name()); + StIvtSectattr sect = sectattrService.getById(form.getString("sect_id")); + mst.setSect_code(sect.getSect_code()); + mst.setSect_id(sect.getSect_id()); + mst.setSect_name(sect.getSect_name()); + mst.setStruct_id(structattr[0].getStruct_id()); + mst.setStruct_code(structattr[0].getStruct_code()); + mst.setStruct_name(structattr[0].getStruct_name()); + } + mst.setCreate_id("1"); + mst.setCreate_name("acs"); + mst.setCreate_time(DateUtil.now()); + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_OUT) + .point_code1(mst.getPoint_code()) + .point_code3(structattr[0].getStruct_code()) + .vehicle_code(mst.getStoragevehicle_code()) + .product_area(mst.getWorkshop_id()) + .callback((Consumer) mst::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + mst.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + this.save(mst); + this.lockStruct(structattr[0].getStruct_code(), "出库锁",mst.getTask_id()); + } + } ,"banchengpin_ruku",2); + return structattr[0]; + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void lockStruct(String struct, String type, String inv_code) { + structattrService.update(new UpdateWrapper().lambda() + .eq(StIvtStructattr::getStruct_code, struct) + .set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code(type)) + .set(StIvtStructattr::getInv_code,inv_code)); + } + + @Override + @Transactional + public String confirmTask(JSONObject form) { + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = this.getById(form.getString("iostorinv_id")); + checkParam(mst); + + PointEvent event = PointEvent.builder() + .type(AcsTaskEnum.TASK_STRUCT_OUT) + .acs_task_type("7") + .task_group_id(IdUtil.getStringId()) + .point_code3(mst.getPoint_code()) + .point_code1(mst.getStruct_code()) + .vehicle_code(mst.getStoragevehicle_code()) + .product_area(mst.getWorkshop_id()) + .callback((Consumer) mst::setTask_id) + .build(); + BussEventMulticaster.Publish(event); + + mst.setWork_status(IOSEnum.WORK_STATUS.code("生成")); + mst.setBill_status(IOSEnum.BILL_STATUS.code("分配完")); + mst.setUpdate_time(DateUtil.now()); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + this.updateById(mst); + + // 下发任务 + sendTask(mst.getTask_id()); + return mst.getTask_id(); + } + + + public 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); + } + + private void checkParam(StIvtIostorinvHrBcp mst) { + if (mst == null || mst.getIs_delete() == true) { + throw new BadRequestException("单据不存在"); + } + if (!IOSEnum.BILL_STATUS.code("生成").equals(mst.getBill_status())) { + throw new BadRequestException("单据" + mst.getBill_code() + "状态不是生成状态"); + } + } + + @Override + @Transactional + public String updateBill(JSONObject form) { + Assert.notNull(new Object[]{form, form.get("iostorinv_id")}, "请求参数不能为空"); + StIvtIostorinvHrBcp mst = form.toJavaObject(StIvtIostorinvHrBcp.class); + mst.setUpdate_id(SecurityUtils.getCurrentUserId()); + mst.setUpdate_name(SecurityUtils.getCurrentNickName()); + mst.setUpdate_time(DateUtil.now()); + for (Object item : form.getJSONArray("tableData")) { + packageRow(mst, JSONObject.parseObject(JSON.toJSONString(item))); + } + this.updateById(mst); + return mst.getIostorinv_id(); + } + + @Override + @Transactional + public void taskOperate(JSONObject form) { + String task_id = form.getString("task_id"); + String status = form.getString("status"); + StIvtIostorinvHrBcp mst = this.getOne(new QueryWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id)); + if (mst!=null && !mst.getWork_status().equals(PCSEnum.BILL_STATUS.code("完成")) && status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) { + // 完成 + this.update(new UpdateWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id) + .set(StIvtIostorinvHrBcp::getWork_status, IOSEnum.WORK_STATUS.code("完成"))); + JSONObject mst_jo = new JSONObject(); + mst_jo.put("iostorinv_id", mst.getIostorinv_id()); + this.confirm(mst_jo); + } else if (status.equals(AcsTaskEnum.STATUS_START.getCode())) { + // 执行中 + this.update(new UpdateWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id) + .set(StIvtIostorinvHrBcp::getWork_status, IOSEnum.WORK_STATUS.code("执行中"))); + + // 更新任务 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status,TaskStatusEnum.EXECUTING.getCode()) + .eq(SchBaseTask::getTask_id,task_id ) + ); + } else if(status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())) { + // 取消 + delTask(task_id); + } + } + + private void delTask(String task_id) { + + StIvtIostorinvHrBcp mstDao = this.getOne( + new QueryWrapper().lambda() + .eq(StIvtIostorinvHrBcp::getTask_id, task_id) + ); + + // 删除任务 + iSchBaseTaskService.update( + new UpdateWrapper().lambda() + .set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode()) + .eq(SchBaseTask::getTask_id, mstDao.getTask_id()) + ); + + // 更新主表 + mstDao.setTask_id(""); + mstDao.setWork_status(IOSEnum.WORK_STATUS.code("未生成")); + mstDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + this.updateById(mstDao); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtHrBcpService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtHrBcpService.java new file mode 100644 index 00000000..c1182715 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtHrBcpService.java @@ -0,0 +1,32 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dto.StructIvtHrBcpQuery; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 仓位库存表 服务类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +public interface IStIvtStructivtHrBcpService extends IService { + + Object packageQuery(StructIvtHrBcpQuery query, PageQuery page); + + List queryAll(StructIvtHrBcpQuery query); + + StIvtStructivtBcp queryIvtOutOne(JSONObject json); + + Object getBcpIvt(StructIvtHrBcpQuery query, PageQuery page); + + List getBcpIvtInfo(JSONObject jo); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtflowHrService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtflowHrService.java new file mode 100644 index 00000000..190c3fb7 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/IStIvtStructivtflowHrService.java @@ -0,0 +1,30 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.basedata.service.record.dto.StIvtStructivtflowDto; +import org.nl.wms.storage_manage.basedata.service.record.dto.StIvtStructivtflowVo; +import org.nl.wms.storage_manage.productmanage.service.structIvt.dto.IvtFlowQuery; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtflowHr; + +import java.util.List; + +/** + *

+ * 仓位库存变动记录表 服务类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +public interface IStIvtStructivtflowHrService extends IService { + + void recordStructivtFlow(StIvtStructivtflowDto flowDto); + + void insetIvtChange(JSONObject json); + + Object queryAll(IvtFlowQuery query, PageQuery page); + + List queryAll(IvtFlowQuery query); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtHrBcp.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtHrBcp.java new file mode 100644 index 00000000..9fb6ce6e --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtHrBcp.java @@ -0,0 +1,105 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * 仓位库存表 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_structivt_hr_bcp") +@Builder +public class StIvtStructivtHrBcp implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 仓位标识 + */ + @TableId + private String struct_id; + + /** + * 仓位编码 + */ + private String struct_code; + + /** + * 仓位名称 + */ + private String struct_name; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 品质类型 + */ + private String quality_scode; + + /** + * 库存等级 + */ + private String ivt_level; + + /** + * 是否可用 + */ + private Boolean is_active; + + /** + * 批次 + */ + private String pcsn; + + /** + * 库存数 + */ + private BigDecimal canuse_qty; + + /** + * 计量单位标识 + */ + private String qty_unit_id; + + /** + * 入库时间 + */ + private String instorage_time; + + /** + * 仓库标识 + */ + private String stor_id; + + /** + * 车间标识 + */ + private String workshop_id; + + /** + * 是否已挑料 + */ + private Boolean is_pick; + + /** + * 单重 + */ + private BigDecimal unit_weight; + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtflowHr.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtflowHr.java new file mode 100644 index 00000000..c6fb7225 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/StIvtStructivtflowHr.java @@ -0,0 +1,139 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * 仓位库存变动记录表 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("st_ivt_structivtflow_hr_bcp") +public class StIvtStructivtflowHr implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 记录标识 + */ + private String change_id; + + /** + * 仓位标识 + */ + private String struct_id; + + /** + * 仓位编码 + */ + private String struct_code; + + /** + * 仓位名称 + */ + private String struct_name; + + /** + * 物料标识 + */ + private String material_id; + + /** + * 批次 + */ + private String pcsn; + /** + * 品质类型 + */ + private String quality_scode; + + /** + * 是否可用 + */ + private Boolean is_active; + + /** + * 库存等级 + */ + private String ivt_level; + + /** + * 仓库标识 + */ + private String stor_id; + + /** + * 单据类型 + */ + private String bill_type_scode; + + /** + * 单据标识 + */ + private String inv_id; + + /** + * 单据编号 + */ + private String bill_code; + + /** + * 单据表名 + */ + private String bill_table; + + /** + * 变动类型:单据类型 + */ + private String change_type_scode; + + /** + * 变动时间 + */ + private String change_time; + + /** + * 变动人 + */ + private String change_person_id; + + /** + * 变动人姓名 + */ + private String change_person_name; + + /** + * 变动数 + */ + private BigDecimal change_qty; + + /** + * 结存数 + */ + private BigDecimal result_qty; + + /** + * 数量计量单位标识 + */ + private String qty_unit_id; + + /** + * 车间标识 + */ + private String product_area; + /** + * 车间标识 + */ + private Boolean is_add; + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtHrBcpMapper.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtHrBcpMapper.java new file mode 100644 index 00000000..3c0bc63d --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtHrBcpMapper.java @@ -0,0 +1,39 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dto.StructIvtHrBcpQuery; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 仓位库存表 Mapper 接口 + *

+ * + * @author generator + * @since 2023-05-10 + */ +public interface StIvtStructivtHrBcpMapper extends BaseMapper { + + int batchUpdateByParam(@Param("event") List event, @Param("struct_code")String struct_code); + + List getBcpIvt(@Param("query") StructIvtHrBcpQuery query, @Param("pageQuery") PageQuery pageQuery); + + List getBcpIvtInfo(@Param("map") JSONObject map); + + List getStructIvtInfo(@Param("map") Map map); + + List packageQuery(@Param("query") StructIvtHrBcpQuery query); + + List getPdaBcpIvt(JSONObject jo); + + List getPdaBcpMaterialIvt(JSONObject jo); + + StIvtStructivtBcp queryIvtOutOne(JSONObject json); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtflowHrBcpMapper.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtflowHrBcpMapper.java new file mode 100644 index 00000000..3051fbb6 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/StIvtStructivtflowHrBcpMapper.java @@ -0,0 +1,22 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.nl.wms.storage_manage.productmanage.service.structIvt.dto.IvtFlowQuery; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtflowHr; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 仓位库存变动记录表 Mapper 接口 + *

+ * + * @author generator + * @since 2023-05-10 + */ +public interface StIvtStructivtflowHrBcpMapper extends BaseMapper { + + List queryAll(@Param("query") IvtFlowQuery query); +} 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 new file mode 100644 index 00000000..07fa7c66 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtHrBcpMapper.xml @@ -0,0 +1,244 @@ + + + + + + update st_ivt_structivt_hr_bcp set + + ${item.field} = ${item.field} + + + + + + + - + + + #{item.value,jdbcType=DECIMAL} + + where struct_code = #{struct_code} + + + + + + + + + + + + + + + + + + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtflowHrBcpMapper.xml b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtflowHrBcpMapper.xml new file mode 100644 index 00000000..3eea8384 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dao/mapper/xml/StIvtStructivtflowHrBcpMapper.xml @@ -0,0 +1,48 @@ + + + + + + + diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dto/StructIvtHrBcpQuery.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dto/StructIvtHrBcpQuery.java new file mode 100644 index 00000000..cfaf3597 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/dto/StructIvtHrBcpQuery.java @@ -0,0 +1,37 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.dto; + +import lombok.Data; +import org.nl.common.domain.query.BaseQuery; +import org.nl.common.domain.query.QParam; +import org.nl.common.enums.QueryTEnum; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; + +/* + * @author ZZQ + * @Date 2023/5/4 19:49 + */ +@Data +public class StructIvtHrBcpQuery extends BaseQuery { + + + private String sect_id; + + private String struct_search; + + private String material_search; + + private String material_code; + + private String struct_code; + + private Boolean is_delete = false; + + + @Override + public void paramMapping() { + super.doP.put("material_search", QParam.builder().k(new String[]{"material_search"}).type(QueryTEnum.LK).build()); + super.doP.put("struct_search", QParam.builder().k(new String[]{"struct_search"}).type(QueryTEnum.LK).build()); + } + + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtHrBcpServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtHrBcpServiceImpl.java new file mode 100644 index 00000000..e9c25d98 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtHrBcpServiceImpl.java @@ -0,0 +1,62 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtHrBcpService; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtHrBcp; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper.StIvtStructivtHrBcpMapper; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dto.StructIvtHrBcpQuery; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 仓位库存表 服务实现类 + *

+ * + * @author generator + * @since 2023-05-10 + */ +@Service +public class StIvtStructivtHrBcpServiceImpl extends ServiceImpl implements IStIvtStructivtHrBcpService { + + @Override + public Object packageQuery(StructIvtHrBcpQuery query, PageQuery pageQuery) { + com.github.pagehelper.Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + TableDataInfo build = TableDataInfo.build(this.baseMapper.packageQuery(query)); + build.setTotalElements(page.getTotal()); + + return build; + } + + @Override + public StIvtStructivtBcp queryIvtOutOne(JSONObject json) { + return this.baseMapper.queryIvtOutOne(json); + } + + @Override + public List queryAll(StructIvtHrBcpQuery query) { + return this.baseMapper.packageQuery(query); + + } + + @Override + public Object getBcpIvt(StructIvtHrBcpQuery query, PageQuery pageQuery) { + com.github.pagehelper.Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + List mst_detail = this.baseMapper.getBcpIvt(query, pageQuery); + TableDataInfo build = TableDataInfo.build(mst_detail); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + public List getBcpIvtInfo(JSONObject jo) { + return this.baseMapper.getBcpIvtInfo(jo); + } +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtflowHrServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtflowHrServiceImpl.java new file mode 100644 index 00000000..e98dee46 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/storage_manage/semimanagehr/service/structIvt/impl/StIvtStructivtflowHrServiceImpl.java @@ -0,0 +1,135 @@ +package org.nl.wms.storage_manage.semimanagehr.service.structIvt.impl; + +import cn.hutool.core.date.DateUtil; +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.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +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.storage_manage.CHANGE_BILL_TYPE_ENUM; +import org.nl.wms.storage_manage.basedata.service.record.dto.StIvtStructivtflowDto; +import org.nl.wms.storage_manage.basedata.service.record.dto.StIvtStructivtflowVo; +import org.nl.wms.storage_manage.productmanage.service.structIvt.dto.IvtFlowQuery; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtflowHrService; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.StIvtStructivtflowHr; +import org.nl.wms.storage_manage.semimanagehr.service.structIvt.dao.mapper.StIvtStructivtflowHrBcpMapper; +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 generator + * @since 2023-05-10 + */ +@Service +public class StIvtStructivtflowHrServiceImpl extends ServiceImpl implements IStIvtStructivtflowHrService { + + @Autowired + private IStIvtStructattrService structattrService; + @Autowired + private IMdMeMaterialbaseService materialbaseService; + @Autowired + protected IStIvtStructattrService iStIvtStructattrService; // 仓位属性服务 + + @Override + @Transactional + public void recordStructivtFlow(StIvtStructivtflowDto flowDto) { + StIvtStructivtflowHr flow = new StIvtStructivtflowHr(); + StIvtStructattr struct_attr = structattrService.getOne(new QueryWrapper().eq("struct_code", flowDto.getStruct_code())); + flow.setChange_id(IdUtil.getStringId()); + 物料信息: { + MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper().eq("material_id", flowDto.getMaterial_id())); + flow.setPcsn(flowDto.getPcsn()); + } + 仓库信息:{ + flow.setStruct_name(struct_attr.getStruct_name()); + flow.setStruct_code(struct_attr.getStruct_code()); + flow.setStruct_id(struct_attr.getStruct_id()); + flow.setStor_id(struct_attr.getStor_id()); + } + flow.setBill_code(flowDto.getBill_code()); + flow.setChange_type_scode(flowDto.getChange_type_scode().getCode()); + flow.setBill_table(flowDto.getBill_table()); + flow.setChange_qty(flowDto.getChange_qty()); + flow.setResult_qty(flowDto.getResult_qty()); + this.save(flow); + + struct_attr.setStoragevehicle_code(flowDto.getStoragevehicle_code()); + struct_attr.setInv_code(flowDto.getBill_code()); + struct_attr.setInv_type(flowDto.getChange_type_scode().getCode()); + //判断如果在3个状态之内,更新操作 + int tag = 1 << CHANGE_BILL_TYPE_ENUM.IMOVEINV_OUT_CONFIRM.getBitType() + | 1 << CHANGE_BILL_TYPE_ENUM.IOSTORINV_IN_CONFIRM.getBitType() + | 1 << CHANGE_BILL_TYPE_ENUM.MOVEINV_IN_CONFIRM.getBitType() + | 1 << CHANGE_BILL_TYPE_ENUM.CHECK_OUT.getBitType() + | 1 << CHANGE_BILL_TYPE_ENUM.IOSTORINV_OUT_CONFIRM.getBitType(); + if ((tag &~ 1 << flowDto.getChange_type_scode().getBitType()) != tag){ + struct_attr.setInv_code(""); + struct_attr.setInv_type(""); + } + structattrService.updateById(struct_attr); + } + + @Override + @Transactional + public void insetIvtChange(JSONObject json) { + + StIvtStructattr ivtDao = iStIvtStructattrService.getById(json.getString("struct_id")); + + StIvtStructivtflowHr dao = new StIvtStructivtflowHr(); + dao.setChange_id(IdUtil.getStringId()); + dao.setStruct_id(json.getString("struct_id")); + dao.setStruct_code(json.getString("struct_code")); + dao.setStruct_name(json.getString("struct_name")); + dao.setMaterial_id(json.getString("material_id")); + dao.setQuality_scode(json.getString("quality_scode")); + dao.setIvt_level(json.getString("ivt_level")); + dao.setIs_active(json.getBoolean("is_active")); + dao.setPcsn(json.getString("pcsn")); + dao.setStor_id(ivtDao.getStor_id()); + dao.setChange_type_scode(json.getString("change_type")); + dao.setChange_time(DateUtil.now()); + dao.setChange_person_id(SecurityUtils.getCurrentUserId()); + dao.setChange_person_name(SecurityUtils.getCurrentNickName()); + dao.setChange_qty(json.getBigDecimal("change_qty")); + dao.setResult_qty(json.getBigDecimal("result_qty")); + dao.setQty_unit_id(json.getString("qty_unit_id")); + dao.setProduct_area(json.getString("workshop_id")); + dao.setBill_code(json.getString("bill_code")); + dao.setBill_type_scode(json.getString("bill_type_scode")); + dao.setInv_id(json.getString("inv_id")); + this.save(dao); + } + + @Override + public Object queryAll(IvtFlowQuery query, PageQuery pageQuery) { + Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + TableDataInfo build = TableDataInfo.build(this.baseMapper.queryAll(query)); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + public List queryAll(IvtFlowQuery query) { + List maps = this.baseMapper.queryAll(query); + List list = JSONArray.parseArray(JSON.toJSONString(maps), StIvtStructivtflowVo.class); + return list; + } +} 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 682be249aff07a760c72ff6645422cc1421adde6..c442e7f2aa8e103a1e7c223eb4ef24af91bf4e8c 100644 GIT binary patch delta 106191 zcmeEv349dA@_+a2Y)D8#5&|UQ%7!Zk3As2D&LrFr?)xSj3W@@X0t#+8L_}0zfI&qC zPgGPeXaE)AsmMb_P!zlo^*t{HydIwXtNNIone7eW)A#%R|Npo7Bs24!>ZgwvA z*-rVP#PZE`R}79jO9+`o3Hbqj%QZsInP<*<8*eS2Lsx0->HLZgTB=qj_A&jl$BcJq zPDJd<(wE+$PeGyGmm1gUH)sc5Hh$K7c~b%Ln0romsvyvH0GxCqlr#-VTr)zpC04qlonwg zLQ02^FmfARYOHBgJEl7!N{)<;}_ZNePV|tmlouG5PQzQ0-6H| zi1AC4Y!9enWHoKzw`A2KI>;&@Qb}357CB9H5=F2y1z`bvN)_}?6!e)2dSh;CeR|sH znAX{!OKLGi!&yLKu! z3@;6?aeHL}N;)Y86Yy2m#9%oix=8|Mf6Hu@*#=frDG>@k9fBV5fOU<>8z&^$r0jE) zLQU*AQ4fRCgCGmtbdazOB%*Ks#+QG@_EOy#ZZ$QF~ zEg3#q%{ZKqLc@*kGMdp0qi*xIG~F1|JeOt~H#IMz&5ixdTNyNCg{MB*Vk}8Zrdy4N z(wfkxj91f|(hB2DS_a)_)K70qpEic2=hA14o6}2ZrEws=RmHjHi>dKqc1@aW?8#@Jt>~ALf+kpLzWPdpg!~OZbH9l&Kc+b%cWFZ3qRIZeEvh#25A9v z4?@|0vS35c%T8(}#aP~z!CJMkQJR+oouNj4LjMd<#778@-t5Emz|oc|xH>M*j5H&O zUWb*$5t!qbT=GKl3&})p!|-Mj|K7;TPssS5v4TIGTbjIkgp7yNx)QHPnxhWg)0H}; z%Tkv1&6%tWiGyxj2d-OlV_JT;Ke$JAWTk@f>LKvL5cqj|6xYhA+p^f73Fj26IVUcz z$XDbeVVR64$7>Q&AaIS_hvN|;@aiFOpttx(F#cIgZW8#j>W0Uz5HG+5Ck4?5SHMmW zZsp?7=|NG3`?1FM0#M_i0=e8m^V}9f9HLQsr-gXUR24w_I6^EwAh!_&)=VN8*>5l$ zn;`FpdLLB@S-ss!W!#xV3M%3v9vKBA7`wZ=)dQ99PgApSC_qbByQO zWH-!#vS&0Oj>G&T{3n;;#-29y(uRvWVbRPZ_#GHuFz3aOEMb%u9BrKkz!?p0xpe1v zaH}CsJ;ukq5{;RKBmJB#*n2o0+*rIgD5DTZJq<$OU=k&LQbn(}k5HOteBbVN_`A4$ zb}sW0PfbMua0bL(&X8B}Y5RUOiR&9|`aGkw<2YcgPsldj>$nMq`1OS;Ms)x1ipM*3 zq`ADspqd3v_u=fos&3qo90*i z+O;2rfuyv1HqES<*S#7yCMCg*nQ5%=akMA58FV2RKkO}Mw33}|U60x&p5 zJ>yhqmw@wF6taA2pKMm1b&;UE)5bI~z9@;RCaGWQb1IjI6|m(LX^%j-S80)D)Nj|o z*fAi=i0;>#X+k{;D;uNx-A;3julpVC%$wD2!N3se3|V&EF(euvwr;>$l(kTSv(~GhD<*MtVQHpFNFt<0#-u^n@tmElWx^ti8#*-*0l?m;r02gsD4V5XXEX?V;BM?A zZ44L8Q(d?fPLw!EQQ|hOocxVtgNw_8ec9eypu$R?fET3j^ilBSd~7w9ctz%rWD0S< zbm+sPn*&Fe8{`>L!?KfjB!ocb>JHh);9)q*{5tGm7JwW-QHAgP%a6SUdVf-WH^X340 zw*bjU)>!lt9-^W7T=X1=MLEkvwvOd6xW!1F&hUr<3bl8}I+V0TzqAV8mOyx*n4C|}Uf8Z=A@1Z#xee&nOwMWVB*7pfZ-~|TM2uPs}z%ht*XMoR?609J&?lO(8|bp-IEkI z41IEUNOdCobK+vbCXTt)84awZ#95e7&|_GMjUzZKb+iWJltOE`Gy+`k_uB)$b9&2j z1FQlYQ7p$7IRnFOY8f;wxte&OB?f%LIaC%lVhhWB^ z*aECjl;eIiqfnM$F6L6ma_}G=$6`=Oj>VRRY-6;att8k@YR|ImcyP_Q;9z=g32-`> zLOjU;+@_Ep7cBFjEzfAdjCflHWi^3F6y_AlT$c;L0u*{#xt6 zBP9@J#EKio?X|b(Sb!HehX_uOkyqe?4>TxP-9|5Ph{90$nnuR-IOFo^eU0Mj85I@N z)3n@HtUw@W$fYkE?pP9QRS|VnjONGN&W^;B-8L4xnl&L>LMY(t*8yBMN&sJ}+0t~K z^C__SNO}hj%bHdY&GgL+uSMpCLka5>Fvg)88a8h(>P<#()hr& zk$z1r+tm>3D&^^TW5G4G>avm>E5kyqBW zwX*EI4wQOr#Ph?`$b5(Li7q|wxK`?k++M!cso8;2hi2bhD@8+S|Xc zFTZLWn1Y2jSd4tppb?JD6 z)FoVqI9E=s^2W3q?460V_gCu!w>RI=Oh}gscIwp0x*d+vSNZ$ex+CLo;0}w#nBu=y z=!V+-=$G2?u1(7@_1;>>xf^A;N3&!sk(8Y8@FkLOK=zX^nhz`*u$oWSQh=HGdtt$H1pPMKsVls60lXiWcN^3 zo!g|W66@?rc6QTklYts!ueu#cHr|?OA4C@*!>YFX-KNo$;uXIct1 za+lQ+Yd{bnM& z#yhvOGc?z3c81ma+B!>IhvjnDH5aV+IM0JY|L)f*=*}<6Fb{;C)NOIs^5jwsCPSdh8!+sXLxrVJKK7f^x~h{HR|1L zz0_-?1g}mHV>#q-IXeqjbPKyiE#J4!!Z#sx z$|h_(wB}@XeZwa76Kvo$Y^op|~^t33+EZJ45qtXJ?0>=mRv#Pf8x^oVcixP}Q?3z<<-G*%^1)}hjr_mDp?u4fUchT{8JdK>N{l8>qoGS4d z+5SVH!TY)EY8i{3ksb00hM@`Gwa&sSWwr9Gv$59MGVAOa>+FPeR%5#?+m@Z7!7pKF z{_WURP|}Omom2b{G=*=6ELY0T(DZZInPnMml4h(lg&Aw7%@1$yT27d3yAPt8@01mv zx)YgWgjvJRxM5!0Y45K%23Y;o^K8glou5UnS3a8~!m}Jdtg_oem;IjIQVu;hH|hOc z$dL(euc-R=TUFn#`+Swm$5nm%fzY?nXTM;#?Zc@xkR|L2GNl}DhlRdnhQ4)lSB3`$ zO=HGAb&R?%V8dSdEDUKc$f49~5GiKv3#dUzs~=(|mAA1|)!vOFTI>#LZ^?ev?vU)! zG_URssn}1fq|$1IdqP@mZs=P(Lf`r+^sU0bg_afi){fA(K7JtHh-9eO>Z`c~mf85umoa=S(FYUFF0G4qu=p!NLlBv)iPs2P2YdfGQEjthn!a-bBx z17W3X!SU$S#gU(8acp;MMNnqPYyQmwz7Q@z>O82j_EqB%E`IwWo% zV%4ZIcKE1`G1rI9$|Cm;x??ildi3WKR~mIctm}VZEjnd5eY5YT{u>!tuR*aB z_6)v})F;~p;DTIr+r8OW9Jw@bf9-AjK9j-9+V9sPS|#2WIdK)8gc8$}-_8~r{CH^zNb zH@R~-(zV0&KoWM^2YrHuYh)2z;j@?+D2jgLMWvg*W3-WU))x8m<7B5B5taPMF6 z`xE^BcJAD{pW*lm{Qip9@cTRbvH_VIb&ofw=y!Z8ed<$##zg~;=B*))F~;)G3bjLT zR=o1rCm!#k@VIDI#gkujD$-Wet2~`fmnP9<^KV78wWkLeXx?2+>(K`0j$)c;U7NAR zw3>eG+8r~@Lv7$2S>@TZW>X+0<46hVO!||!911U3w1zKV$xjOLf+dJKz7}nH9@1ul zG^Zu)cplP*g7n^e+QMJ80_Vt`o^Z1E75?T&vwiq5fsh^t2-yYZzY&hVz)^pVkn5nm zu7~3pIMzBy$TC>tO?;h@+o}=r8XP-AvyC`J$m?)C1IJ5Y-S+0g#81w_$&ZH#nFdch zSHA(S7)eONn}pm7#}D8*D2kA!N1&bHsJ#VGsi0vN!0}&jZ2dMNo1uYThhtZ8j*_E< zY=`4($3P%BMVogBc^r;o-X-Ksc+$Ebjz#f=T=5B>aQYo^jD{vz^fe(z;n@2m zA@@R)yb8x;Xp)uR5b_xuTbv?fAvBHu`!mp{H3#L8`mV;v~^tVZ1`d{JLA56aj`rW5+ ztOuXT*7?^N!3?*y8 zgmYpk*#vFWD~^)uz?tJ}Qc?_-+!0U77hu6owShl4YgrviR)WPy0wpqQSua+jMk+j7fdy3>+f}11AZ>*cY?hH3shqBJ?S+6a|Kc zxAXfAzL^NlM&1Aqgs2Kbw+EW!O-=mx#Ys5aN@V7@Zb=d?9LBNg?3vmT=nI@l7%(}a zIe$10Y#JwySDXhn(Gd+bK}Di~hu=-gnP9uQ??@)ten&K{6EcYpsR%ZyipMTkEXAgM zQiC6J-Y_~b{;*(IlhgzA9M<5+{B{`aT8*8;MaSW`i)HqUw};bFE+=jR%2-w^jiTyd)s_!6m44XYe-FEh<3UMlsiqrPeZ7KHib{PX8txu&(q-8 zdzs$S3>!^rR?Cn0j9f;d&0(WyuIU>M5vS;OTF1O+H0=^rzau5}yVxU9H4%x-J(tr4 z)N8I-OtX8-7!*$OBOpA&2V+tM_;`L8C?c*S;Vb9_?#t^apvkWuxQ1#%3~M}=wyEum zS6CpL6qwV;(o~mcKy=4jj*y4p&5dCna${%~HwL3Y5C$Vd0F&VjsuBQ&XJBV^GsL!Y zV>qO^F*KVSgAs;Qb5*Vy3^xdx^hz2ZVO88bH<6Cfe}`<@7_YVGCmZC+ae3nNh+E^u ziMe4i&8#&GSY89a*TU~?_(eA6@yYbTw9|045CX#yIAXiOjdM4{^-LUA;DdIbbL11F za_b6x5Y5MaiNVCJGzJbg2E!w(#{j5DnN<%qX2FOVL=K~;1H%A{pQ9RDa~FZp7qmI5 z1%AR&FB0UfH)yXla8w$eU9|>2-v?#_4 zE#W9*zB8V-igrTv%4la7ba^oJY*|pj--4k|6KE^HgT1H~x}*w6w^ZTinkpO(s>0Dl z1@0Hd<7Pv{s0yH~s&H&86^^c>!qI)4_&6>YeaLx(tvv9oec&^HH_uF=cj!5^{UP(Vsk9`zvnP%`3vNlk>z_40m`aoNX16u}aP4Ju zX?%5@BSXRJ@Dmer2lSqN^RCP2-0A~+P?9l>lFcJS#nnDE+>Dt<3yUkF0?|>2T*4kL zy)fUdh>l@d1V-C1_^HSU(1TVGO>dq?dv`eQ2#@IG?#_r#?8Y#(0%pctLE}3(J1ExJ zO^(sjjbSuJ7G=RK&{^H&=%{WCofKJY4Q7G%b(5^+A zHbT5}vA}fKT@g%o-5933$l?sJnCNT~OmOYwGCaPEuRUAg@jXrcye}dfdd3GDOtKga z&MiLF^)D5u8$FHXoJm9#o zemXPk+0ihu8*A?-=9MexV86^a2+8*bdH`x)kre0w8uYn}*ub?1B6ohZ06ptbwFCFD zN9ETHTw{;QxAm}UpkPHSxQ}gvT`nAc%3}frz}-RfmJ4X_QGp7}mN>3$hGIA;z^HIs zbN@tG!_~*yVoarE(PefsIkGhK_Qf=3l(ZSl zrENJHvyrXNXrqccfhy@}6B|9Vi7#-UN13`e(#DWCcD#|cb2asU0}D1cpNgL^3vzX| z|J{M*xK_!Wl;>S`XAb0DpK03#4Lb5aH2L#S^XyIZdiuFJYbhN>zcBYLrTyTLcr)z` zhtd47fge7_!G*lX|HECyaK z`!gZsdTX`7&T48>$lD2XAE+*KCu9*ww9TF?YO{^g5V|W0}9I%SUyJmK%fh3nb z2=fj%hIvOKVb4{po`!jcq${T_VZIy7rVA32{4fczuo|{m9DwE-(8*OT%#1C1L5^97 z8^bIl4ppww;2my#niC$7E;e$U$=t=%nqV=Gza`ZRw}9bZC@akkd7SaCAxw`BPc3 zi8hUKMbBcp9MQ>2gc!P=#zUg9vZEI7S|jQzC=S2sL5cyK@Z(^@o`Nvt03+N8gsvtn zRVdI$f%O%f&IGgQ&u%$`(f|dEfr3Txj-dEASV2BSfelq)!xY$X1vbKt$tE4iLGxqK z$z_?*?3UAg#@Km?<{B$l@^S#vRHxLsKA!kG3nDcG0-V^shv;=xmkfNQHIYc83G29Qh%=&YON( z+aSDVIe5)!E#yz-Z=cZnszHvu;VZhbM)u!fN7eUXN#Gkwo<3!t5;*7k=f0*nu!NX% zk|z1>ONeYTP$MvTXA2?`I56;JA14E)wk1clAmW((SA)fX06ngM*?lkl1f3}+W^ezk%ye=MmT1jfSS;NZdu3M^59B`GkRt+whzPLqUhrrxfGreQwgSrm%-&=;W6xD!c?v9_W6s## zQbE{?Vb0XBwSukgTI`IK^_;1gBVT45wIb45wIb3};wwtdk47 z0X84;Rfc=DPGON}v=4;WW|_tHV9tJ~az>=~LIh2y%&D#UaN&4B9c^y%u``tP@@nMM z1dS}o(8%%j8rj)bBkzyb$k)>}bL;J}D97JEVhc`z7mY}T=}pv<{iQXwQw)!|?!4Xanyo8U58UTN$#xcY@jhEuiU`o-+IoIO;64s56-@)>`Ow1e%c14|M6I@K?uh)| z{);*RW`3Ng;mnY}pt+|tICjWV<@9#4cpM+C7=c5AWGm?~h#-rU zx|SC57LEdLavTKQ7!Cr+VrDQ4jQehKjQeg3<36(36U+i5y_*~(y&JV#xc{JmLtDZ9M=jLPzbePo(?-R*GVv5(9uF_e;HR7>ut^z4Yj@AXXzj)@TDvif z*72^OiP74kGYd1d6rqG{ZH&m0Kw=n?-55q>H--_}jbT7`V;GR*rI-1IvtvZIK>APC z0Wc!VCXmWtM2;b`*k3Fc#fa>t!-(w0Fd(}zwuO!x#E9(1Fe1A#jL3m;iT5Fl$ZiY+ zvb(HU^BU^tY#5QCcfUhm2pViVJ0AbFN3Q5FSE#yz- z++6LwC=t)3!Hex|>3ghUN;qczk+m?_dQMLVdv3yB4va^#-a=$W`0uZ2@r+3-J9`0aSeP66!l%Gz!oX6 z#R}|31-8VFNq4)+4vMM9#VtYc5Fi`w76rfM40BF}#1fR#S8r1kzFmQ>P+%(+*eZq{ zf(C$(sGPyD0_QYkH3uE8wMK!hRbZw9Tc^P8a9}<8H04eQ$g#T=*m?zaH^)q4vX%-N z^|O<;LU6a6gu5+}?$+QE?fGc9v02=>N8a$vf^x3ReWOCoeL~JkU3aJK4=BhVRA3JY z79Rr(m*;O{x14_Ph>eAeS&u5P#}wFR8z$TQaXTiLo}b{LxxgD#tu1zX;Wt|q*i(YV z;b0cq6y#4UuxA8|lrYdjrqg`5->x9vp}=+u7Bhi`7?5SfpHq-OufTRGuopO1Y0lPa zM}hxr7yh$D`p;X7wAmil^S?d3kXd$9&@+Y?6*698m@_iGtibjv%D$q&_SrER;{L8+ zxL<+2YA-BW{eS{{O@SR$VE)$?;2{Nem|;#UyrH0bQ-K{(U~h4(^2}20M0HqbIAUmb z#Po!(Y85Wj$a||b^5h!F!a~Sp>#~bmwsyaxb^*)O=FXEr-<85BEaywok-_(ZFpmP$ z6_{6ng)vO5NlQn;g$323w0p5L!p2Z8LRGh6Qt3zq7Nx-a(F(8z!<-QzMuEjDus9pP zayp;od^Htx@tn>%7S^&AmNluZ!0ITl1O=9;z;JCM(8OZN4i_f^ARi0aqO@{NnvWRr zkw61mS=l7GQsL&8?84ZZG@AMwZI6g=_IGT4(qGqZ_EawTjy|AOHeBfWl*a4;_ry|> z@SNnJc8eLe*fYJd;vVfzdK8qgg%4>nwEvsetIO$4@J;eq__ve6lcnYi zbNX+lg6_ZT)vSBs@`&46|6}Xbao);STeKDwR;~XoJlMTzZNjRxX@2so)<+{AbNppA zEj}6+has(o?@Pg1IR9z|tZBD0?|V+`l6}I|NYP`^N1oTnKuE#+p3umV@8Q{JH4hn{ z=pkL2d&uV~JT=u1FxyCY^ISLLcKxb}*)o-zmBm*7}BU1Nr%2{A+ z3t(I`97eD{XY4FExpU;;`+6&|QU%tBW9CeFh0}5<9!B~p$om5(M>uKn0SuF|f|niWz_^-&6lDk7 z>3R!?8loT^s=$UZ%o(_bGi(Zd=u1tT2*e_IIixk*m zj+wcUp7_bK!MW|0D9CSOn2ZLTj;}>Kv6~s445ZJp;cA%>^+==#7efz&M3)oXrjU5M z0$U+Cr9=g>SfwC06xeFPVrDRlwd|G*JiLyk0$V3o>;V>5pXTIu@>`Bpx=VraHRI1Q zdxgiuyzJcyx_cPrZ1sEXbd`gmJy)X};cI}H65Ud@8&#gF>6u;KrS(QTN1@Gq3haIb z_J9I=P=P&U$7%>64|CA`u7M|z_i$@GYNr?Ek14Rt3hZ$O_Jjg^(vJCskS%slU|SW~ zQw(!PoeCSBj5^yC*wYHk|BMZkK2fQ_wkxn53T&qWdscyog=n_3pXH3tD+qTfuooBx zUtl{Vc|2o@{Y>HCa`dIp4SxQ2N~w9-0KSLkfQ8i1@?v=laBf(1D)aO2*ddMd(wyA zvKJN({k8%-s=$sZFmqw9r>>Q&^4|KMg6@3<_JIQXkYkl6b3Fs_)c~*Xpcl{ML6_!x zywT}D!4{f4@_hvKKWm|Welgb+d4{-F6h5}8Bm3(Kj+qzc5V36rMf*s-XK#f&I?0T5LF%WKQS`wiUBEIRF}WA;Do39Bp^=()%JWfs_*&dT^DJ57PXZht{^u=8IK2D|?S zVXzY*V8T|i<*M01(Q@I6!VwA#b`S)HJj_U?VHZKboUaMPj)FnT_+fj&AP}}148maB z!5}PFfx&i!L3FS+VGst}6e8w&dcr`b8^Jz?KV$pEX=E z*YiM%4`BY842QP|dPvJlJmlIr9`eRA4|(WT$Ag972i=a>>G3H8yiOl@N)Y_btUvIS zL40#dye>~rOeVFQ()~C zSO+fHxmeRtLD=AI%cmU+HUQjW=6fG`QTXD;w`PUr&YM;R^ey(SR>@C@$k|- zf7XRAu*AIMnD*k-CFEVWz&rqb;ALp-)1B~fSaV>smtF=@i(hGQb-8urA+OLnK+o^# z0>YVqED*4dqOnn276{l!e}XF%kOcz% z&IDwEfWx%25Re4|_6a8p`91s)FcKLa1!FEa~9wpZ!fbRYhhC!2aA{MaQ> ziCCsY3s%c3MJ-#fTH?0b$h3u3%NC%->sBpWShZ|n)soX!BZrt0E#Tq(Q91+opb{-W zi33#pm?vv^B1T~!L?vo5C9;_kI0HvZWHTjj?u|^dEhVy<5(_L`wq>@Z1h!?iS(XZI zi5(gRBr*XxAYecJNC?OQ0sHB3!6*j=yvnrB0Rj8zL<{$l`vo2bXVO`6%mp<)wa1}X zVt_y)^_dX-kLY`8q%dVJtHn%V%3P}!xgcaO#kFg!T`riCJ5sKr7P+hzevCFKz{dpO z7M1(yRYE`>tHsqqKpqI-+UBuZNQcP-0TP$BK*4$NUA!Z#c6rcNtLa<72iqzS+UgDZ z4t)cE%&Z7cL?;YyxOm=zDUlCK7$g>y!nVo>B@BXd8h+&=tJx-q{7Q#=3(UWNpk+t& z1QO(*ZF$YlarF#$MJ!UCEdfO`tJYsba0`i%F4om>9-JpODAYd=OLDZsyC7=TnfH?&U=m53ggLDTb z06R9v<>=CZIgB6pU_|Kv?c^L?{Ft&}En6}rI)W1K(_TV}j-bQ`6!zR>Ogmbp>C@dE_`BT^K3Wh!SJfWxJRxbtCTY+J+=GL>10_&^5`fmxq6!YEM0`iP(3 zuy>LotCJM5PJ&^Bv&K#W7lIikri*|X_ShoPPks=|Deti8@2E^0rc5y?v!6DC5-776 zl-W-gW9;FV_MyEPdhLF?0E(lg#h?(+yoy1gz|dZ7jW@-Pfv*^pVOf_WdXxxd3Yan_ zOqm-sus@0~VcIMKWl&&=70XJPB65f?u@ot>6v2pH!W22i#BsqgWMNN63luV;_yyPf zw3(=KXO!uusX}OHOK4{%R1W){Euoz)p{QhMtM;88wePH~J%$fdq%BjV3n=nF#iiqM zSooO z#J^x#_>*~aoF{r5L`J4Wd!|G;))u%Zjbgj8_Wzr8Wlw&(vF2C+rLm^nK#A3?rroUO zKp*IasX-F$Zr)YXlbY27sKY(@ujTMPjPtw^X2Kg`AB;l#@JV?uP;D>8l@U~}7pS(E z-fUgjC*{3BwF6e;^a9oRc;5?D3(T2&u{rZNjNmAQPs)2UA#n+cIK|K89DuUH2P+i7C)9nJfMr5J zUnT&bLZIG#9cJq5FjHSkNMDDLzI;-RqaO<4lj?p<2tKVqw*8n8d`^M2=x5cU9}_SU zN^)E_c0Y%JeoVkP97$0CpHTN_0&Wqt=+6X<5#stgYSG_Oi~d$E`a6X5=e5A08HMmk z^#CShxezjd2`Lk`7+}?6fTI=zECB-?0tWCL7{~b&z@kwR8fG8}_=Mgn1PlZLpU~T^ zD-Ze9a@m0(jg=sb5Ge5tQ(}-+Q*6gUpu{PG zhm&9F3aAh&F$k1k>rG~xcAx|fL8wGCro>>T#As3X!AyxUaD@y9gQ@v~*I=fA>{o*= z1qM457;Gsp7_9IsT`3e8EEQl2UhUd>BF16rgi7$4`Vdg!FkLI^K7=V@T37Z6G6WO} z%+!Z~BBxo6hggbW1RY|YstXfkOvO+LpNS6zA^YemQPZJJh#_h^)T-%FCcuD_Xn~<1 zfLmawC4l2{X>Tah^mmH?bPG*A6l(e{OgGri6gcqg1@k{tgwNQAvD&T|^&7?%x!bz3 zxBDu z&v++wBSDFMbd6}&kyg8oWVMu2$&sMM z8_bj=K?%NOi=A*JC=r-Sjs!*aQIBZbkGS3*P2n(BKIAcL2_-uVFQ{o;Wb}UokUbsSrW5E(! z&{(E`Ot;5c3XBB>c;1g)XDm}-wRxrvJm8E1(Z$Hd44 zdz>X^oMmtnGmeXq%kAul^ZzcSPEGiCt}y?HS-(b>n#EV?@n**co`!zDAb`{V@t~G_ zYFwtkCMd9p3T%=K!wK1Vz_99kdNrQV3D9Hj6LlXCb>B&iY5lriC*p)?99vxJv9 zgqK;u%b4(oh43f>rY@x z>}5_i3R?v0%V$p$nW#qv^NCEH>Y@#J*qC?C?vt47DHcT>yH1;&k zItu@d855}fY*A?rEH2sqIpHDuKPM#opA*7As0PmXzjAAmXCM+1QUt%m+-PVCjR@Rq z0B-0h1v`R%kZHpi{|YGl8^gNr4bkOuJxSG1flB<}GMk4lqpi$wtF;<2+u(o1K5(Ch zbbH!E>OND&`x*HEa>V|*|J{gy8T!8)5#XRDzeFY<YBIJ&GX|Aq_iA5j>D4_egkJyM+)laUrxd2wl#4 z8$M`0sNuX6mB9ziP&hhPYvhH0KZN@mMe%(@tvb=$}sRtTkw;Fpig^{tV)2>;73 zjLb#w6B%i3&d@l_H6B-w?+kRl?H&^Qs)y|Tz(aO^7=8u>^@4Mr$JaxntnPUFbJyCT#xm<1=4-Vrf!W@V##E+Z}#; zz;93Z?FGNR&GeI=dJzNRbP)UwHv63P9!AZ}!Wc**w_*MqKi-E5~;3M|xAPyf> zEzpSB?QZQu-by0I=Cmnoze6bn}q^+etfB zIp}6jW3TJo@f4`Ad$4N6F#aT1+PkrWu89I`s=#o0#o9h!_Ni0_VVVLUr? zL455{Rz$jX6(h0J-|g?7N`~1sh7!Y9)!Y#ySApdzuzZg3J|!8pR1mgOV67DxzER}f zr3^DRcT~cWK`IT;qxlQrZEc`b248EDgc8HIP}~^4IO4|eJq|a9YkPJKmlS-JXI6OH zd9>HyozvBx8anJWlp)+VTkelPd7URIOgo@emfz#qthv5LR}4&LJ4+=?7{-Rm+Lf1W z^iUZj-{^L5? zQlZ;7AF8$yQ*Zpn#pSdC`=6~r-w`OgxbFzSzpu6Zw-&y|K1S}qf3K~mANbAze9r-D zvF1U~AKaP9Wj7q`q}}8O5IESup7mxfY-bN&usH8N`h4>jjFPzVkYgWx?p09=A<+zj z?_t143a-KF{@>b1-xXOQ1+xq;9TkTr*$5KDp-FyIrkwI!UT|o#V{&NvL4(b*_?!@8 zz3YnrQMNtyVORZ4p7ZRgKbNKC=;QWI%D$PUz%bam=`h&4QwI$87M)qR!xPw5pZf>~ zbV(rn0Ry@l!+`F_Frd3J{4RkT!+0JqzD8*6F@yo#9UC#A%Lb9kU_cM-s?U|ifbOQl zfbPaHp1U!zt3DsXq!0|~0YbiK4+iu=t8)wkdSHUdF%0N#4C8r#A6FXVIq>Vxl36Jj z1G<|K1G<|b26Q(a26VtGQ=j#uutY&OGW!*YL_!!SNulKwT?S{mMgprAAVHjWjj9hbg%x*H=Y(+B=NKsh31>NOY{bs z=BXThI{2&b3qX`~LaEY1h8<_IQDTb}bc+?(jS6fD!+3uta*~5zYj6u*s=#hmV9ONP zEedS80{e^puj5&VwN@zv8ys^^a#kw{*C?>H3d~es>lnseTQ=Pt4os}y-^oDdRPQbY z!}SX6ZUuIa0=w6R;UuTLa_0A*%4qPGLAM3)>1WJYsp_GmZ4Wd0o3ae5_z~f@7h#G;&6r<HA`-fohZ*OUI*2FE1T>lH> zYsTH_1t+;gMQQD@n$-7L&X@}D@lqXs_<77KvIKpynUX*px@tBqV@zd0~I7yF%IvQ`UN z*>eJ`{6~hqzFLL{*7I;tLf1}1>ZW@_{dhfb^heNi(KoI7q@qj(=~FLy3VSecOxTNEyqqq&cM%i zGIC;V?4}WY0=2QsC9pyT)>eU?cPFC^XI=SDMoz2~;|s&(JrndT9@v*{lyI{&a5LM! zY;!Krt4F#1u}85&rxFF$S%GyCa_#-OtAehZ9qT0w)ZGpWtcL=_*KOU##joT7R@wV% zJu|FYKD^sEl0=$M%+=FP|6D!CTzS7I!Te^f-lbaXGw>wkr7E7Jocr2(o6lbw9eCaW z{}F-^+x7YPTsr^rl>7z({t*xX^PPJznR~9+|NMVhEMsLDw36G7)i}l;wYd5t=ods@ zU4ca^uqcMj2#13e=c5@`pxdz;3={pFV zYMH*!)R*hat7Ebg6_=q6C*~7R>Rqt<@WDk4{6xj&Xy%3!-V(I0_`p3g`&PYn#Bl&L zdhXm7^YK-BV;XDDyj4$5+5#v%_Gh2rw(~9KnN@l{^Vo}en)&su`m;?lwUVM1&i{>aGTx$T9tlh`fu0khZRkpmES1ZJbBQY>W`k+ecJR1Wz$mV zOM_;VO{A;3m4#2cdUDjH&R0z?i=9HT{ZdQ?Jvzc=Gy}CzjXukwMo? z@O7Sk#TBIN%1I^H%$hZwT$wwr^R%p~6E7!e>Cx4PTs`?J(rx-xSLC)BG^Kp{?C9!U zubi|Xp?`Gs=<0Qn^J0?oXmql9-h&n0f)!2j z51ulWTs>_1RhLhgK0WsGM$y%)FE1&(nrh2)uFuKI$;;_qkXx8VVskvrT20y{ zC#PlW`3s~`=%H9?lxey&%B*l{lu0Y3QOMSCX_VctYW0- zNo%)wtDDu=>X(J3K}F!zsq5D2*M$}E^Pk~7vIjedKj1AhYKPS}SI39tcoX2Vnz`qM zH{RTR!mArTZ>>W7*Nx{`VhXj#ZSq1I3GU$sJK&rn2R^FYdY2xfK|Xx$ocYo!{R~=f zljSCb!cEGgMgDv@iQ;Zz#CcPaeuI`=2sOd4a4&}6NKkeO9M_mhzv^x1jgTh~I?+G~l#Ju@8y>ZL0;q)Z@egnU!;P*8Ao`K(Q;rBcEg?}bQ zet_Q};rCzg3;UB3^Z0LiVl#Ndj-VP<8?o}fyM(6&Y?b#PwUt?Z3H7F3SSx>f6}B== zvK(#O`ah{}lgeQa>yK#9yrd6??|4fGeWot&#id|=?8VQ+_2kM%kLv5FzZ)rl?~~`i zyN#{j>n#Pa*;N-fFM!`H*ft37wt}-lQUco)wS==AI4gv^d9dwL9^A#h-GIYec=C1Ck*FAK_dW2Lg-*foQ(E`%Fhp;#+8wq(p$=V8iHdJKA^ zZ*hBb;%2=&?PxxRha&SkJd~L29@o3q>!M+`ZWD8}yG zxi*|P`}>^erc)R7aIgr6p#lkTKrV;hsf&6k?;kQ#p3u`%OC2|*{PBzXI`D9Fz%zP6 z4S72%ZlJb8Gw<1=cZugJ1xB*L+IaKvC-qKEyYV~hue@Ef*eNf{ocV;FoIZZ>aECZ4 zXZ+%kPTVYhQcw2cK)M};bgkuvt5Or++~x43_T8u7cG7? z1io2;n+>1VCz(4d^c-4hHs7I-35$xGr!B2+-t)Mg*ZC~yELFv)UGjrpzr;@{RTCkL z{YzA>Z!W9Q$8%M);>It2&QT?g8MjSOX}RA4O1q3-?CMp*UQu!7T2U0Q?{UbqWqq$; zHRONJS6_U&`Y*39HqBx!wgy*q9VGiw)$1-o)$LI3uThmAG}}F`cXv6{QtfyQ*LVs{ zJEX=pU4+I?LvUZL%dV@fwJhz%$`(5^J*TJV7$fSs{{fBfP% z9B$_k?lpe#kr4RX4m{kVcXsOlek=t2yNH{ep3@`XwfvM_dWt!6m!8;ZmxDZ@&dw0H zGt7I;mCxzPW{+)p-IgaDC1igpTKuUJkBVERZHVXAON3dIY;t@FMt)ZR|6{$Rkk&Kr zdR9-;%4>5|orSSPnre`=6CD3PGF4tkQ-yG}b!-aWvhgukY>>9Q?Eg>ORpDm8{7p}) zvkuc*Fb$e%1)SsZ#P|gBiB)<-v&V~iZ1sHtT*tt~$VAdqkf)h9zNjbH9S;Q3$mKSJ zLxDX8gwfr%>K!WM9@0Bg8fI?Yt2eB?`enUQzW+4z^)ciJJsffdJo@0c8Ca*1{@MZ3`@mpB;n( zEvKfOI)lVP0sMjnel`OE3Z4s9*#Oshw6b9ZqCRNrR!D8vyq~W25H;JOn+jn}+wx0iO!TIdEL77nq}e z(NlHY7stH)7rjvoI%^M@vTcTMt*62cW7~hxliLl|q$D5d0=_p^OCjUocY=n#iXZe1 z#G3+6NeT(0J~BxwDZ0e0`MbWTC%U&(lC|pOt0zr>LQ{|g3g8F3#jq~DT`1!4zmq!) zTJyu-b=+~!Jomfaa2PKJ+c*s@?p)f{M=sNx?7Ea-FSDbtt^$Rk$o?H~zWDmzc0a!7 z&{ll>4Idx55^69>OC!_PM0uNsof9)yaO440s(cu}=t?A@V%fUidX`jF@ zzg{x+%1M*wuuhM3d6VhLHD|ra{?VYrNN79k(Zg*PZ3>%V zXkgcCA$kyKnt#E4q|-vu`N(MI1I=0VK%o~v?+511VY>rV^@0j8dhBf%Ly!I~>Aj8$ zz=PR9O?eF{D1`A(7SJ69)b#cWcrJk6sz5I=S=a>>kTpOPQ-X4%PkeN#kY+qRXKAljshxE$^y4Fgdj^E?OZX0rn405C0(@y09FY-1Mu= z6S_Cozwe@iti4Df>jXW<&i-Hd_X07gRwb@gH3KtpVX-3gkIhd`4^ z7#PszDXj1$%0*$&o&pOcpTH(E;pF*ETTi}uYS*Vc^C&m_hItc`)>*fYzW?+~f!kZm z8{l^GK6X1EN*{gunS)2~+y5FbeVpM@=IA1C5us-q${=0idyZiVdL7NtC zo(uEV@fX4UAN1kuFFuz0L0<}g`G=<>r4Yp^eDOS$;65+-k=cun386FzR8b zz>Em3z$2uRcA5y0I_%CO3sl864Cp-Y`>zX9B$YhDROSjiu{PYB5V3_xOeLF4U${4^ zr>qmN>vK%wRI(H5^#nV|BMxdCciqV9A!{Sh7dQ%3=9h`ydUUsWPq;S~gjT*1?rl%a z>m$6?E2FD>-{z<0Yi+z;JU$TKGRoTtsAolaQ{$wsfKpHr?{1FrCi!=3aV%X-1HpEe zLNaM9jApou?IXKcy=3p31b)6R3h|w+8Zx;6=0FFHgCFLe*hn6r3u>Ne1fw9PHmDUc zoWmF*0|>kL$wdDS$$;3)V~;GbDTIpe1iswvyUZDd-iCgWJ|ai-pCFYO$0p=&(6^dE zhJ<-GevcVHm}7Il3(m7c^O6SU_3-oYL@kz+rn6iRg|ZL>i)z?8QiT~brP91)Dl7RE zC>fx4*}X`Nr}hFbSp}p!a7KH<1&|r$7re$kvc-&w@lHC-or zHPlPyvKVi6JbD|p>K4m#Tg(G7-a&M)>5KIyG?pka4%lbQ*SFtbU*936 zrOaxw>xEl<{5*|zhCgf+AK9hod%&e~jN4Vb~aF)ryacu*A0~?^R>)TmjT2T;T-rLk$ zN9!M9p38;flnC>6ye^M0lZ)WEF2Wp_=WVEMf$L^)y)VMN9r5E4W0 zux1M(X>f*oi^OrbIL?6MC!{_k75jhN^}+Tt`=94?rBt$?H3+JX_VuMniv}td%BP?{ z{tL|-MBMwclZM)S(&ow<%<@EU!XR0(olG`%7Hj~lp3EHnSjGUOJlY1?g_EqTepi)E zoHp6%FtTS#It}P#ho?|h-A7eCxL?D6g35Y+)1Lbnk10(5P)u+n3L{Uy^!C4=`_;`5 zy9#GmjdbbSxwLp-SKGLOxv#zPA2q*D^46;zNOc08`%$xgU2o$K%3EL-FDdETy=Pwq zZ!Uch@%en_;riZ8b5mV!IwVzZ)b*w|=EJ3jq^7r16lJQL_3JsZFHs|NFu>`&JR~~B zUAp*ERh7qH0xFmf)blnL$yyEK>p!q(pW=Zde7(DlP#5D`!|=>M^X8?dDcN(U2yI); z%D4*PJmxn^-XxoKZ8w>9TLr9ZyH$mCah%&^9;ojfky@1{ZOqKl2HwUYR9M`=o8{-z zBc9x}0Qc}g&MH$Kw|$W>H$Y8kC}ysC^Lz?(aV^}T6ZvB&6*;k=51{p|oD*uON{(ZL z1j^3lO4n?wA8b_BaCj*I{#}f4I@vg~=l`Edt3~$a2YUz46}baAv$yR@+=dsEy+H~Bc`fERJcr{J zvgbp7TVX|u<56+({Zh)sb$cL*@Ro~;8tyKv>TX^BZRH<0O4<*@-rVQo;_Dlo)VVL3{Xc*Ak=O#p>KWZLm3_&}ftvxknEi3f(Ib_OK z<{kjUCu*z~0E$$lF;mKKEu=~3@v$5;@VG?gz%n7X*JU$olqQ$rLgCo;>`Qdm(#PT5 zEROcX~AbA!~CG9 z!C(I23G5%r*e^6;|Bo;8^~P@M%+Gl>|LDrz<$*li3;8pyblaPpCjh(~{=4~kOVgL* zZEB8>@W$42%LpXhS)6Kjgf}7~NEPhBum#}O;odrR0zEhoN$L@^esyoX#GrzL#LP_h zHV=`@O-qNhqTS~1bZ-isVxCC%Hm+qC!EKO4%wM~Bljj*m2erv;?#;@_-dWW^BWGe5BYH4Ko6P0S zz1de>SV5N2MF-^DGrClX%(~jHAp69vKGCqVW7URs#S+L5EO;=U%;H(aO6BgXi7tjy(K}_X752Na^ zo`ZW>Y25`Sb&0^pnKTlXDQz-Gx9}!U#adU@7f}0)TBl=4vPSy%#s?R$qbFND#?c-+ zKy$wwWU)%;&(K!DV1?uSg=A=|O7LK2Tifdevp(!31&lG)&9=CA0T~)phbgp!WLnWt zub1u%jwK?Fn)P$M`4GkW=XjIY!nl3e0?b z*C^GBqCN22&#iodB?hPq8mtJG1exL3y0q-8ckuM1LkLC-BQ-BT^63e6cLgKn;zL2;D%Kf14 zV}Fmczh~hu{{+&F|974$!grVcf~Se?Fz5ILaxA;~niJZ2%PtYgLg#*c`gH9J58C(&0mN(8MjBdPIh;gVl+q_L zW}(^bT|{<}zxYwv+4d;a?AZ+KXCCuL`>HFVu>H8hxV}o z2ePF((pN6-We$)0H(5Po-96K=7Ll)=b?g~?12Jf3OrMrHDN~CRkNnfnmYYT--Nk7 zIXMoJWKRoGw?M*FbuD6Gh_cDJI*@sWRudcUkjOxA`b1g~lK4L~+81P@)BO9R{pn2P zgUw@`J736Xznv94?~5^J`##?8wGN3Vx9yno^J#Gv@5k7)C;Pd2HoG)~&t}Wv7^q5M z$$SdnxMV&aj%)SfY)G~yx6$HdTU;|A9&6s-52mLxV$B!Ed+Q8b3SX5(e1kY{7so^5 z`1${#?oHsEs?z@Pb8qg=)}~2Uy3wAdOVT~*Mp;UerYRIkTiUV;HffvELN}Tsi|9>h zSrn84Lfpo-fQq@VYI|tlAxp6 zGRmv$b!K)f^@#mWGh{v)H71b2h6>A~+J@1!Kwi5vCz4}g)Jc63)HI?&eFTNXWRI$6 zqFQ8P=WEnXDvcnCqoTdnn zQt(So=F~O4Nd5@xlAa_kRQoN7p+aY`To6XoSrUbt`YvpCmVZY{P4vcJ2H3h=uLRhh zVrCRM_4na!6BUcxK@uzII=V}y z{ZH67+2212P2g@2WI;~imuBXxu?g?oIHZF6<$B3~AJ)`h^1hHe`Jqy^#*sDHg2BJe_f8}Q;s6(EJ3wJz5KOn#zd%{9C`8VSj|0ggs`sDv*AfnIN zQ)aP2v7^1xZv;ud2Bn2AQ0m}=6aVd?^#AHebpg;2AL~d??tkP+E&dh4xv2A10J6aW z2mr0Pa-e?75w`DLmbkKa-JKr7l7-lJ$#5}|G~eN@@%r)nDPJt zCd3TLLw#daZMDmg_OFp1*E9YdNCSfSs=L(Hbr{BdoyE$34-pCk+4NsUgou9bI^q8% zA|!?b5FCR3-|hqbV;uUgAwuug01+aIcW#VD-}$?+ND<&7LTZpZ1Y&gVdak=}a@QN& zb(gz-&Rq|<>rdP@0?AGG6F9~NQJOI>A~bc(e}o841^eUgAwq%t`d5JH*F@+$aBKd1 zk?6mK2)zR_LjN5=q~Xu>3L*NZKmqCy!Em_^ukGjspf%(7f))`bzYDm85J-Ct$?fkiWWytV7dxtvl0*F;Wk=6J*Id`h z{V%bjxo`l2O2tLf14c{{~0@?knUgLM;n&1>Coew8aZgUZDs=PbsoYH~njpVD<>jp@Ly+R0&v37R6!*96@G&g2 zV#sh`yJ}-@ZY`?EW%G)S<+&&)MXl9n60j{L7VE9J6g{hGSR|9KlSBF*F{IiG_MTB% zI#XKkfMVXgiqfe@BZtcJ3v-Qg%gc~Hr@&ZRrZ1t(T8;S)EtW+V)QnXmJZ?Yw{MkJx zKRkHk6*O}E#ghk)KK4iP%QC3}sh<1(CHk+e;@-1FCG`B`pZjP%edyo|?~x~#_1&@a?u33>_FB9R7{ zH9m*Oj~59kksu;Vw0xvC0c+Zm`b2%;&&^&dSvP)Tpiz2kDhgHNPn4L8nHHce2*~ z#P0cUpWqyN`El2X2B^NGF{g1wO1aHYV{TYvQFpb6%A{sdm!OYT9ry+vfANKVBxPD? z@0U{!m_^Z-%kvv-;Cwg3@Cau)L0ie3%340>*=J=Tebm~5{6VU#p}BGSmM}rXvib>> zOxjta-%^u>GqCF1qG!-s2j9&&d7yXigU4Sqdu|h>D48^U-k4-2f@zws*DbomG6%WF zJ6Mv0N^2~Z7Hg70)3~gmg)U6@)h0RgRaN;dmL5sCz}8~r)U~lm4Z4nHT7k+`idVDe z&`CC__sG^zdYfn|^CfjUTxALy{>HNwC*t9oG?YFhyl>vxs3y_dV|PfE^_Dl1Q#q zrQ=8X4>B9zVPp0vI2+_$fP!yW0(m!}?8bihG!qApP>Nss?Pt*27&qEz$&OUKSC ztlp-M$J&`i@K*L$)s~?l4^VK=2SdUJzo@?q%&CR>a1#oFoAMNlepRDx@8tTGHEha zn$;b`jAsYf&enTP5shpkTg#@zR`ul`<14sSynr#mt%Cry{JX_`JC0 z#F*2T$3#ChZPTt3t+EZxZGJr7rkjE4-9vkz#s=+A2N8_!0fT#}V-biIGMGpUNKukk zsB|VOAVYz`cf+B^71|_n6OaYRVQ z(`(#}m9o7VX&W-oV~Nom^?ZVPKgwnwOY^mo-+ z^qyQ*RrExI!U%|T(I*7DvXuqvg!_UVM?&+f?`%fa!&5+^l?_c9=bX}amS}80RDqAL5->#MKi@KwDSZD4i2jLS4(r5Ud#5l;McK<8S6{PG{e<(>Rb=+0cVs35? z)+oJW1qDNvhD9wkLq+SrwbQ?g<~Fj1#-^2?KJAl4XZQTwNBV@C$Rf0Yz!#tp0vKur zc&Hd@0mPU}_dShnK3Xr3`cPFQ(V7xVV_unZG)MX`A25wy>r-oOZ(3p#96x&K zVyjQkB4Nu)9ix;2A_}6U!?Idy!?L=%h+N?tdwWk$5!NOkyf^_@Hr5sPEUQo8@X%we zAl%eNU1#(Zi%oZ{mHomwbd6&SR;%>{G(n&ed5Rhvm%zX@77Np2-8C*Y2|nYDIvdqB z6np+W7Ax^1ddGaHP+i;gnHEyYk?&aOmI<6$Yp|qtbDq#)&kV(MG?w7FiyUAEnFi#=46sA|KXTrNEJualCj=?l!`9h;P zE#85o7PA7^Q23sZOTmd%)Z#E|jkJ)8&B9GHYOB=iJ$gN#@r<93HG%32)DYF%<(0S| zO(<8CC=#(YHgk+DSgwkc&*V@HRwn+OxU+Qi_%hEYX)3EIq+E6B-pI}DepWRmU_0s& zmx-tfWVN(lYfCeG@s6yuh@^fKWDS-D}fi5 z!+<46d~Pu}SE3qovpNk%?3o-}#1t_tW8PGxi?h@YtEJ9T+2Tl4NNno3SX|xQXq%5# zT5BunldLP(Sf7r!;^j4#4iCCPlbAKDxY$@SNv)!khp9D5U65F0E9Ml>;!5x8#^zdj zjOE34^C7ydt2#?n=A|0+IO36{z|aj`h;2o_ep#AWj7Q3*8Vi#H1R@7Q;J*CD1WHgjvcswPxq8Yflp}Y=xz`_=b?Zv95X4KeZX>M5w*_CFLmgicm zmCdNOi9}YaK+vd44O5LX^xmyZRYfBuDAVUO6&O_s)cxX{Q3h_c1sFI!DO{VEpzUtt z8H?vkHI_VQ#0|FbI<+h)w$%r8N+MNbE7Fm1uF-(4P33P_wI*)T;5{0gv)e=a)hW$> zmAMKX^q5<$qOzUn7F)h8Om)-8vF&AB`W!DKOr9DD@1HHGx_C#v$a&$fw>y`&2VFKS z>_#!1Ffd18LuXM$NFTRO4a)jB%R1aDES$FF4o@Y?w`SrKu35N#Py9l-%yNGwD{Efi zxYerD_-Gq$#rSUu$el4llBjiR*FDC{qXUL@>j<75qgpo{@GR$cz2UicM}$XQ5uPqr zT|VWN_XIxTH!vrk-o@-f++U_h@j+N*wA<_sMUP5mqs--)YyvRIA+<<5YU8`6+xvM||(6(EIw)>aAo zypHD|VP_|7mN)r^#cEP!jLnu0gNT_JWDHQ@WIB>I7EVF=g~qJ>hK5FQZVt9&8m8(? zP^qyjYgtQmX6qEHsGtDELJl=jUQydH$ZlC>^oR%(EKNysOH)mADL1pgq-qC&s)NK8 zIKQwY+kkk*2ndB|QW;v^Cn?X>myPH_&=&hjlTUc!HPpw#N^@NufHF$4tguurYq3mF z_X}e=hGTAFjD<}kcLnn56?OX6ecmU=SPTxf`jPFAL?wt))k$VxhQ+8h8P_iC64mMiQCgdE zPO%-xyPgJ(j1m+#>uPU-vCi-i!eY?%x)4d9wmHFxL+D#olzH0; zS-;H0)l<4a&=`D*3^AZBI9wT6d!$<^>R~m;ytW{_ms-{Bog*Ong4dCIspf6oe;|rN zX#eF7<_I&eiSPs9yPy*s=?}bo;FT6?D|CN4elI8ldSMyWvT}fpI7<_X{0QB!%+M3t zPZMQe8I=&q;l;aA)D)efpt0ezMY)u<1ubboA8jWsEK^ z)HI>iV14juMVD_BR`>bNsVT--{gAqIdgt`H)4RuD{m@Z4C*TB>a%>T(0L>rZa#8YI zO`BdQiH(Q|2>v;%@k}<8$@C~N>f+{qw8Z)_)3c=erI(hleh&Y|PDfIE(w4{wMHgeE zrus+tXDg^Vm5d-qxPL&y%&2|6N$T{6^UVdg%+?SZ-|QSo!NUW4yPcvm%aUAL~59c7D0-%j)nR z!NDU-(?xfCaKav%Pb4;}#CU=Z-!L?%Yf+hDq-a)QSt~kmQ@BtegkVHKznOKj^^j$J zs{J6+m+%N3izX^TlLxtFBZ7;!C?N82g5r;vEX+oMIL|R=LLRZmJruVN2}_NrfQVQ_ z(JWM0MsPg8(6g+F5`)5%S5ky#U{Ezn%JUI1lo(6#91TcGBbeZ1<%LK;!-xs8BV&nL zRXn|1i2yE$*taN%*hd~pNc)4a9um5g=|2Gz3zLMIWJN;Md2{=M{5%e;ZL{gJEFGXb zV0*%CWvHZdX2FCktm@Jilo?CfO7Pv&b*{`~aeG&bLGwY66~dKE^=KyEau-Q5hDNiD ztxQT*spV0EHa&&bX?p)X6xaeoq1R)C zBK5-B4?Qt{oSI&oUE5`=MeSNcTWc30LO8#A&r-rdc(D7R!6rB_a3JhqHHpp(f52Gi zwYZOBSz7*fSgSYH8f2fl4!RxKs05rEo7BZ~(_LPe@=MR9@C46^_y~=|6hwm^+6!6$CTf7XH%MJ82Ke3`M1-`h!6l>bj48u-I4)(Er%~dqy3+Gg zLB7h}M6&?R5EzCjd69+lYsu}R%DO1EveCiwJY~7BB+;4Y%e=fMlaV>b*2q*j6-;j{ zdQ6bhJs9z71hqgNp7CckBV)I^PZ+DL^4lBTn{TlAo@b7uHp&q)t26WSypnNiGl!Ct zrlUtH*G1SJlELu4@XQYbCrv(9_qUJ4Lr+wn)obf=qZsb*<&Z_sl^2vzt86dE;1WyI ziaK-U=GexJ$HYyssz2Kzl|8XTCY9jT@TDAc z*6iPpKR)WeR7$tRa;klICkxKfzItTZXPBkCEq}(06~^5B;oH8tooL_qJT?yP%g^hj z|3o*@FBH)Qbn=EZUEZHLaJ7Sz_LX_sqKoBdVZo7dLEUA2SeXFtlkby9kGT-NYmAdo z^on{#2Si&GgY+PMlFm-{_C9$6y!P768LN0y;+pwUK%HOSXS=@*Y4n{`^n>Q;Tl~0( zh3Hr|6|my{*}d!mHfxDf{Ixh{O>s(cZNJVK8u^9kXs^-#YV9ic-+E%tp?I2%%vl`vQ zP62%#xGQ|>2=p=D)X|FIwqOwYYg!`OgaiOKiYpt7$y zZAaFct!f{6FPgz6X4&T_qSssR6waecV?b5sll&-Aub-jDc1xuDhyL%`8Au8G7|<(7+S;ERX=3l)Ay!f#JPsLg-# z!HrZlTWs0QcSx@4f?Y0yQm(R!MZ|Uw6jjyN8$jqO#v3A|5l>G6!R{_xn4la-9IRqDCGONV4nEUY!ntzECbzcL?Sg9F^K z-RYbXzjN1-4FoTA4Bal=G_fxC6>t2tcSZQ%AJnxVt5TVRkIMT(58v1A)#|ijBAODq z<30}el6mQ-!RsN{p)Rj)%wdZ^j=|G-s@OsuE!<1)m zia~CS^4>*Z756%F=LK+x0UfGn!eG|5nC5r+5bs47MMW%7^B#zVmvFZ4qH{66N1iZy z{MYX6q(_j8Bqh0;I3meu((?0p72PN6fbU$5+ zie)Dv8ru@^rO-l`vS4JJ8<)Elr#qL})HWy~7noAu37=Rb$an8HXys23x*2SqzQA%4J9_Q>}{AE}))9?vW zP+zaxFaBwO#`DE}W3$EC_Dkw)v2&OUd)R+i7#w~aStYTQFO^)5e5nUKHm}BOHMQ2z zrX^h&jggI!02UWcg{BGzLIMo4d<=ceQr(Zm(>LozWGC8Y`nSr{&~1&g3o42-eRQJS zhZND;Lw7|I#Vz3z!8Ct-fp&J@M}49ID`CgJTBAP&fVI z(1lOrM_60qHiS>e_DkCX9<4xw0dEFiRUZ|5qBGn~$$i5^H$QB97*sZ4VMSTz8bVg| z@@&5$;h^vgPg7{DF}qmGYKz+XU{OaSqgh_b7=J9xRcw*3#ex&QhkX?Su4ohT-7NJM zUSzpr+rc{|)Lll?UI3nAwK!aWkn)h@A!i#J8sAA-x(?*C;vHKY!bPvLQ&qzegr3}? z#)3)r4Cq1LgSe-7W&*b2S1}lB>sJm5Wztc}kMFR7HZ^|mUZ{0tstC*M}b!oMh?IE8IJ>0;28bizL7Z;>ZQ{G2NVDV zYRA3rAH3ema$_Tl34}He47`zrR}ysu7&v`pI1dE>CLHh`#R0Pm2inCp8HSYjE>otB z7tCs9o43xT(;zNbo7g5=4DgU%*fwuQ?Sd+`C~HUFng<9xEJL#s?Ujk>bn7;%Oa*+A z7={H?*F6ZIT)nw@2`buXY;@%Ah@|`t-l~4Ro{B+W;Urn&l(o8*h8i?0^~l&iiLFstj4hWtZthZ3 z4}0;TVW|`YXqXj*{cy;I8Y`_DV#su$!*i`z4R%bEe}m(utXU3X$5g9^v(^X<6*r@F zf*N>Tr5_kkar3JTPy{foxhR4f>{LSpG|E;wT%a)+;LrpDXrLW!(SR8aOlVKx2MK4# zc@GoNIG3m53?+z14FHXI05$poFZd?y3(1ZjlOy{`wmUV8oei?SiI_Bz*XuWH^RXtk zq^LN`Zz#+-cO<{GthB;^T2iCWbfY0|?2wqq(Pa|#nZj6s?=BcZtD#nBJO9wIjVAm= z_vFXk6|XqkA9vx*n%%EFwTYWI6y0V{?0u1#qf*bmb?K;wLnN0bWJ{wzh?UyryqI6D z^UxuOv^!w2D$L7@ur0h&fWcOYT((Nb(3*kheZ1WZ%{L>~g&KV~sm03rmDrCMEPDu5 zDL+eJOlQV^8@u*JUptjOz(@AL0X7hN3hz=I32+suND z-O>-ug4n8NY&_`aEs+Fs+dZE46vzmUG)lAYOjwNpM@C|XvX2oMIgIxwkpT+`hP;pQ zX5opBl)%ijLi#SQrmZBv#3&;OhTJO7wYeDwUCMox?3L`5fOm*y&ickS70j2>Gd*u|EjOYGph5ru)iUFFB^>Z5lC z4e5h7MNg;=wKjFz2g3%#0B#y{C8@%uXyN@l+{E68o&bLGM2AF$_uciU9tp0A#B9ss z9SK@l{N)RRApsywT=1Z-@I(ZMk#7{#vkm(DX_x2~-hv~=<2HF3%+VGWqjfU<~F zTFj_|b2;OH)DY&vZZ$XST*(4Zz#-e)y=M=-z5jD@orH;ARfWO`pFzCk4fsq1Glnenbq;=?oib^0*MzLcEqXAc(jgSI>Gn@2}wYFBR zk4?Zf+cv1FJCKXosMYr8o@Apqx(*3lkfk7Ab9xW(nD#2%9Rl_y?S`?;q{+5dh`|lN z_vD1O&{$Nt?uD$Kx+&oThnI~+tpHsK1is>kUh4yN1-d!AOcPx$*Q})Jm8IECht1Tw zW{O}#sRJxr$c<6+Mo12M?(iHP+h#sep6C!PUQZtmE9~3scDEf>?ob^rQJ>x_>eVGD zj>$;0HTD(CY%u7H761tF2lD`=t2NZTtjkS31^&XAzt1o93!gHbAdfAQCoeYQVFTcC zOl>9Xg^-tHvz`MV8v&k5Ij3%riX7QGfk!mYSw@{{KSm>fA0B}g8uNJT;H}DGf&Q4eNST zCn}TIMc{8Ua{U0IyzexNkNbR&xr36c_|zy(_>th#P~t$|J)B;&QrND<-RUlb8e1vE z!@iq^o8coPG^b?K!hjK}kNSf#ju~BPl!!}rTg7Pn55=lbl+uag z%nSWxYXWrH+hqi?oJ$lRio7!iMZLQY?HUwCguQTF6syG-r#vd&xB|~s+^!Nb&(M37 zsT3hPD#gnK&z{g882IF5%wF$5HhEQ5eEd+wN`!07)*5v!S2Y##ig1*=ViRTk4yR7s z#)7HpnO)Cp&wqX-OF3`hxceXNl+?)6x$GCxUbscr6UL^8dxv`O|KRg;o);4L_3iFU zyPSBU??k8I9>I>BPA$gwDGmYc@w_W2+bkD7DK#;jew}{HJN>#+S43DFXBIKJjMjPD zOAv5xpn&4$p-0ChuT{kVw2M}SEN{}kPOrVW`9tT)-rk)3Ij4b&6(bFc1jDA#M=W`Ju?@Y#Q`8$kLq3J{5cG>6MeDhQyZ z5SXGof{`8sD8*D`K0pC0NKlFxzyU#y8zg|jKw+T>p@^V}p-7&>3`GM)3nc|gG?X+b=}_Y4qWrYH+G5NCuUA7O_y%*4Te~wLm->>mObk9kk(9Uy+sll!l(-0O8SwC3 zsd+Yl2N^x0oT%J5VUh|9i=<_3JKJb0#3k}!7yuFi+oKFaKq3}1`GspV*Lw!&7Aloj zaa6*IUblpf;~j>GXg9=Rs0QUm5EA>Dx3LiOiSAKMJnodvcZ8jqVDsDzVI6ZkQYB*? zR;5ln;l%P;R-0SL;MPnz;m8-zsC1Sv2KT>YY(J5g;yFfqpmmu{s-q;&L7*lIszoxU z*LMFL>>}cl(q(i7ovgAH>@=!C3_0=~8** zN2M_WovB@L=Iuk5Tb_Ap3S%{8?4r6Nv@p(UmNJ)zTA}5RnWnpWv>gGm2kBH^T`=4t zs6#HKH8-1hq}>bbzoLmGm#L9fdMPJnEq{2gZI39&+HEtm{&_cE8JUxX_p<_zPv;z$ zTAY88()q7SA7zh7rygi$BVS|b<4Hr_RV5HuYO^GjaE;5YNp#Gj3*PXxuf&UOiD$#h z-fzTaiGVfNFE&tn$DPl@S=?Rs_c`&hGKpzokb zpJLX3^x`@!5)IMB3hNKuACW?!uZI*$-*i0(1I5m%16R4EYJ$H$l4|RIpwmbcU&tyk$w+Fjjcf3 zmf*fP2bxX~yeVIjeTJBIGfz(_zkQ216(M=neh+QkViA2(?6`SpU192eF0rZG?+vx8 zLR(_vEu0qhg{U)ML}f}8{;H-xrOv;@>pK`|<-4YXqU7T3RJP>%GznH~eUl~oK7I64 zi_hhFiCluGEzXmE_gM<{q9nQK?QMc2&q@mKK8gz34wdUT`F8P3y77T?vI)w`} zuty(^xL^LpU-zAe;g(JtHk+hcQ@9C9Qz}vFTk7tEG=@=MNiahr0_MdV$~O=iqyrrE zuM&g$P5&Jv5k|GuF4wfp6;p$$vLPM$uv7&in{;E{A`SARU7hkR6 zAis$8vJvqG(rdju$8x8fNUn`?tGIM&U28azTxAW5)`wUFJhXmeQogyzBlRASw5=YL zwAHdcciLh(C#l`c++yCUb;V2)54X)NwATB3=Lvy7Fd~pzpImV~4D*FCFd$ zMFQ+=ynDIfr+x_*tk3VC;?X7+K4Cj>+nxTF`}_~zbBF&Fk9PmMD67Q)E`7#B?+OBQ z1yd&Jp1mU8h;%zV?F8c`eoM!oOL(zk;oKHVFSu_Gr1d4IUnyry4x zMFjrfQ5KJp+${tr4z+_2912!%sJJx?f5(9g?7HjNtp2gx{!z@i!w7YO3>@mpR>!Kj zDSP^*`O_llp}2Bsj#Tr&?i6#JcKW<-aPOB(dOw`VPU@*JNV?I`xHOY&a4=jkRp`0p zu+76*V=~JGX7q*3CH8)N_KmHn5yHn}hbc39So|EwzV5d>GmhSz0^xcWy8mjD!03n7 zsnMcSV+~n@eZCdQsnA%)*h%*PYD=~(<`DGmHib8|Cyhsbp6*A|MFp}6a_HJ>A=c$vD~LR7`J3sca*Xe0Quk|p7(EhNJN%=n zh&-%&2jtUbrLm(7+nTT8-B3#hLMrA?Zq5|Cqr9QKCvr(=d9=jZBusftlspk%s0)2VsvoQINFAPZIM9LQ)9KEl&iame zutH`IuAOkfX7u2i%eHuEf2&F)e)$4 zn*4h-9n2;#jd)+_T1k%2w^{v?0Rf&b*`Js#DYrS#7iUY-B&QChilZYD|? zsWN^e}CZ&#BKcL5Sb?*r#bi)*z7%jz%(dspoAfeVo3;b$r(!~PyiaP0KvF)=-1!+W7 zVO~_N$pit#cl7~rh4^kDAg*jKAI!4$5`!QL*@#cw_F)2zC2=mFI_6^>?|cg54lB2` zF2xqAR0^{_l##5VP!Gs0$Nu=4z3UzQVfot)jBWOAKMhm;OrSPIoq z0mjv_mj+&4%lYNBq}jrn4bh%|j*vay@SPBFif5}nkQ-6wHoudM;0CC}@MPkXs?jUQ3c6vS2Dy$i&YjN0AUiuxZWN}3;D z)^&e5sxGf=gqQ`Fr~*{A=!9H1Ro4qxp`qlR4dwbgb(yG6a6f53#P)T zJAK{B9I|Oawn_ic!|5N(B%QOk9SA_dXU4EKZ6!6k{h#>7tT>>QS(_D3FG&vZTCP;S#*+V{LApf51x zZ}OQ9@yvV3IU=12+Szc#a0pS(I+pw33jvmv_qoL&jK0WRn~{9G(F4E9(1DW{#}oZ5 zOTQ#_I1wzC*90zY)$-D4b)`i=odib(Q##o#4=P?TU{$d!oMrAiOQmq zKPfJ6b}-Xd20e=k6;H{e!>Ck2di;13*RAjt&f6b>=N1$&vtl9WUo(_54?Kh!y|rg6 zPa8Ma=!?9JUg-}4Z>&5(jR=0Bbe;2Af00r?`7K5CuFI6*WZMYk;)_Mg1wCWT5|C*? z^6KkbLsB@ZnMx%;Y2_T%MCqyho_0>WIGL&qPo})hjh=`0J}=MC%{YC7zkd%?<1C$g4#7g=%dbd$7%i8FJhdJ(v=z9+socP zCwk`1?9&wR~n4hMlv{@7V0q z&z_ACXP^FznmL$#T9kGgO&N+a9zY~ylh`oC;5T3p5gcMrplJ;;U!z1YSc6@PYO(+6 zPDrfyYkdoo;G%esCyWgm(rr_4L?F$tW}|m&*i!H;rznSbBfB7n-G`>Rh00ELSFDLQ zM0poe3D!)I80l-auVLpJ>q4y-53|kFD-&dkgU>9ZlszJh>=o}_EAfb5%f+@@o;aUk zT)5mJqsDw}OEr4EZri5D{tk5tny*|V0yplJ;2qR*jfYh)AS%%n2djcOSZx%jM93{? zpwq1dH-KK9Wpm3IO}xQ2evJ$aJ!Z$O7P{ikzAYSyFD>*%L8xD;GD<)5j%0#Qm?x8l;LnLb2E`ej=u~a$t9u)If{L~e7sWgX4z&_vkB-iGYfPq zs7Ec9XPR+N8t$7`6p++MQ`5rSo%OTNvf1^mtt_Wk`7ZIh#k{<46Ol^k?bG7L<~*wm z1#3^xNxxE#1dc?T_#Y`pLw>QxcJ;S<>Fy@zgC4zu!GJvtX9PS3Y%SvQ^<56bKSYGheobh$IgplERT7oC=}r&VB4M;ar5!puoPWhXrSvYyJl^ zPsTtY?fcnP<2Ug0@Bd;T5)!3b6N`Wqs|Avn;a>vwp(oT+3D+Wee@c zb}$L!kMRxg1Jmz#TJQDW=;|~7qgVfXo>ouA)$@If7ZjY$(xTNshdJqpnB>@4p}AF~ zv1w8?nJJn?gvT;s1M;IosVI#mjmfypElP6gs8`&g1pMr7Q36VgTa@TVGiBr}tI!i} zQKBH3GI&vfTzN7q&7QTlC`M%os6V5!1pl5(+IrUwFA0Rnf9)l0eCvjnl=6SRomk6=d(;#DtJ9FX$6!zT^h4a#W5=Q3)!BI>kPGCzEP- zyuvapB(+2y*Y7UqJ7{|h3Yo6mF7?WGY2z=$veAr(zvClbuC*HWjGB8mk}u8Oo$R2Tg3;Ug5d)*RP0e@AH)t{6M1hL2D+9%mxJ;zRF6X+aWlHKz>JC^80Mtkph7IQKwG1ucNHFP_> z#vlY~P#Tw${1FT|0h%BTcywx>rE|~zRt-BR)9ouF;~PvpLl$1qYPwR>i?9&P{C zX>IFcd_!EfIul(SU5zN42$?{avG?^eA@-i97_qp*wUh&WFM*?0JY%B}xq1Q8zzAg> z)BsISm7rojZy`9uX|!pNfMFm@cIfOJJ#_wTTnxP)Shy`^NJmSBv^0yBisI>J%1IEtxlPoBAuRtDY1(ZrC zRqi&pa`z>vu>JMFve4%k{w2j+dEjXiVi>rs8Ba#K=f*u1X?K3i zjysh93427C7)Ha2PE6DA)hTHK{6^6X{HoxwM(|%ESx%-znziryf%PAgPE+t^je|{m z(0JIy7fpms{D=VYo%j_kME>X-S_IGU5-o<`?`a7NL6>QGzUU_yO>Qi5(w^{!QUVzQ z-Xnm-XAmVKM?r20q!4+*0pM&7{rv(PPua~sv16!I`^ul#vGYg2U=2KEr}Gl*rxYGB zboz(Ko(3&L@4D{3gS?a^z=M1sS63N_{6H8?xK0?jcJ;k|-^4kQ1W9m`#Rn9ElV zg9LF4rXbLJKImA2*UZ@47kVT@! zQlFZ#fD%|zl3MC2B8#AxD%LLpVl-qX9sJ>}s5T=ms;;iBY&UX6XlJzz!ka7C7$35E z3-7T}t;Uqxyv$srNi!s-=j7>8qE@5LNzBRJZA`Zr^?I8j&Bh8-HW+R9E^0Q{W0VK| zxU35djf(pE#s)?>qqY)UH`d1L77Vw;3>nH66y>43e1lP&v0#R+v?wXJpdfO+f@+(A zwOmG$1{cv4t$nzlwxZd*sd*)u4%#jf*=R^jKzh_!C$}RnN(lEh4?SvYM)k;wQf&++ zFllnr(o>8^oi@>^$;_iPdL}UwF^QU#3=PUOq~&UIa?;i+O08^Z-i#DYf$FZDvDi`m zdQ38!h?KW$9VmAxM=x1Z?@1Y!Y6dj7MQU=EMmjug=*@@HHRxfRWW59F15t)?T-vyt zlysDsH$E*VF-?PVw27Je)bvDTNYQ5)Q^ut$a&pphHe`T17d2ZK6wIBsK#!W5h$VGF z0cr%UzW~@OYFc1iQE92m^i0yg{T`QOSy5$_i>tOz(kX3dILRnOn}>oGYm;bG@unFb z&$Pa7K1c+a695!RK!)rQ@Hoc5cNAhloMDOp&=h;@mu%6LG?au=P$U`;#Q?9~0#ITg z(F0lpzh<~?@TA~D6KQ3IWzb0r+UnuA;rb0ikSOu54oWE@NLZF5O zL2&7*aJv@RKmUf+i`4G3PXCs@Y2rUU>wj|dlCQscMR4EqP(FX&uB(^xedmFr8DR3|i)TFph6N0+o zrb6x~cuEEEWadGwx6k>W-DcPPz~*p5%DsUS@-Xh~Q3v>%OYRxdeB*-FBIc1Ht|HWp?Z@b~Da?26j{MYaB@7 zaUksmyBkkmix(+y_`kj3I@_r{q}cU8{^~Fj?e#zM*sVXj(v((2KaZ7+Hhsw^=6LPFTz2nKvIR+N1SZb78^s?2<&~^7-aw% z4T`L%ftu(QWWHFi{eEGvgv^p@1=%uki!Dk*0z^rR$=#Abz2lw}Qyo|4rn=`89Coko z|A}Aq%FwDA-HX;UJ{1$*Bl{p9iz@uvjO4fcbMD&|?Xw!XPmQ*(ee5Gzux!$_jg5B) zU8=m}z-aqtZ@m26k`tl%8-fDQ%J*fwGuqz$;bhU8ud{PDhn?8z+4IBS55D)u)LSHp(?&P=WHIe``g?iKrf*Vi{=seC3C4M&?YDK+81na)mMJhv@QnIn$Rp@MR}%W5D?gDV`nt8vK` z7?@H}*5!3)EzX@&VO)YLhEP`{Wb6(8f=&5>{d1#FD&ADj`8+ka#HZD^tOAd($K$c$ zQ2|u5kyF;4^!hill+R@;>7VkIQ&y4mw>M^e9g^|6EaOud`F+bNJ1hIL`EN1_o-jP$ zJY1@sf_(ZY+eFJVsCiwh7Riq@DW{l-5+^(vW{HH}8<5)CG9zYO`svTZ(z#E= z(xGyOoeldj`k}vteI&Dm^}W8Rwr}hMj|x7QX~_{D5q&M&oA!A~+NU9DpUcvmvd7NK zhTi>JHtuuTxKCyGlgcUkQfPnEDV)_jKJzDG=J!JKyVfa0oDQM)`Y#JBhnIXQ)M}=j zT_Oq9+=@kFIz>*Gi^@6CNNmr~73HE*kttGdohNFIoFmH6mWz5LQMssCwDm40S*Dx1 zP-LDuN7OV`PWN-;!vhf7_!e34_)zr>HZ?dPwbv^(JRqdktH*1>q($93kL>DQ_vwhg zK9h)$rTz=6sg&l1N{W*`6<&qrE`2qkNw_^v@igM8`nKtD2VGp;g^Cm)-sl{}H}Y={ zX&aqm0TXZZhfwn@x48ttb@S6NYoV+8b`UpY;znowY3(Mpx6gHN=&B$h-aT{G#z0+T zRzPUxHONeRe!To*?UE@Ed=Zkm_>M37K^Y*5E>U>*fVd*lRg_mCft1L}V7uckhVg2> zWDw*Z~oSTi@&iz=Iy>KFX|N+zoe;Ioc|6p9g==TB1ad3G5@T$<=)2fY&!)xx{Ol zIdH?Ij_!qZ?*#n;Uua!Kn3s7!R=PAFv?s1_TZ)2rdHxJm>{b#wBT?GL9n_gwgXFeWzft+juGM z9&Ll8jlPWxh)eREyxpfxPGtWz^Tnj$x`}bgVkGbtUw@JA!_ed1tN-d^M$f;+Wo5A} zXl`u${~EcvkSL-kJTp6c(Df%*h0-?HRm+4jS9kq+Fm-mgNF#(r)lFD z;WJgVVy5s6OCs5|HOeO@ioyck>KSoJ*wkw+BPH5lw6 zz31f>cWjkj6kO$5dWC9Lm@Gv}eJy91G?Hm0W^D$zgQx!yB@#Ynl33Lh9sekIbYGD@ zN{blb4krGF(>KK4a0lD;tql%7%NK_bj6 zOa4C*p~tgeWiJQiwc(JQJ>1=zzI^pF3CH!8@oJS7j)OWe3$1mw+@v3Mlb^(*5pBH$ z1dTQVQN>=wfh(yR$8l1RJO5I-Y^J1>JvIvF-+u^Cqan-uKZbd1s^}0*FPInn;v5)yPV9r`njGvXFI!m4SfoW-lGt!<3jUs!# z9>&FP)?q_zn^s`!MQn3y(FR@S0W>eL&JEC&a1+gAnuFP&Z&F4&=D>hBo&}Sl$s$PXwH*q?3HHklxt?}xhi-xfQRyaR1QnllguAGepdLk~ z5T~16B5f$TTRYD$*~lcbrfg8+o`mNqzDyWwcJ{&!vf9;|kd($gXTv7ggRLY=3>>ga zoMR0R*e$MMHyv;|oCk-?DZIWs4Mi{A|N8LG*P$z0XCFsqZ(omI>!0l#iiUbHQ6dP@ pC!y$rk(dqGfjsb=@F^qmCJ+CN9nOc!cslTuV{L8atU4bq{snhVn!^A9 delta 88247 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 +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 导出 + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproductIvthrFlow/productivthrFlow.js b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproductIvthrFlow/productivthrFlow.js new file mode 100644 index 00000000..9bab66d1 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproductIvthrFlow/productivthrFlow.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/stIvtStructivtflowHrBcp', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/stIvtStructivtflowHrBcp/delete', + method: 'post', + data: ids + }) +} + +export function edit(data) { + return request({ + url: '/api/stIvtStructivtflowHrBcp/update', + method: 'post', + data + }) +} + +export default { + add, + edit, + del +} diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/AddDialog.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/AddDialog.vue new file mode 100644 index 00000000..d7a62801 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/AddDialog.vue @@ -0,0 +1,411 @@ + + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/ViewDialog.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/ViewDialog.vue new file mode 100644 index 00000000..a7e573ff --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/ViewDialog.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/index.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/index.vue new file mode 100644 index 00000000..0f700957 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/index.vue @@ -0,0 +1,350 @@ + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/semiproducthrIn.js b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/semiproducthrIn.js new file mode 100644 index 00000000..48a2b214 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIn/semiproducthrIn.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/in/semiproductHr/create', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/in/semiproductHr/delete', + method: 'post', + data: ids + }) +} + +export function edit(data) { + return request({ + url: '/api/in/semiproductHr/update', + method: 'post', + data + }) +} + +export function getIODtl(data) { + return request({ + url: '/api/in/semiproductHr/getIODtl', + method: 'post', + data + }) +} + +export function confirmTask(data) { + return request({ + url: '/api/in/semiproductHr/confirmTask', + method: 'post', + data + }) +} + +export function confirm(data) { + return request({ + url: '/api/in/semiproductHr/confirm', + method: 'post', + data + }) +} + +export default { + add, + edit, + del, + confirmTask, + confirm, + getIODtl +} diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/index.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/index.vue new file mode 100644 index 00000000..c9102dba --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/index.vue @@ -0,0 +1,161 @@ + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/semiproducthrivt.js b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/semiproducthrivt.js new file mode 100644 index 00000000..9849221b --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrIvt/semiproducthrivt.js @@ -0,0 +1,40 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/bcp/hr', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/bcp/hr/delete', + method: 'post', + data: ids + }) +} + +export function exportFile(data) { + return request({ + url: '/api/stIvtStructivtflowBcp/hr/exportFile', + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/api/bcp/hr/update', + method: 'post', + data + }) +} + +export default { + add, + edit, + del, + exportFile +} diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/AddDialog.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/AddDialog.vue new file mode 100644 index 00000000..570a6b58 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/AddDialog.vue @@ -0,0 +1,380 @@ + + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/StructIvt.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/StructIvt.vue new file mode 100644 index 00000000..14a4869e --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/StructIvt.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/ViewDialog.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/ViewDialog.vue new file mode 100644 index 00000000..1f7c749f --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/ViewDialog.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/index.vue b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/index.vue new file mode 100644 index 00000000..71bb4060 --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/index.vue @@ -0,0 +1,348 @@ + + + + diff --git a/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/semiproducthrout.js b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/semiproducthrout.js new file mode 100644 index 00000000..c0d98cab --- /dev/null +++ b/mes/qd/src/views/wms/storage_manage/semiproducthr/semiproducthrout/semiproducthrout.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/out/semiproductHr/create', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/out/semiproductHr/delete', + method: 'post', + data: ids + }) +} + +export function edit(data) { + return request({ + url: '/api/out/semiproductHr/update', + method: 'post', + data + }) +} + +export function getIODtl(data) { + return request({ + url: '/api/out/semiproductHr/getIODtl', + method: 'post', + data + }) +} + +export function confirmTask(data) { + return request({ + url: '/api/out/semiproductHr/confirmTask', + method: 'post', + data + }) +} + +export function confirm(data) { + return request({ + url: '/api/out/semiproductHr/confirm', + method: 'post', + data + }) +} + +export default { + add, + edit, + del, + confirmTask, + confirm, + getIODtl +}