From 7548052384b8d9496e844b89cc861e90ed31849c Mon Sep 17 00:00:00 2001 From: ludj Date: Fri, 4 Aug 2023 10:26:06 +0800 Subject: [PATCH] =?UTF-8?q?RGV=E7=9B=B8=E5=85=B3=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/wms/common/PointUpdateUtil.java | 6 + .../org/nl/wms/common/StructFindUtil.java | 1 + .../org/nl/wms/common/wql/QSTRUCT_RULE.wql | 1 + .../acs/service/impl/AcsToWmsServiceImpl.java | 74 ++------- .../org/nl/wms/ext/acs/wql/ACSTOMES_001.wql | 1 - .../nl/wms/sch/manage/AbstractAcsTask.java | 9 +- .../nl/wms/sch/manage/buss/BTHCToXLTask.java | 156 ++++++++++++++++++ .../sch/manage/buss/CallEmptyVehicleTask.java | 2 + .../wms/sch/manage/buss/CallMaterialTask.java | 8 +- .../wms/sch/manage/buss/FmjToPackIngTask.java | 6 +- .../org/nl/wms/sch/manage/buss/RgvTask.java | 122 -------------- .../wms/sch/manage/buss/SendMaterialTask.java | 49 ++++-- .../nl/wms/sch/manage/buss/ToPackIngTask.java | 107 +++++------- .../basedata/service/wql/SCH_Base_Kiln01.wql | 1 - .../src/main/java/org/nl/wms/wms.xls | Bin 406528 -> 416256 bytes .../resources/config/application-prod.yml | 5 + 16 files changed, 283 insertions(+), 265 deletions(-) create mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/BTHCToXLTask.java delete mode 100644 wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java index 14fbf30..3fdbfda 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java @@ -21,8 +21,13 @@ public class PointUpdateUtil { WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); for (int i = 0; i < pointarr.size(); i++) { JSONObject pointjo = pointarr.getJSONObject(i); + + //有无货:move :0 无货 1 有货 + //允许取放货:action:0 不允许 1 允许 + //工作模式:mode: 0单机 1:手动 2:联机 String mode = pointjo.getString("mode"); String point_status = "0" + pointjo.getString("move"); + String point_action = pointjo.getString("action"); String vehicle_code = pointjo.getString("barcode"); String device_code = pointjo.getString("device_code"); // 物料类型 @@ -44,6 +49,7 @@ public class PointUpdateUtil { pointObj.put("vehicle_type", pallet_type); pointObj.put("material_type", weight); pointObj.put("material_code", material_code); + pointObj.put("action", point_action); pointObj.put("mode", mode); pointTable.update(pointObj); } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java index 7bf202e..5fef238 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java @@ -106,6 +106,7 @@ public class StructFindUtil { .addParam("point_code", point_code). process().uniqueResult(0); } + result.put("vehicle_type",vehicle_type); return result; } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql index 941ba2b..8c160a1 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql @@ -399,6 +399,7 @@ IF 输入.flag = "13" point.area_type = '07' AND device_point_type = '01' AND point.`mode` <> '0' + AND point.`action` <> '0' AND point.point_status='00' AND ( point.vehicle_code = '' OR point.vehicle_code IS NULL ) AND task.task_code IS NULL diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 91d331d..8dc121a 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -15,12 +15,10 @@ import org.nl.common.utils.UserInfoUtil; import org.nl.exception.BadRequestException; import org.nl.modules.system.util.CodeUtil; import org.nl.utils.SpringContextHolder; -import org.nl.wms.WorkProcedureEnum; import org.nl.wms.common.KilnUtil; import org.nl.wms.common.PointUpdateUtil; import org.nl.wms.common.PressureUtil; import org.nl.wms.common.StructFindUtil; -import org.nl.wms.database.service.VehicleService; import org.nl.wms.database.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; import org.nl.wms.sch.manage.AbstractAcsTask; @@ -51,15 +49,13 @@ import java.util.concurrent.TimeUnit; public class AcsToWmsServiceImpl implements AcsToWmsService { private final SendMaterialTask sendMaterialTask; private final CallMaterialTask callMaterialTask; + private final BTHCToXLTask bphcToXLTask; private final SendEmptyVehicleTask sendEmptyVehicleTask; private final CallEmptyVehicleTask callEmptyVehicleTask; - private final RgvTask rgvTask; - private final WmsToAcsServiceImpl wmsToAcsServiceImpl; private final ToConveyorTask toConveyorTask; private final TaskService taskService; private final ToPackIngTask toPackIngTask; private final FmjToPackIngTask fmjToPackIngTask; - private final VehicleService vehicleService; @Autowired private RedissonClient redissonClient; @@ -89,7 +85,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override @Transactional public Map receiveTaskFromAcsTrans(Map jsonObject) { - log.debug("ACS的receiveTaskFromAcs请求参数为:" + jsonObject); + log.debug("ACS的receiveTaskFromAcs请求参数为:" + jsonObject.toString()); String device_code = (String) jsonObject.get("device_code"); String type = (String) jsonObject.get("type"); String group_id = (String) jsonObject.get("group_id"); @@ -125,17 +121,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (ObjectUtil.isEmpty(groupObj)) { throw new BadRequestException("找不到组盘信息,载具号:" + jsonObject3.getString("vehicle_code")); } - String material_id = groupObj.getString("material_id"); - JSONObject materiralObj1 = WQLObject.getWQLObject("md_me_material").query("material_id = '" + material_id + "'").uniqueResult(0); - // 寻找对应的托盘类型 - 托盘类型对应转换 - String vehicle_type = vehicleService.getVehicleType(materiralObj1.getString("vehicle_type")); - JSONObject jsonObject1 = new JSONObject(); - JSONArray array = new JSONArray(); - jsonObject1.put("device_code", "RGV2"); - jsonObject1.put("code", "to_container_type"); - jsonObject1.put("value", vehicle_type); - array.add(jsonObject1); - wmsToAcsServiceImpl.action(array); break; } // ========================== @@ -222,24 +207,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { produceInfoByCode = this.getProduceInfoByCode(device_code); jsonObject.put("vehicle_type", produceInfoByCode.getString("vehicle_type")); toPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - - // 生成到包装位的任务时,下发托盘类型给RGV -// JSONObject vehicleObj = WQLObject.getWQLObject("md_pb_vehicle").query("vehicle_code='" + vehicle_code + "'", "create_time desc").uniqueResult(0); -// if (ObjectUtil.isNotEmpty(vehicleObj)) { -// String vehicle_type = vehicleService.getVehicleType(vehicleObj.getString("vehicle_type")); -// JSONObject jsonObject1 = new JSONObject(); -// JSONArray array = new JSONArray(); -// jsonObject1.put("device_code", "RGV2"); -// jsonObject1.put("code", "to_container_type"); -// jsonObject1.put("value", vehicle_type); -// array.add(jsonObject1); -// try { -// wmsToAcsServiceImpl.action(array); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } - break; } // ========================== @@ -314,20 +281,18 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { || StrUtil.equals(device_code, "FJJXSXLW301") || StrUtil.equals(device_code, "FJJXSXLW302")) { - JSONObject joo = pointTable.query("point_code='" + device_code + "'").uniqueResult(0); material_id = produceInfoByCode.getString("material_id"); - String workprocedure_id = WorkProcedureEnum.FJGX.getId(); - JSONObject jsonObject1 = WQL.getWO("ACSTOMES_001").addParam("flag", "1").addParam("workprocedure_id", workprocedure_id).addParam("material_id", material_id).addParam("device_id", joo.getString("device_id")).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonObject1)) { + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject startPoint= pointTab.query("area_type ='06' and lock_type='00' and point_status='02' and material_id = '"+material_id+"' and vehicle_type= '"+produceInfoByCode.getString("vehicle_type")+"'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(startPoint)) { // 如果有库存,则出半满托盘 // 叫料出库 jsonObject.put("next_point_code", device_code); jsonObject.put("create_mode", "01"); - jsonObject.put("material_id", material_id); - jsonObject.put("is_full", "0"); - jsonObject.put("workprocedure_id", WorkProcedureEnum.BZGX.getId()); - jsonObject.put("group_device", jsonObject1.getString("group_device_id")); - callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + jsonObject.put("start_point_code", startPoint.getString("point_code")); + bphcToXLTask.createTask((JSONObject) JSON.toJSON(jsonObject)); break; } // 需要更新覆膜机的托盘类型 @@ -353,7 +318,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } @Override - @Transactional(rollbackFor = Exception.class) +// @Transactional(rollbackFor = Exception.class) public Map manipulatorApply(Map jsonObject) { log.debug("ACS的manipulatorApply请求参数为:" + jsonObject); String device_code = (String) jsonObject.get("device_code"); @@ -479,8 +444,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { jsonObject.put("producetask_id", producetask_id); jsonObject.put("material_code", materialObj.getString("material_code")); this.receiveTaskFromAcs(jsonObject); - - JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); result.put("message", "任务状态反馈成功!"); @@ -935,17 +898,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { public Map queryCribbingInfo(Map jsonObject) { log.debug("ACS的queryCribbingInfo请求参数为:" + jsonObject); String device_code = (String) jsonObject.get("device_code"); - JSONObject task = WQLObject.getWQLObject("sch_base_task").query( - "is_delete = '0' AND task_status <> '07' AND next_point_code = '" + device_code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(task)) { - throw new BadRequestException("当前点位有空托任务未完成!"); - } + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); - String vehicle_code = pointTable.query("point_code = '" + device_code + "'").uniqueResult(0).getString("vehicle_code"); - WQLObject group_table = WQLObject.getWQLObject("st_buss_vehiclegroup"); - // 从组盘表里面去获取组盘信息 - JSONObject result = group_table.query("vehicle_code = '" + vehicle_code + "'").uniqueResult(0); + //从点位上获取半木托组盘参数 + String ext_data = pointTable.query("point_code = '" + device_code + "'").uniqueResult(0).getString("ext_data"); + JSONObject result=null; + if (ObjectUtil.isNotEmpty(ext_data)){ + result=JSONObject.parseObject(ext_data); + } + if (ObjectUtil.isNotEmpty(result)) { String product_code = WQLObject.getWQLObject("md_me_cribbinginfo").query("material_id = " + result.getString("material_id")).uniqueResult(0).getString("product_code"); result.put("product_code", product_code); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql index 2f22a94..cb9c77e 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/wql/ACSTOMES_001.wql @@ -119,7 +119,6 @@ IF 输入.flag = "4" QUERY SELECT - point.point_code as device_code FROM sch_base_point point diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 074475d..2841fd3 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -1,5 +1,6 @@ package org.nl.wms.sch.manage; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -65,6 +66,12 @@ public abstract class AbstractAcsTask { taskDto.setStart_device_code2(json.getString("start_point_code2")); taskDto.setNext_device_code2(json.getString("next_point_code2")); taskDto.setVehicle_code(json.getString("vehicle_code")); + //木托盘载具类型,传给ACS的时候需要转换 + JSONObject muVehicle = WQLObject.getWQLObject("sys_dict_detail").query("name= 'MD_MTPVEHICLE_TYPE' and value = '" +json.getString("vehicle_type") + "'").uniqueResult(0);// + if (ObjectUtil.isNotEmpty(muVehicle)){ + taskDto.setVehicle_type(muVehicle.getString("dict_sort")); + } + arr.add(taskDto); } return arr; @@ -101,7 +108,7 @@ public abstract class AbstractAcsTask { * @param form 创建任务需要的参数 * @return 返回任务标识 */ - public abstract String createTask(JSONObject form); + public abstract String createTask(JSONObject form); /** * 自动生成任务 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/BTHCToXLTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/BTHCToXLTask.java new file mode 100644 index 0000000..db4ec34 --- /dev/null +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/BTHCToXLTask.java @@ -0,0 +1,156 @@ +package org.nl.wms.sch.manage.buss; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.common.utils.UserInfoUtil; +import org.nl.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.utils.SpringContextHolder; +import org.nl.wms.WorkProcedureEnum; +import org.nl.wms.common.PointUpdateUtil; +import org.nl.wms.common.SortingUtil; +import org.nl.wms.common.StructFindUtil; +import org.nl.wms.ext.acs.service.impl.WmsToJnServiceImpl; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.AreaEnum; +import org.nl.wms.sch.manage.BillTypeEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.impl.PointServiceImpl; +import org.nl.wms.st.ivt.IvtChangeTypeEnum; +import org.nl.wms.st.ivt.StoreIvtServiceImpl; +import org.nl.wql.WQL; +import org.nl.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; + +import java.util.HashMap; + +/** + * 1、半托缓存到分拣机械手下料位 + * + */ +@Service +public class BTHCToXLTask extends AbstractAcsTask { + private final String THIS_CLASS = BTHCToXLTask.class.getName(); + + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + /** 改变任务状态 */ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + taskTab.update(jsonTask); + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + startPointObj.put("vehicle_type", ""); + startPointObj.put("material_id", ""); + startPointObj.put("update_time", DateUtil.now()); + pointTab.update(startPointObj); + + + JSONObject endPoint = pointTab.query("point_code='" + jsonTask.getString("next_point_code") + "'").uniqueResult(0); + endPoint.put("lock_type", "00"); + endPoint.put("point_status", "02"); + endPoint.put("vehicle_code", jsonTask.getString("vehicle_code")); + endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); + endPoint.put("material_id", jsonTask.getString("material_id")); + endPoint.put("update_time", DateUtil.now()); + pointTab.update(endPoint); + + } + } + + @Override + public void findStartPoint() { + } + + @Override + public void findNextPoint() { + } + + @Override + public String createTask(JSONObject form) { + // 请求参数 终点不能为空 物料,数量,客户,批次,创建方式,托盘,是否满托不能为空! 起点点位不为空时,单据编号不能为空! + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String vehicle_code = form.getString("vehicle_code"); + String vehicle_type = form.getString("vehicle_type"); + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); + String material_id = form.getString("material_id"); + String create_mode = form.getString("create_mode"); + + + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", task_id); + taskObj.put("task_code", IdUtil.getSnowflake(1, 1).nextId() + ""); + taskObj.put("task_type", "01"); + taskObj.put("acs_task_type", "1"); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("request_param", form.toJSONString()); + taskObj.put("next_point_code", next_point_code); + taskObj.put("material_id", material_id); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("vehicle_type", vehicle_type); + taskObj.put("handle_class", THIS_CLASS); + taskObj.put("is_auto_issue", "1"); + taskObj.put("create_name", "管理员"); + taskObj.put("create_id", "1"); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("is_delete", "0"); + taskObj.put("create_mode", create_mode); + + //锁住起点 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject startPointObj = pointTab.query("point_code='" + taskObj.getString("start_point_code") + "'").uniqueResult(0); + + taskObj.put("vehicle_code", startPointObj.getString("vehicle_code")); + taskObj.put("vehicle_type", startPointObj.getString("vehicle_type")); + taskObj.put("material_id", startPointObj.getString("material_id")); + + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + taskTab.insert(taskObj); + + + startPointObj.put("lock_type", "01"); + startPointObj.put("update_time", DateUtil.now()); + pointTab.update(startPointObj); + return task_id; + } + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + } + + @Override + public void cancel(String task_id) { + } +} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java index 670717a..82378f4 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java @@ -234,6 +234,7 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { } vehicle_code = outStructObj.getString("vehicle_code"); + vehicle_type = outStructObj.getString("vehicle_type"); if (StrUtil.isEmpty(vehicle_code)) { vehicle_code = "999"; } @@ -305,6 +306,7 @@ public class CallEmptyVehicleTask extends AbstractAcsTask { taskObj.put("next_point_code", next_point_code); taskObj.put("next_area", nextPoint.getArea_type()); taskObj.put("vehicle_code", vehicle_code); + taskObj.put("vehicle_type", vehicle_type); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", is_auto_issue); taskObj.put("create_name", UserInfoUtil.getNickName()); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java index 833696d..c520a56 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallMaterialTask.java @@ -48,13 +48,6 @@ public class CallMaterialTask extends AbstractAcsTask { jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); jsonTask.put("update_time", DateUtil.now()); taskTab.update(jsonTask); - HashMap map = new HashMap(); - map.put("bill_status", "40"); - map.put("update_optid", UserInfoUtil.getCurrentUserId()); - map.put("update_optname", UserInfoUtil.getNickName()); - map.put("update_time", DateUtil.now()); - WQLObject.getWQLObject("ST_IVT_workProcedureIOS") - .update(map, "task_id='" + jsonTask.getString("task_id") + "'"); } if (TaskStatusEnum.FINISHED.getCode().equals(status)) { @@ -146,6 +139,7 @@ public class CallMaterialTask extends AbstractAcsTask { startPointObj.put("lock_type", "00"); startPointObj.put("point_status", "00"); startPointObj.put("vehicle_code", ""); + startPointObj.put("ext_data", ""); startPointObj.put("update_time", DateUtil.now()); pointTab.update(startPointObj); taskTab.update(jsonTask); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/FmjToPackIngTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/FmjToPackIngTask.java index b1232c3..8a319d6 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/FmjToPackIngTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/FmjToPackIngTask.java @@ -65,6 +65,9 @@ public class FmjToPackIngTask extends AbstractAcsTask { startPointObj.put("lock_type", "00"); startPointObj.put("point_status", "00"); startPointObj.put("vehicle_code", ""); + startPointObj.put("vehicle_type", ""); + startPointObj.put("material_id", ""); + startPointObj.put("ext_data", ""); startPointObj.put("update_time", DateUtil.now()); pointTab.update(startPointObj); //调用mes接口 @@ -128,6 +131,7 @@ public class FmjToPackIngTask extends AbstractAcsTask { taskObj.put("next_point_code", next_point_code); taskObj.put("next_area", nextPoint.getArea_type()); taskObj.put("vehicle_code", vehicle_code); + taskObj.put("vehicle_type", start_pointObj.getString("vehicle_type")); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); taskObj.put("create_name", UserInfoUtil.getNickName()); @@ -144,8 +148,6 @@ public class FmjToPackIngTask extends AbstractAcsTask { record1.put("end_time", DateUtil.now()); recordTab.update(record1); } - - return task_id; } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java deleted file mode 100644 index 1c0983d..0000000 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/RgvTask.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.nl.wms.sch.manage.buss; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; -import org.nl.common.utils.UserInfoUtil; -import org.nl.exception.BadRequestException; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.AreaEnum; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wql.core.bean.WQLObject; -import org.springframework.stereotype.Service; - -/** - * 入库任务生成 - */ -@Service -public class RgvTask extends AbstractAcsTask { - private final String THIS_CLASS = RgvTask.class.getName(); - - @Override - public void updateTaskStatus(JSONObject taskObj, String status) { - /** - *改变任务状态 - **/ - String task_id = taskObj.getString("task_id"); - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - //更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { - // 更新任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("remark", "任务执行完成"); - taskTab.update(jsonTask); - } - - } - - @Override - public void findStartPoint() { - - } - - @Override - public void findNextPoint() { - } - - @Override - public String createTask(JSONObject form) { - JSONObject taskObj = new JSONObject(); - //只需要传起点就好,跟载具,终点永远是入窑口 - String vehicle_code = form.getString("vehicle_code"); - String start_point_code = form.getString("start_point_code"); - String next_point_code = form.getString("next_point_code"); - if (StrUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("载具不能为空!"); - } - if (StrUtil.isEmpty(start_point_code)) { - throw new BadRequestException("起点不能为空!"); - } - JSONObject beforTaskObj = WQLObject.getWQLObject("sch_base_task").query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(beforTaskObj)) { - throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); - } - - taskObj.put("task_id", IdUtil.getSnowflake(1, 1).nextId() + ""); - String task_status = TaskStatusEnum.START_AND_POINT.getCode(); - taskObj.put("task_code", IdUtil.getSnowflake(1, 1).nextId() + ""); - taskObj.put("task_type", "05"); - //输送任务 - taskObj.put("acs_task_type", "2"); - String start_area = AreaEnum.RYSSXQ.getCode(); - String next_area = AreaEnum.YQY.getCode(); - taskObj.put("task_status", task_status); - taskObj.put("start_point_code", start_point_code); - taskObj.put("start_area", start_area); - taskObj.put("next_area", next_area); - taskObj.put("next_point_code", next_point_code); - taskObj.put("vehicle_code", vehicle_code); - taskObj.put("create_name", UserInfoUtil.getNickName()); - taskObj.put("create_id", UserInfoUtil.getCurrentUserId()); - taskObj.put("create_time", DateUtil.now()); - taskObj.put("update_optid", UserInfoUtil.getCurrentUserId()); - taskObj.put("update_name", UserInfoUtil.getNickName()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("handle_class", THIS_CLASS); - //任务基础表【sch_base_task】 - WQLObject.getWQLObject("sch_base_task").insert(taskObj); - return taskObj.getString("task_id"); - } - - - @Override - public void forceFinish(String task_id) { - if (StrUtil.isEmpty(task_id)) { - throw new BadRequestException("任务id不能为空!"); - } - JSONObject taskjo = WQLObject.getWQLObject("sch_base_task").query("task_id='" + task_id + "'").uniqueResult(0); - taskjo.getString("taskfinish_mode"); - this.updateTaskStatus(taskjo, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void pullBack(String task_id) { - - } - - @Override - public void cancel(String task_id) { - - } -} diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java index 47fd17f..0370fe9 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/SendMaterialTask.java @@ -108,6 +108,9 @@ public class SendMaterialTask extends AbstractAcsTask { endpointObj.put("lock_type", "00"); endpointObj.put("point_status", "02"); endpointObj.put("vehicle_code", vehicle_code); + endpointObj.put("vehicle_type", jsonTask.getString("vehicle_type")); + endpointObj.put("ext_data", jsonTask.getString("request_param")); + endpointObj.put("material_id", jsonTask.getString("material_id")); endpointObj.put("update_time", DateUtil.now()); pointTab.update(endpointObj); @@ -267,6 +270,7 @@ public class SendMaterialTask extends AbstractAcsTask { qty_unit_id = BussConstant.HN_IN_QTY_UNIT_ID; bill_type = BillTypeEnum.SZRK.getCode(); endArea_type = AreaEnum.BTHCQ.getCode(); + break; default: qty_unit_id = BussConstant.HN_IN_QTY_UNIT_ID; @@ -322,6 +326,22 @@ public class SendMaterialTask extends AbstractAcsTask { } String task_status = TaskStatusEnum.START_AND_POINT.getCode(); PointDto nextPoint = pointService.findByCode(next_point_code); + + + // 如果是压料制下,或者是分拣送料需要更新组盘信息,将task_id 更新 + JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code).process().uniqueResult(0); + if (StrUtil.equals(WorkProcedureEnum.YZGX.getCode(), workInfo.getString("workprocedure_code")) + || StrUtil.equals(WorkProcedureEnum.FJGX.getCode(), workInfo.getString("workprocedure_code"))) { + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject groupInfo = groupTable.query("group_id='" + group_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(groupInfo)) { + groupInfo.put("task_id", task_id); + groupInfo.put("material_move_id", task_id); + groupTable.update(groupInfo); + } + } + + // 终点点加锁 HashMap lock_map = new HashMap(); lock_map.put("lock_type", "01"); @@ -342,22 +362,27 @@ public class SendMaterialTask extends AbstractAcsTask { taskObj.put("create_name", UserInfoUtil.getNickName()); taskObj.put("create_id", UserInfoUtil.getCurrentUserId()); taskObj.put("create_time", DateUtil.now()); + taskObj.put("update_name", UserInfoUtil.getNickName()); + taskObj.put("update_id", UserInfoUtil.getCurrentUserId()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("vehicle_code", vehicle_code); taskObj.put("is_delete", "0"); + //包装工序,把木托盘类型 + if (StrUtil.equals(WorkProcedureEnum.FJGX.getCode(), workInfo.getString("workprocedure_code"))){ + String device_id = workInfo.getString("device_id"); + JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + + device_id + "' and producetask_status in('02','03','04')").uniqueResult(0); + if (ObjectUtil.isEmpty(produceObj)) + throw new BadRequestException("设备未设置工单或者工单状态不正确,请检查LMS设备工单状态!"); + //木托盘类型 + taskObj.put("vehicle_type", produceObj.getString("vehicle_type")); + taskObj.put("material_id", produceObj.getString("material_id")); + taskObj.put("producetask_id", produceObj.getString("producetask_id")); + } taskTable.insert(taskObj); - // 如果是压料制下,或者是分拣送料需要更新组盘信息,将task_id 更新 - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code).process().uniqueResult(0); - if (StrUtil.equals(WorkProcedureEnum.YZGX.getCode(), workInfo.getString("workprocedure_code")) - || StrUtil.equals(WorkProcedureEnum.FJGX.getCode(), workInfo.getString("workprocedure_code"))) { - WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); - JSONObject groupInfo = groupTable.query("group_id='" + group_id + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(groupInfo)) { - groupInfo.put("task_id", task_id); - groupInfo.put("material_move_id", task_id); - groupTable.update(groupInfo); - } - } + //结束木托和钢托绑定时间 // 载具点位记录表【SCH_BASE_vehiclePointRecord】 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java index 18bfcd1..b9cbb5a 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/ToPackIngTask.java @@ -4,7 +4,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -12,18 +11,10 @@ import lombok.extern.slf4j.Slf4j; import org.nl.common.utils.UserInfoUtil; import org.nl.exception.BadRequestException; import org.nl.modules.system.util.CodeUtil; -import org.nl.utils.SpringContextHolder; -import org.nl.wms.WorkProcedureEnum; import org.nl.wms.common.PointUpdateUtil; -import org.nl.wms.common.StructFindUtil; -import org.nl.wms.database.service.VehicleService; -import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; import org.nl.wms.ext.acs.service.impl.WmsToJnServiceImpl; import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.AreaEnum; import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.dto.PointDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; @@ -40,8 +31,7 @@ import java.util.HashMap; @Slf4j public class ToPackIngTask extends AbstractAcsTask { private final String THIS_CLASS = ToPackIngTask.class.getName(); - private final VehicleService vehicleService; - private final WmsToAcsServiceImpl wmsToAcsServiceImpl; + @Override public void updateTaskStatus(JSONObject taskObj, String status) { @@ -63,6 +53,7 @@ public class ToPackIngTask extends AbstractAcsTask { } if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + //覆膜或者半托 String startPointCode2 = jsonTask.getString("start_point_code2"); String nextPointCode2 = jsonTask.getString("next_point_code2"); // 更新任务状态为完成 @@ -76,18 +67,22 @@ public class ToPackIngTask extends AbstractAcsTask { JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); startPointObj.put("lock_type", "00"); startPointObj.put("point_status", "00"); -// startPointObj.put("vehicle_code", ""); startPointObj.put("update_time", DateUtil.now()); pointTab.update(startPointObj); + JSONObject startPointCode2Obj = pointTab.query("point_code='" + startPointCode2 + "'").uniqueResult(0); JSONObject nextPointCode2Obj = pointTab.query("point_code='" + nextPointCode2 + "'").uniqueResult(0); + //覆膜或者半托 if (ObjectUtil.isNotEmpty(startPointCode2Obj)) { startPointCode2Obj.put("lock_type", "00"); startPointCode2Obj.put("point_status", "00"); startPointCode2Obj.put("vehicle_code", ""); + startPointCode2Obj.put("vehicle_type", ""); + startPointCode2Obj.put("material_id", ""); startPointCode2Obj.put("update_time", DateUtil.now()); pointTab.update(startPointCode2Obj); } + //分拣机械手下料位 if (ObjectUtil.isNotEmpty(nextPointCode2Obj)) { nextPointCode2Obj.put("lock_type", "00"); nextPointCode2Obj.put("point_status", "00"); @@ -162,10 +157,10 @@ public class ToPackIngTask extends AbstractAcsTask { throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); } String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - PointService pointService = SpringContextHolder.getBean(PointService.class); - PointDto startPoint = pointService.findByCode(start_point_code); + JSONObject startPoint = pointTable.query("point_code='" + start_point_code + "'").uniqueResult(0); + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); - PointDto nextPoint = pointService.findByCode(next_point_code); + JSONObject taskObj = new JSONObject(); taskObj.put("task_id", task_id); taskObj.put("task_code", IdUtil.getSnowflake(1, 1).nextId() + ""); @@ -173,10 +168,9 @@ public class ToPackIngTask extends AbstractAcsTask { taskObj.put("acs_task_type", "1"); taskObj.put("task_status", task_status); taskObj.put("start_point_code", start_point_code); - taskObj.put("start_area", startPoint.getArea_type()); + taskObj.put("start_area", startPoint.getString("area_type")); taskObj.put("request_param", form.toJSONString()); taskObj.put("next_point_code", next_point_code); - taskObj.put("next_area", nextPoint.getArea_type()); taskObj.put("vehicle_code", vehicle_code); taskObj.put("handle_class", THIS_CLASS); taskObj.put("is_auto_issue", "1"); @@ -190,16 +184,27 @@ public class ToPackIngTask extends AbstractAcsTask { String vehicle_type = form.getString("vehicle_type"); String start_area = ""; String point = ""; - String workprocedure_id = WorkProcedureEnum.FJGX.getId(); - JSONObject joo = pointTable.query("point_code='" + start_point_code + "'").uniqueResult(0); - JSONObject jsonObject1 = WQL.getWO("ACSTOMES_001").addParam("flag", "1").addParam("workprocedure_id", workprocedure_id).addParam("material_id", material_id).addParam("device_id", joo.getString("device_id")).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonObject1)) { - // 如果有库存,则出半满托盘 - // 叫料出库 - point = jsonObject1.getString("point_code"); - vehicle_code = jsonObject1.getString("vehicle_code"); - vehicle_type = jsonObject1.getString("vehicle_type"); - taskObj.put("start_point_code2", jsonObject1.getString("point_code")); + + //生产工单信息 + JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code) + .process().uniqueResult(0); + String device_id = workInfo.getString("device_id"); + + JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + + device_id + "' and producetask_status in('02','03','04')").uniqueResult(0); + if (ObjectUtil.isEmpty(produceObj)) + throw new BadRequestException("设备未设置工单或者工单状态不正确,请检查LMS设备工单状态!"); + + + //查找半托缓存位 + JSONObject start_Point2 = pointTable.query("area_type='06' and vehicle_type = '"+produceObj.getString("vehicle_type")+"' and material_id = '"+produceObj.getString("material_id")+"'").uniqueResult(0); + + // 如果半托缓存有库存,则出半满托盘 + if (ObjectUtil.isNotEmpty(start_Point2)) { + point = start_Point2.getString("point_code"); + vehicle_code = start_Point2.getString("vehicle_code"); + vehicle_type = start_Point2.getString("vehicle_type"); + taskObj.put("start_point_code2", start_Point2.getString("point_code")); taskObj.put("next_point_code2", start_point_code); } else { // 找空木托盘 @@ -211,49 +216,25 @@ public class ToPackIngTask extends AbstractAcsTask { JSONArray pointarr2 = WQL.getWO("ACSTOMES_001").addParam("point_code", "KTPDDW5").addParam("flag", "4") .process().getResultJSONArray(0); PointUpdateUtil.updatePoint(pointarr2); - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", start_point_code) - .process().uniqueResult(0); - String device_id = workInfo.getString("device_id"); - JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" - + device_id + "' and producetask_status in('02','03','04')").uniqueResult(0); - if (ObjectUtil.isEmpty(produceObj)) - throw new BadRequestException("设备未设置工单或者工单状态不正确,请检查LMS设备工单状态!"); - vehicle_type = produceObj.getString("vehicle_type"); - start_area = AreaEnum.MTPQ.getCode(); - JSONObject param = new JSONObject(); - param.put("vehicle_type", vehicle_type); - param.put("area_type", start_area); - param.put("point_code", start_point_code); - JSONObject outStructObj = StructFindUtil.getEmptyVehicleOutStruct(param); // 找覆膜点 - if (ObjectUtil.isEmpty(outStructObj)) { - throw new BadRequestException("未找到合适的空托盘点位"); + + vehicle_type = produceObj.getString("vehicle_type"); + start_Point2 = pointTable.query("area_type='05' and vehicle_type = '"+produceObj.getString("vehicle_type")+"'").uniqueResult(0); + if (ObjectUtil.isEmpty(start_Point2)) { + throw new BadRequestException("覆膜区未找到合适的木托盘类型"); } - point = outStructObj.getString("struct_code"); - taskObj.put("start_point_code2", outStructObj.getString("struct_code")); + taskObj.put("start_point_code2", start_Point2.getString("point_code")); taskObj.put("next_point_code2", start_point_code); vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_MTP"); } - // 把载具类型给RGV - JSONObject js = new JSONObject(); - JSONArray array = new JSONArray(); - js.put("device_code", "RGV2"); - js.put("code", "to_container_type"); - js.put("value", vehicle_type); - array.add(js); - try { - wmsToAcsServiceImpl.action(array); - } catch (Exception e) { - e.printStackTrace(); - } - // todo: start_point_code设置新的载具类型和载具编码 - joo.put("vehicle_code", vehicle_code); - joo.put("vehicle_type", vehicle_type); - WQLObject.getWQLObject("sch_base_point").update(joo); + startPoint.put("vehicle_code", vehicle_code); + WQLObject.getWQLObject("sch_base_point").update(startPoint); // 锁住点位 HashMap lock_map = new HashMap(); lock_map.put("lock_type", "01"); - WQLObject.getWQLObject("sch_base_point") - .update(lock_map, "point_code = '" + point + "'"); + WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + point + "'"); + + //木托盘类型 + taskObj.put("vehicle_type", vehicle_type); taskTable.insert(taskObj); return task_id; } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/SCH_Base_Kiln01.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/SCH_Base_Kiln01.wql index 5adcfbe..f371ab9 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/SCH_Base_Kiln01.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/st/basedata/service/wql/SCH_Base_Kiln01.wql @@ -47,7 +47,6 @@ point.*, structattr.struct_id, structivt.stockrecord_id, - structivt.material_id, structivt.is_full, structivt.ivt_qty, protask.producetask_code, diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls b/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls index f33bcd2ff1d3fe7e01494f6cdb7365963eae44e4..cb05667333e57b7fd16127ff1b51510eeaad109e 100644 GIT binary patch delta 70508 zcmeFa2YeO9`aV9hyC;PtkWdrqNdhFHCe+YF5}NcT2neBr^rBKd0Z|YXfd~s$Y>0>y z!5l=usECM&*bwWD-Rrd=*MeRpzvrFV-Lt#dfOx%EzyJR|=d)+eK07n-JMX+R^S@sfm4g`-AM5q(TRe73#LDSM-r^rKBq*4# z1(e#K6#T4RReo0mpEw~C6wLM&Mrn-i7&YV8)T>*MDaZ&LU$8OkYL)e0wkI}xbu>R) za8IRb31=0)YWTpu8LTpU7bR9^Ye1N>8_yQ>4=;5#E_AlUotLu~?0{nAZCcrtS7Fsc zc}Ka=GUT=B-s(QfS*K9RPgSl4&MTBNe(n690r7}XIlIFtO(4?vb*C&BN?9UG6Y2Np zRhA9f)AOoKzUPi9u}VSD0TnZ1{Kb&VT9nRNImYJ2#bx=k{4C7GGgu@`Vr-Fx7nIMg z#$yV;9#AborXi_t=4UL6{^1iAQ&7G!rP)!Reov&(Z^s7od!0abq*W`ZH72UO8fzz5 zu(}B)nJyBJOs%!&k!kO0-HE%6D3q%Sl$e7%q9C}Icsyg72F{B7iy|tsMG?e?`FTZM zy7*AZo_l70(EqU`H*;S_71b$N`~1}f)ArXcII}!<&)&nmc!B@rh&>TUkJaFl3Q9g| zSn%pcBMVNwTeYD0mRLTu;FWi4(7%GEAJ;6%-x{k-R|}rr(zM`h98!XrA^}eDSp{o8 zN$0Z*p8ljEzefCCi{Bar6K;y-3kx#d@)r~>iRFt#s>R~`b>cTbzXe-9ttnD26)8_X z5vyFU7OcHFr{MC>5(|pA#40zc1*6wD;LA;h_zH{iO~{j8koI}af|46!l~rm%-13?Q zJKw2Tu>Zw49ykL}~*2c3Ty`26CxU(D;Q| zz835!aIGNko~nGE?SFysKYd%(hPOe=3X4JO;Scn~D18)5(}0=8B*lByR^jUlz9~*B z*j!w(V8M#mh8r#+_pEJI8tRvre&Z#k-*gG-A**V)BRwx&`+~Lqs8aCr7nR~ksD>z1 zcD$Enil=}wKOr)cn4IU3x#9i`GU7}R!4z!y#|4PJ@{iODa#FF##!0j0)T;_+eNesP z)86nio^Z8iOTn_$sXB*ou52w)nItOHQ#(I*iRq7ALV6PY^B3Ut=p~dzyuNUW>5pAP zdhlBD#ZtUd<5W9tgYB9{;(qBOB<$&_3MVchJy_x|V-!o+)99;Ts|0TQg8IC|`G_(4 z4J?+u^G`a~`10{%Cw;f7`~<>&`9)$g$4?)-aM7wEgbj?Nu|eY>_2KgpuOh5G`+FD3FXcOOugv#apMsG;56KG5Be3K5A@JUXVRH$qKN*z*fr61k zhfAy?yK@O)KK{v-w~qX||M>m|BX3|8+1_6zI*pBIbJ&ApKN?8+Uyr5Us_{BkKhy_= z1fBf;AxxGTAImmOmY{m`mXRj$8-sc$jZaG35HZ0vM=7iVV`uUO5_TpJd!DMXC$ld-&UU^S-b@H3I1r)UEotDASK`iM^T zwOK29$v>8ruuo78614oRW?3DopLq|MJLR32|IH5>1a+}x9g1a2Q;j`BqBuW~KRUQ~ z_d)$Dcl_q1n^%9dX6)+z=U=*YWgxEJ0IlMZVG{;*U0W`@UtE*Q!}cXyKPe;jxzD$b z-Fy6oM^>~-%vhB*xo0X%(A!_Xl?@Jn_V5C5NuP zCo!ot>k^rM%VkAh{J7%Xj4n$bI`QL*_-0W*MSS<*?J;kqR{pBb+Riy2zp>%qpyfRe zEpF}OA193o+{OA_drzCl*S2Q*pE`8=eJ}FQW6~h54$h!(f!p|>(0I7REzo#q|g0w>D`-ph28np zB0v`zVY-g$6s21u)(I5zQ$Kp zFIic5?T(vYKKlJGOZ3`D)49 zC)fWYvgft`I(_}_pU#e3_U(jP_e_~P>aHK39a%TwgGQ4UKKjOI_4nV~=^s71&a3}= zaPfj6FSZH9E~-Ca_cwv>+Bci@(>n{sw=UnI*ZIT~w^e@e=aYAzJ-PAw$uBI<*?9fm z;-^%a(kZ>%AhrFQ!`aKXej656@ycrhy{>(@!_Pk`+n=nw`Pa-M9<3}{@y*Xi)_-t% z*rLaGR-B#KBIo6IZ?1CUZ07l!UrnAq=-bn)3&&4uP;`&_joQ6QUZXyiV}M+hNFC( zcD|&fq+pWLUjEr?{`uVeld86lpftnL`SqzU@Ju72nj1s#V!*4h1@xa@;5XI87~{wG z0EP+;`*e)GNK`^|{Py78$M_FQ#6;k~0@Lq&i4Tps4o3lO`J4sUKEr4D^yByP2z~Qo zJUm$81RoTm-}nw6qeo8U(fYY}cr9Oh_Hq~xR(Y3C@#*E;@o>Fu2Oh%{^bzm#nvrwo z&m7NLJr<$!WxSGJoX5kpPp%w1P=BQeRrF<5O=)<`5jVJw-it>u)xlWM2fLhl{otx`@5@g_AiX|qvJU{6lFWPd}5EZE0 zp0mNI!0Zm3?I{;v?4KRseuLwrEY8NpFc#UFv&+EomTb;G1IG{LKr-OCI2Sdq$k@cL zoNa~1SL)8$ATYYM2WNk;%GjEooV@}@AMV517hrIAU(U{g!I%4^alv4>ft*c(gdZNn z*)cG>{&LO=1K{-iArKivKJE(6ZUCpphjI2*IAi-qaP|&3?K6_I8BvU_9L3oqVDxw% z&V$jL#&EU`46cD*?gnEGp#D7}!7nCp76pcOUd7o-NO1pDlmp52f@VzvV@GD7VkEg) zoCQYLh8ZwNs^1M)bG8cI>ddvA{Q!mz&FAbe7@E0|vuhx_T8lYLMq6)0&$=57?OuYm zgrv?cf4gAmQc4X6PmQhg(5=fS`)n>Z^519#nlHUtA%cX3u13_N}}XPdx4rOllE2#FlK zm$MyUF_#n!GM4o<#vj-uOSr4Pl!BFfYoP7t0EZEN3NHC=C!1(Z4b;cgt z$=OX1$>qB_YYU0|`WR;)fU%eNat5B*rb5p0z}U=voV6yU+Rs@yn&|x}K>&Tn4mb0(XMA~zZ3?#Jt2xomDp{hqYdk>5~)BXhz250OzXU{`a zF(){C9Sn^<$yo!4sQ0U!RR$yBucPgetoRgX%fQIa)0_rb?P1rGJ!PGYI zuiupY^IfNF>mPi}Q=@kL18VjSM>LA->8sSfJX6nKrS{Z!p5gpFPV* z2GC#V!z-`|B^GDU6POc2OO(POgi;s;Pzr;-mck&25Ed{9Ln2Hh%! zp;b#^5Ns(dfMzcRLh_|BzXz7+fhD=HUl9O9%dxxZhaF;7am3j@s__jNe^&#GNMsNz@1bULha^0V-`Z~ zw^^m?P$8AdWQ3a3tBga4K~U4qr>}nJ_k3)nJB;EgvKkQ29V)(h#UFT=aPb!hBkc#< z><2&mz=yk(xGoBJD{(y!tiA`9;(?`lU}<)2q@l14?4W@)^uQW0(%>{?aczrGxVn zMo~KD7<5Rp-56;x6_N2PujDEMb7QIG7=%k*i#BA9zhVboiYPER~vsv@u=N+qXB!Cfq-E>XlR6k$_!8WiYruS%>RLTrIN@_W_L zH%ts1BX*c&GOF!f6on!bvH-aFVVU zP7*cnfFV#RG?I!}22vR>oEpvxC)M%7X<&8YqanT48yydjE%&es)_!jvdQ0_C$w<4Gr_#gmR%{AM>$K zV=6G}|1_+G;rpq6%BS=U6gvh8(n5EqASH8SG`P4iD%_3H;Nr$$&V?}3Dxsmqosc@6 z8zWV7W29zoj8x2xk$SnYaMCS+`d@P3Aw!WSa5vXvo4GNv&D&aFIWke;WXPI zOLa|jkt8h1155V6$QH4)OL@r_abskQSXf~dB~j&(`m7F0vOa2r=8LK&=3e+$td>4F zUYQg2&*lmXwzPG--odE}%BP8e3BFK=qOtzdgiwc5P|ByVp<@*TcXQ~P*#W78CR7QX zrw%%yV(6GUXo9W7hJ)o#TZYa@AWZT~JEeEG(EM&T&o*@(YDhLNO;X!b_czj-svc1f z8!5RybDLHrxS+lAF)ycPD(r?Vg}ilM)bA;lbL{u^V8F{C&KR{i~7d6>(*`tuE&zvTF`O}$g7rL?l_ z>Kn4McB*$7X{hJzQqAvfeRQ_6kUyrsm#qxsd-RMPr7w0%a+DnGo|C)CTyfN!c6;@; zw0m5CBNw__sQ)B)wYrF-&T==Nc0v6n+C8p6D#2Ie?t8gQ=qi$Qpxxv8XxbI(H^|+? z^4v?b+pd30yGQjZ-Ndeq++8VmOXTiBxqG3TGAb?9!7nmE>ixSbbx`oE?xNuJwA&GU zqPvpItA5!{Vb={;*t^pdHaDQK{c99<+h(JC2NAaTOw)VzRbu;3C?D#>G=}YQ_3=;P zo7l&&=D3_?9t$JGc3zGF+xsd_d2{{UzDj{H2ITX{In{;wML(K3kw*8$tbZv10$oP58{Vjgd{_#>ggdV*xTs z+#nexZj1&HH%6we8>0clT@mUvZj8)ZV2H)xV~Uz=TX#Y-Yuy-`v~G;d*${S0NQ>qh zH%7Kg2n)!BWW0nxiIMT*#>jYaV`O=_F|st=k|Ep0j)}>UM7>Wv3LQH{R)xO#XSEjJ zr{BC-dr$x8K&2*M5{w6^BcTwq;kI&aCVPGmyD@TL#z(D6Gq0Gy)6hMV=dH<9|{Gk=YiF? zV`l%Q$WbV>?EDlta${*8SOX8Np$A5RBX@Z<8he0EB&N3=r=++BxC}>fIi@u8z?wTS zS)UdTOb&W21?FsoR(3343|y`4pn+w2U~N3GwjNkJ53Ga0tDe-VH9C5Log@}q zFkYFVrtMdY4V6oQ%I#On{01vdRvs*u_M}=1J%jpd2c&;eE%O^Jo}=8wtrn0Bb@t#V z+XKt-z;ZpXE*@A{I~Fh`(ajDTSa%PshX;0U0~_gq zjgnaK)V0c2kx~29EHQp2vBAa+5&UwAQb&!uMxBZiG&GOEkbR9hO|N-_GK*iWuf9Q< zgPn4t*j;m@a*xZ~8SO!Ij0ZN>0~_aojrYJN*fG=FnP>+M2~6_9CVOC4d0n5l)!?VzEB zD?G59Jg}7>*eVa~W)CcIiwC&c1H07&TjPPP^}yD7U<)oBGn3bi;Xk^l#avAHeG^;=xV2~i;zvrLz+7F38fU8dSL0mLZ+)sm*Igmb6`@^%_U|=MVaM1ferJ(hC8qxQmi8!pv1@#Gp7U7R3S&qjgcb;Eco>)wR{6cx79MXTN$@B{@lD_))N(FVi zbGTUo+HQUQ1H3tX^*N=Z(#w0_ZR`jlFtECUS=ly(n@GxWXe}yromcO zFi56+h-rzDDeuO}ly_qRvgO@G$dq?uWXiiSGUeR`k}2=T$dq?uWXc0GeF(`lney(0 zWXiiSGUY2+SLwkX+=Ot6V0y~3Wl63Rs;(84o6scdL-GwQSe)zOn*7q6x z_E_y7`r_Nv^1)g4)TI^DOns4+NJLqcEFF?qlE55KGqaiq-D>a)S2 zUDSI*7e^#_ouzIH?o58NJ+K@POj_tprIZ%B6O$IYp@6N7u}oU%P6h1lLBz1y_3hnM zbN!IXr`-TIF}wY3Vs`u6#QK4hTQ|x6c4K6JTLVUbFBhW?8Q>LIu^}{xkpXTcG|~qddg5WQL6L5GF?x0BGDHwXE+`!KDLKH9X+#U!zeL<4$ah2S#?cJ002GZfv~3OpTNEpCB+} zn7_E+_W0yTr$}MyGmf0dY@q!!p-SJ(jv2(aZ?%Y779XEHRH~7WL3Md znSd%;(~&GsTGh_H(yBHvQwyb8?Mx`mYA0s5s!jE`Th%6Jx2jD{TGgLBER&}51=ps; zRy1G^iTQFT^*X0{VFs-TjQOlSR7qWE8 z@^vqnOu&**RMoP4KNXg*-e#U!*9xb|Fb)kkru$*Wnki=pleH(i*Nu_g8^UCH)U1`* z4n~a+@tKGm~W;Dp1CI$TD_gWEs0LvW(prS;lT=nv!K43LweV6J!~O zGD~L2G6trvoNqI+CZD|0o5x<9yMsX8{IcEoa(Er6eUYP-q?98y{ANtF%#KxO{3D$D=H zq5W}gzwc9h#TvDauQ_f^2-9oNQ)|G*JG#cx#S7Izs`VwRy54>*l)jm8)!= ziYzgy$mYBt^-e0XvplCF%e+#Njdo8mmKI7yHkCovM=J8=y0*?zS~KWG9-PUiiP;s| z#O#V}VopVtD>$Sgo7R@pF{#LsCEUU6tiSUnG{z8y1L#&7|}7-Ked zsy(4WB+UbpE})Yc=>a-1y9a2}a9olx!6qI=qzmYjOu9(t#K;455A@AEu;vmog9LJV zYT=Qvr3cnZV9q9KEih+|Gd-|24$N4_(bfUV&eF~UBNx!!bIApCV;w!PPA*JdlG(UL zjpAuX)rSoICb#efwXE;4;PHpl-H}NDu93d=MbdBCt-hv>ceYVy!HE;g_P}yHuv`zU zi^TNz3rh`kJ;W(zt6b)R_4L4cd0=+0&{Wqx_H<^4vb%+5!hZIIMu#G|(A|0iJg|Wt z*dPxqFxUgU+yfipferP*uJFKyd0@jOhDUSI$EY2-h3?vsTj=hgBW1eap?zuxHSMta zgP~pBpk2?YWqpqX>mE>FGOcry=4g~ z3+Tosdtg_2U{gG>sUFxEauVG{rh8!IB)Zeh^uWkTbfzmjscz)HiLj9->36-N*62P1 ze`jKwg>5#rIoRf6yBgay*sjGk58Hff3$W3{fR{<_Oo(DGHj+qU(zz!M>xX=SzoWq?_l;N zGdb@fO26@#I?1=;Rdt|kz35apd5f`Lblj`zEWS8+>Qw~e_+s6^R!Iro^}1R$+$G~B zE;jzRQqLSJZuOAN8V_u(2e!@wE0CD;TI6jW3Dewdl!nF~ z9@w28*j*mj-5%IIE{qI~{9u#!)l%z4?{%dlExgYIyWazQzyo{G1KVQ9%%1*`9W;9S zRuAl94{VzU_J{|z-2)3e>H+TXz;=3IyF9SRJg_|;*j|Y_weWF|goPeh&;#4&f$jIe zo^)Ww74ZWOP-@{p5A2W!_LRheS>LGNgu_&5;gh50V;31UhyEx{iVdr`F}-q$T2LWhoq@)n8SrULU-^1ri8=%=nrpPsvlnim$6IN=$yV%Z zB!BV3$%ETf?GcTy(s$L+Qp?{bf}$Lw4gM+m>Im(Q@Ca37Co5>iqqc(ik=kckTys40 zA`DE^$^nY6PSEF-*K%BX!98k9ZDpV6X>3zHFiiTT(xFDBFk-?g&(w=>J80-dga;Ps zftB;XqCBu@4@|5Nwzx3}SMW#}3(V~R#Cc#9J+Mjwlc9Z6=_|{0cx)bh48m0e==3M6 zx-il*`n;%WhQ1*Cg(5jYT#8>GhUn#$M*0d!f1&8*&}!PZTBR0MHCBvg^S;_vWBdAO zEWe*qq4a`8EsJl`Ur*GM4K2#&4|uFHml$bL$XO~7=}3!0*wX?dEec^W9chspBQ3J9 z0Dn$oCM_}>$&CDy7Fh|oEReLwjgeH{7-^9kBQ0`c#wv5O;Utmr9trJQWJ=4fMJ6V- z$XTA$A`_F+l3H|ms?ee$qjpk@%qXU0#?T`D&SWigeOLy}t9$TS!vm}7fz|TBYI|UH z>{wOsX=?ESl^z}^7L=I5_LX(D8^WUwsL{rWSo1_?Bdte-6{(i>O0*Yj)IUjJay~Kd z;I8Yyq)OKF!0LOHmtw~PTuMIG4jP2h9GFze1_CpgkrHp{NGB`O$OCKafd!g)fK5HH zbPp`U18XiYlR+t&79Lnjnb(XnO0HXZ6xiAW%k;ox{Ls{ASzcR@bnP5i51FvN1C*lf z;J{?MjviPii3N|e(w^W@w0J|&>Y9qSHBZIKf=F-5<9u%@YupAGp zi@=<+@9Kedv*%4Rw5_`xG_W2L(<^pEH+PD*wj#W+XLYod}x zuDmfJkCI@pu)CI_KqKlK8qvknh}fQ5T147$wUKdxmQx>B%lrn%4Aj04>tJ3n+bOsn z4I+`&N=9N>lsi!hsz_9d4p12Y&K{-V`6Ur&t#AG8>L!OYaAte*FIN!va#dIO?BHb+wOhjZqTuQ2+Pyx# z-3YCme*IjnP86ANq^7uwQGaxi=wy31fJ^i zPFBtEGdu4nS0!WbfUX<14tVQm{)pGtl^Zuzjl1t)+qLo4!*WNojJSR4P2Ic3$9`Dl ztQIjcDY-(?u&cYY@0?P6?d8#zpFf&&{{w5jd4B)9KP{>@s^TZt{_s=V$jlwX7DlP} zR$Ev5$Nby}rXIaKdUgHUZ~y(>r8i|3OzN{~Xa18B?*)(zkIj%%#SJ6M=dBE@YU?hiF=1Vx_nXVSKgcW*n5Siul{&u+SiMI{q(`> zzF#nXZ*iV_#i9+j<FgbJh5rBX_)f$Kqd%P2f6Uca zet1pib*ta_J}*$a{;L(=ysE~T@UyqPQgYL^SA6u+l2tWNUH?$ea(m9~TKVJIZ|*6G zAAReBnYk^-T`~Tx)xp1ieEFjXrak=S+)u}Ra`?bCx9&Kd(17;tLt33b&8an9JahIioLYVM!csGu9NuJSH)kcg&uWgicAwRJbch_@ zt~L7gCY2m==jbL^GdM;!^JyE-;Y}uV4sQ~3dLVNAmBX8-A8U+ma%qQsbTca#un%u0 zD2F$5Hk9i}4x)M$p0lJB+qV5)9CCkFER`jMY?NIRuGjsyE|^7@)`LJ}jnza$q3JVxSy`^sNRS z#&&X(fpTDA8#fs!2L>MD+wpx=e0Om9fTbwV7nk4a3I?LUKns2V3=soSV4wxZ)9eKU zQDC5@AQS}#T5!B*z`%VtlIg=(l#l>190dl-i3d^cxzab^lhVG zw@eEkL*0zzP+zb?k039nEmcnJ_)c0W1P_fY#8*~Fs3qHzVBN}p$Y|tZPB^&Z_ z=EO!bMgQ!2t!`kE8flaogHji%5jdh!V^C^m(Tp)Db*+j=;v2XRsfddhl)6ql%1WjW zX9Wfx!ERHdjLOBJa_iL%sxH18jmKEg;6Sx&ps!x0MW(&1t}~jrJeZiIPBfahJeZg) z3M~&Nu2M(oMa#4*b!1(Lhw>2VMC$=sRSEGGOg+ON$P5&Oj@P+vU;mgW(BLv z3bIV2VihcLQB*QSqJo120_q^K24&GRx+>^1!B2ojFse-x(N?q+Z?^ReGQ7bFN9Hrg zC{8IWMDGxoZ9Ri5)*>DY;&ZGAgvEmRT&sSuLTx4)#A8jh(dRAGVgfW|QqN5nOvHhS z>(pa7CNaf`bCgQ-vwH6b2i;AHzabRMe)wFSf30Y1Ao3Bnc7>F|&AidQW zp&)sTxqK;#*CTU702al1MYb3_XCqv2wYg?DS~345h!J z?DS~35>ap^NaQiz4{VWAR{|rAjYr0rLy5%0*&ZW(1oJ6_4MyR|(ORuq zfMz$UXbVBE3dj}meJF^sR{^=boZcHij8_4atV(rnDVV7$n7PJarmA3u>;z(lUhyEA zsp?>+Dx_}Wc4n#?%*cvWg$hV!0>n*KlN$#!G@X-VS_x*vbMp94z^FFWz|4M*x4;-j zDtnUCv@XxV2jJV0lNhZAh7Jm;RYPMO6w;A+IN>xgRRcHs`H%Y1o3ykcRQ=Y1Vmzw< z1fOEih!+&68r6?S^`8`_(hDsPaJZ*y#S3Z^fFEMDS-jrl3MEmWyi%(;`U(D> z!D)ghbDEJi!74LBl!APhX+c3XnxZm1!d? zQ(fpWUXLS0R2_srRqi+XQ*{vDX^F2oh(BwIuR4fJU9K*4nbeiUR~^Kq?pFu#UE;P2 zB3>O$d5|CCPwAN}v?{~NgrYWVE10Mun3!oWQA03M(`YApDTXYt1{iqEl4uQ!ff^PA zB+(lBiD63OaI(j!mhA+Anjmn7w+E%UbJzi3j-} zV5E(8z{G=muXUv2hz2)#PQ%gT){zfKh1O9Rj)K-vINQSaSw|5#_XNeFWHFIA+;1I~ z!_kx0Q5232SVz$~I%plm;E3iPSxR{v9m3I@ESDYCZ@xuKh|Fgz@K&xB>}GxIEm~rL zd;>pHn2`_D@=o-?k_7eu+JdnxBLJ2xussfpV(I2hyk>dz1U5;eD>4>yBbKiBS*~R0E^cW~g?#3ueUV-5~RQQeI? zkfP*nIiv$KuNawi$q<;+&1q&!XI@iiZo|yHq@(Wg0xbn7V^n6sRsu6U5b2e)_P{bd zur?l8TMw+A#GI~A2LXm$8q$!C9#|(ACRW)3!)vUJ3CfRdvz3oU4J)Jl?CXe#=?{uM#uJ}152L)Z{J2Tn*YdF_G5_J#=ZQ6M1wHPB2tNh@HT@~q9FVT zj%d(G#GoPllte)j_IbcKVG>OQ(FkGY5Yfaki6(()4vLKsM3X>t7vEtJO#;!{>P~}b z5{SMlq>vnMV4QNDwRL33-8uxbL-^N4z^piZlq zckx{Y^<+VPw?RGGqMq!ao@@=o$qwSlsPP_79gtW_#%xeWeGFw0@nmyi*M}~FnM+-r zn5Zn6s4JM*V=z${Ok^l~4JPVZOw@HSQP*OkuGQ8=wyt0TucH%8)CCjK>P+YdF;UmS z#AF&3W?L_NX8;|3G;z{Dx2hr3riPE4?LY00#JtQd$kGPc;O=JBO z98NPvhcrv7X&@SgpoNq`8i-2wAPq!2SfP$Ihg8#`NsSe~|5fl$h@kZ78wi4U^oEdZ z15`2#FSeKEHn8Y5aL{XD(QDwK*T6xqfuJWWb4O$YvsXaWI8}(bAs7h7b{c|#P;93m z7?81@h7Kt=1Oqa*)6kMKDMmvu5Q^Rb7qmt>RnBh&nU|eZfE@ z!9Zg$ut;5H=viYhut?R6CTI)>WcZ^o7zl+w8iN5D{%8yd$nXa#cVjS6px&mI4t3DP zPnD+N0Op-0f~XmDX(EW4F_$J5(IyU}O)R2KETSZhCW0t6KoitB6mw~U(W*2fFgAt? zPGp3jDHti_2f-N?&=id9<%e)Y1vdpF(gSM>M)vZTF(^vh^vs%qk%vWSjcVUiU%g&S z7*3`ORaJWb>4Lyh27z=zpvWMQZV^Zq1k7i#r=zBlaJqv)x*#B)K|uthN1p)#kxEUY z3uS=7ZvM1EAOi&C{Fea&A&))-1f(yL0RpniQq3|TO6k#OK$MU0XHX6e{2AuJPhCmx zGhK-pPYg)Mp5F5ma_pOdfskY03=GJDznNfQoFT$y76Z*J2B-m=2?m}OWGk~~(y=Fd zj>t*JzPS+SVH{J2<{%fNK8GXXzquvQ=0c#RW8d5oXmcS@n(oPNY7TPb*qddMFMUK1 zuZVMoV?W8^OOqi<%t*(+1(<28TxAHq1(>;AonmyJ78Wxt1T()NCo$Q=Vy1;vcT%4g zvUSNQB?8h}Zz*bPMh;qnz+P@f4q93SS~_am(jw4O)Yc4Rv~<+AC0ZDf1EaPr&DuJ{ z7-S6-Gt!T51!kVGA_uL&Oek{D3e1Ee2d%(RD00vW3`zgG6&MOd4qAaB6BmI4Q1g-R z+e$dz!^!R@>X~Aoq8q_NQH0ilx*0`iEvS=1v=)@VLQax(Ym0JgQ0}Kli?%jvEushk zGUADV^z1VQf$xA(L79Sp8B)l!2xJNZW=J8^B9Q5*TBcRCOvrgZ|0hbNnq@-H!mH;` z!Lx6_LW>KK*Fa22&%O>zY1p|-quk`n4D_w?A z=JukU+KJ3&=%Ag*Y=#cnA@gAoB4{TvQ*RD3UJV*z z%z_xNSFeT`siCrj7)gX#Ok)o#A0U&&eXOGpVHQN#$r2&Y(zEWuq)64JhLS#8XHeLz zoWn7d)EN|RRPzlAoh=HTL17wRY$PdkMk8$&hIVIAc+Tj`Ras}f_)8@rkZn{!x@Fmd zzyhP~vju^L27zpgK(-*T$ihtmXkQRGV~pe3&;ll^mW>{?OkINXG%04I2g%ox;8*W; zHv<3ESX4{tmgNX078^|D2qvyGh~-#JHn8*baOVxnEL@t;}5+cn76X&f!Uar+2a>2w6>PIM%W~f}z9~PGwRTCIw_i>w<#It1?1Z73ry?c@<2n?x-@- z5$h_-z1}Fdt0;G=QJJomM7xU0n3qwyT9xTal?hlEbh-+nq<~!^(iQ456h!UX6(V)^ zc z#wa>($4HgwvronS2sAUJ_09K#|XgQt4 zk_9H?p=RsW^}y0qc?15^K+6lqJsa3b3{k!hYdeME~4J*Zyx=*}LJ%J#r$es@bW*HJN9uPz=K zO(2#)gLyA%n=!`LP#)TFQX5x3y?fZo=||q;yYj=a*Jq#9Zd6|I=|7*;7Wk?o<6HXt zSG0wZq?)hLaH=Q1u2s@wU)3I{i2L44IR6}AbX^5warjh=)a9^#^X^Ty zZ;=13VxHfnKmD3k!$*hl`X{exb!z1!#Xf8VWf^<=pO63hs4CU;y!W&){ljoyMZMo! zTJ+j{O&|BVcCvA*lAYB6qe=^w4o_wVO2|W=4O$j{VHB_?iaei*6wQO9-_SW@15`=_+Gd9*(3EiGYf{v^HaX>DaSI?Fk!yi?xMOm(gERI*4Ic-LNWpV-qmjS_gg2p@uS~bg^%r3(A)k&68!A9lK_;G3lmla}f0gAwoUN>H{#L7si>b}fMLXlSGdgQ)#DX(nN~hzu zF*;|4*c!8JmIE{wSSzHYZkvm=={V|wZwCG?W($$3r6{R6j+-NWW1MLNEM1h<92ot} z1eS}mbhc$SifM_%bR2XMzcgYjCLI%X;(Q~d=3ka+jZ@Us>BEsuf!(j^OU`QbYP7Wy z%#-Jx32G$|1ss8r+FJ?t83}1;l~gNvqmi(qmGGQr!uqF0!n|c!Rzd|ln`xutvK1P> zLc@B1P7Q@ZL>o;{fiikP9{od|9^N=n!tpe;!RoN#9nbTE25he)LU8K>| zzt_S7GD+65?pE<64}(qcIl#j0Wb>8{Dg(c~41B039<5=z&D6jBPOA}`OgH?Xg+-aH zU!%;s(CG!rz6+hcPC4f~9p{wHQc$1ugPppb_oI#cjUewl@8E7F$U9H#vFB{r*MPqB zd|ZU1Wj26*;*SpcMfL(3fxh#6WxAorG&Q2*<|^s%A&8`$#%eIt(Z!H7gRtCPk417nRj1#-cz#l6E z-&+Rmt?gOM3XSw#(QR$rAZyvaG78%7iATrHQxJ1-H_J@4lx&oek{hT!F3>D%koM1N zmK~mz%38LotY-P6#qX4Uo+bU^B_&v0YmH7>%e=*(wd{yz4f2-RMr~U;(Q%8E%{u>= z(G9bxWwOwGW?M}o-~w%xhqV7|D{R#1#L6i-;e0 zJ^X3nKjx`uSaY zIsR9bf6l)v|C^Q5>u33-StJ^uAHt|+0}PN2AgocE)I%cATXw<{iG8fhTXwPx{8bBg z8l0iY--*9oM*35s*}<9NbQu}mE&~q@>dp$7le2RYfGKU16L6n+*ONfjvI7?GoaEmx z126W(qvKX9n-QI+HlgMy(R(Yt3c`#P?G=w`w%K0&|JPnZ0{Hn8+iRU-I{L&+iQZVV zw^y;zmeghg1-G~TuYdii?RA^g?__&@6>e{@t+t@eRsU-*Ap!jSY5j{LzIg}_QP_JZ z_DTRACPmrkV-AG$-;4t*OF}`C6_f$#sQ~&o)64icVUu7NR>fJ05t*O-2!xX80vdjd z|3&manD?c&nHNU;0?h&^*mgFK(XYbJQY4@G5#zd2AR#;p_$UuNANbMAIW^qri-0#m zNmo*t7%Ykr$FItc{d(xV-Cq@Mef5*a4<9*m?7*vgp4ZQJ^o8?cJ*<;2BS29|Ci3jV zKgxU3*nf`wcAQH=6tR%0Y}}Y;%+GQaAG?#4;9qy;yg0v|jb-bQjzVFCQl7djQ&Euf zGD9$a{PVM}A}>y}LNMs3)Bz;tM)EjhKwwOK2qnVvA>PeEreIIeH4!t z9y@isWNo~Go9T!dlR-KaVz8}XFmO>04F)NBSqxIa#NavZ#h{N(n=@zDRFEdwxfl#M zMCjzO{cjVY!62nBi@`iFMhp%u#UNrUg;>QfZGM>?UVy=lm&72YF2!KLXyYP7g!`~J z+sozKVr$=J`seuF0aBVAmYgyUjt(QME6#|}KX^W|rX z9)0R80DN%KNkRRk*5^awH84517n{0<2yp;A^tWF9KCyrCFEsV=`YJq=N1r4Lw~*a*;&QC0@8^wfjR^uCK! zfaB%~ngfjV0f?~-(HIO-273+E-;my30o+jUEqYOYOKO{j%&Y;4m?Km}Eoat99$${* ze`4VHJd8ASLpNVHp*rRuj{0ESpmmOvEf3v#Hpp7Tk9=2%WSH)z5PDMe62zI-EJ zk&#bh<7SVWL%Bo+ZS(@68dAn(Mn<}i2{kgz7rLxZ7sKU8NWdsKmc8)vo)=C&^ZE~O zo+>=?+Bb(jrhM~^d=ntSaXd7*$g$lap%x%|voSDI$CepXMx%~7pE@!i{c3%64_`IW zat8hP_Z_y=-}l?;qqudKNd7jNUaxzZuTtQgAVne}VHHC{c+BhGQ%9tzAVLVr9JV%M z7`xq2u8pYa-B2#V?iBm%tj!J)e~wlvM&3vvVrgYSw4%I1P#HY1i{Br>*hnJVjt866 zW%q%zC`?{{mI{=LrW-iuLzA6UB6kv)A0fwS5Qk%%68a_srww?t7U+AMH- z3?F5tVOrw*1WpeTq4X!VJ@tmfPXa%yQAdVB98SOS_>~{(ttps>$q-G&zb%GfAuh6D zX&fH_nTt6ZA`6X%G>p^OCsWC8f1$KtXop%>`U|J5#Z-1hEzA-0F-eq_C53GhJWFP` zp(YBu_s|Vu{woIyNm@tS#k`Zk9#9JP6TN)ZdYToL0@x?&n!*ZE*KJ0DPUIt;LCxH~FTCKUph%U3`AQ`iK2|9Y86L73y{S`;r5u8dJqcRHz=- zG5T``bm=^(i+@n(Y?vv2q2?kJI8FuM_6|TfO%c;P&|Q>sK#0p6RmP#u9*w5*3x#Y< z!xKtE1fd4>5oAamR3!9P8Zvu{Q7UkrD3J1F#-dLn>W#lGKUun&$e&l6DlCZ$gOzhmN`>I&K+Pfls+W>ZZNE^PHWFlWMwebLKgH4 zRDlYk`C8W4&(L%9{R4etYdu412M5C6$e)tax7Xm_eNse|6$y20JIL3t3aKMig&wRT z_U=?EjGR_E82ItOF4juo zURcZv{d$Jx1uE=o6c&(Ue@NlCh(>56Bmf^{qSNu$tOC!@hutS=N zUWIaq`OthaAP>cQPp^_CG5EriAqJ=pX@0w4NRpDIJg?z=JAVijwHzwupgvdlW?+6f zbcL@QcIVgmT4UF7n6D{z(}($bbd#14*+|s3)S6oyos-4_ng&D7V*hX1Qu_H}Fkj4C z${B?`iGC^*ELnSjYq;BWo8a0cJ6`@paU~oyJ$Oh1-m;BouVcI6>Bz z-S~<{zbs~vdR|XV5ofhjaY&EsbDCLM0;lH)I?b%10w?p!X=YJ(htY;#!%V|Js?R=S zf6~~~cvOrVSdjnMLxK19eS7R6=_N5=fBSo3y>iu2PZt2p>bak6m=@9IhvU1 z6r?i;FPh-JhZV0fWTy*5{)1bezE6}PBe`W2LQ`lMd;Bn|u)9F&$Fjh1mfIz#SLXp; z9KFrnt7STvdj1}L2Ice}+-DH|X@~SRLfx}e2L0GbUt))l(HI)6Xl(JZ>@MAU^zoo6 zsSN}*zrJ|1uaQ1zlrPP&Lzj;7CD)T?1R_Xj#6oEfL;?D-QNDVWoYdtBCC^t6?Iwle z@0^?KPw^@R8e#~jIp6;AL6%jX`TGs%(Yy12EBrmX zT;W}&tQxGEfLUNlswZ)&Qf0Rc*|m~E(q*rfaf-#6z8ceC8tJRuIwT$E`Lf!E3<1#7 z7mW4|X>_4ha26NO^pm4}@wMDicBImqjqx=MNUvF1k4=QhCdrV&>6Kl|sUnl&G==K- zkg6mW8nZl|54i1^J2uvk(|HQ48Pn!BjU-7>#D^`Kq!wn64%x$YbC`@R>K_j%RDLGP zm*pUr?Xzf6z@I{rv6|gu?YB6e_!#O8D;Bd#=}H$dH|*aKw37` zB3o8(B)0xdYdL^>A;}$)zV#9GKbkC}P*3q$v?zsq2)n6raf^C0?(L*WTC`VnsfZbS1N5M(zCdQqodN&uY}!<%m&FWY8B+ z@})ZBG4d?w13q2)_R+?QUg{T)>I$Auz^F@HcjWi^h)f^ zY=>f+k=(Ly>VP5lLbi2rWokM?dr)lI?(URTOj)>9y#D261Sd?r3pqVQL5o7({jkUN zSaF*GX`Y=cauV`!#>?s1XyHz$XP1S$oSvh`3AfWzEO5)|IVTQFJ3X;j%25otx}Ba> zftPlAvVfn}hKk>r;&%mp zdhU#AlgGLX3XPOCm_Bm_R?ikq^MzLp4LzX*b#T|@3SS+)<9c6sb!P%nDM{@zu(QH< zStRv6VT$TAr~7JUhU`>GC(S<^YXSz%pE04Knp1fhE&zDK%TxdEqU0*VKyNeR30qe;U^t_qAa50Eoya-|B#)Me18@Xhq%c+;x zxddaEEDinrvA!6?;LQgC%iuLvUj3FbL+0)u6#1o4zPBAAJtJobf1hz}<5CRW3rBtf zgL|2V-^C5q3mL%hlZNyd)ZMaCQ!GE}f+ldFlno4>M^@8;I*N-HvcJIoa1fwgLQQtT z;!Bmzgh?qqDpEB)ZjP_&bkfxe^);gN@5hCufot@tfd5i$+clT~f2(clRT-yg+b0x0 z&J+bx9c|%b48a$R9-~(Yh6=GPl1B1WybsG)&NcvthWa!y8Psi`hG>$!G7uW_!r7?Y z&VxF8*ur+(5kq*>2YmI1hXzx5)@0$g+LmS6!&`7|kD}ErrB!z!^UWS_G3+h9(KWsr z9%h;!FDUxa|^+9H}A|MbZxX%(bCWq_}oTryy+0wy*u zX1#?MpDIJ9M$gHcvWX&i;hvm5`08Ls?E7qri{Cu#nc@S7Qz zq4cGrZM#G{E{mksZ!k&b84O(Xg0|jZsjqL9W4P`tEk9bbCwanJtBYLF{=Fu`GH(;1 ztzjZyzd;)+rbRE4;55#7nFMDn+-VX-kdNcG2(mH%`i&EAlOR*zu~-owJoVIv!Be}x zaxPNrC(c`@!6b25+B6Wp6-+~Sq-Uc@U)nU-1st~lh~HxIdk(+y^OrRZ{@_)F$HmYt zB0m2a6Cqrh2>&Oh`mE+ODExs_{h4Ow82|gG`duQw_f#*v!`$h|=5?2??Fbl{GyaL7~T}Y!(A)a+RZp_Tl zv*%8pJ9)-*|CssyNu%dXN|mZr$~Lx{##EAwHXX+$DB>(0kK8P#8%tu@b0-U5rd3HN zKYw)_%?u<8QhEes%4Ce9MKTo@EnF~_CN8VeAc!c^TqpND7gQ|H&v;)RX9dvPRCQcROeU=f7?)*J@a{qHOh_b@M4}Ng$TnOI`T&&zP_9u<~ z=f)n^nm8YC?9+{XcVnN2{S{QeJOfyReKD>qyG^;R0{UVCk3AJC*AHHpW4r%H4MHW5G$y5xcquQvwa&6k0$8(b zzuku87WmNoAv2IWYGrVxH!lLX87w=Glfgg=dm9|mjCZs?aYzM~Lru+F*qq5_YFVR= zBK_Mg$&~Fg)5L(VJw7yvkR(**PcNfp-eei>h`D^DZ%CSvyNt|o3L>MSP(QWNSLcEY z7f+%3es&7_P<@jxInL~2DS$|m3-vymeD$Wus2M^#qsNVtbJWFHNMWZ%0kW!P2Zd7D zyCR+JvlOn1*7FAVsvt%cTKx5{;2Kt*F31XswmC)atYtTvjCGUUkXwAGy{_HVH{2HCbx0 zAA3p1b(JPoOoe6}qNe)NI~;3i%v16rZs^Ve`;_=Lr0mC_OuwhZ?`iQX)6ngR#w81k zo-{-o>xjnVvi9T&u8Ym$7OVhHxt9-7qh4s)kV!(`{YaIMNRpMubL}xiKhMr3$~pE7 z_8YX*n3tgV*z7rJ#>$LEt9Z?^{bEhrImb={P8su!{YGQI%h(?^_Ql5joUxC^1A!&lvj%JkN~^@?-BcyJiZ!^z7OXc$pq7 zEW^pu_2ezSivLYFwn!}TrUoc;nsvIdYea^!-PoBp|Hn?V|Cim^epSuE^di$NJ*~tH zgUWfiY?rhy`x0&~bt-8^m$nDW&MUi~6&VS+vsZ47V^32^PhBQ+itsQxEk9TL|G4A}Ia%U%1 z{13ac5g5tIv!f~G|99@}=kOY-^5jL*e0v&unr}~Hzd@r1&!VScbGx%gE0y8S7K{0g zLdnhv_Z)DVCu4D+hj34geU`DO`#=bvY3x@R`_0CFpRqq_>^~obKVB0q!q~t|Pq^{G z{~GQrMZu*!%baH&?kq*o{p^X$p|JZr<|FS!K8mlhkQ2SS(XVV3zzkQyCS%{kb z*XP;)qFYN7Z{<>PWW?I^(KCEi^xAuT70PsPF(voD)G3*Uw@aLsHH4WfnDg=<=it&K zg8xJF@_)v`-4|)i%YUeYE6h8Zl7`|AJlgle{x{Cce+8F!kcZ35S=Pm!UdN@~Osun~ z%BN$Gd0FpQ=<74EWwSP&n{`gd3)V8bre`*8fj6sVG|tZHnu}MeHOp*~+d3WZQtOhD zzIb6aUZU2ld3y7%jq&!hmg$XKG;faAre(It&2F60lC^G`o1W1nJtHE$P4L@7-{9mJ zuHwxV`k1gffoS}r2VIxPz6!QF*y6BN!bW&yV_y|}Kel*m3D~M*tAVX1wp!R~ zV~fRB4_hL(By7pp>SC*pEe%@=wp45luu<6!RRlNA@18Y~2fM!Q+n=Bpv{Ab1S?_Ag zF6m`}WxUVud!KxtVH6*-H=pCW8r}n^zxac1r*BB#A+1{IfggR%eGlZvh25?PfAnSc z_ovQdnXS@BaJOAh;cO&&9Q^z5$lH=Og$^;JV%Z`S9Z^DT_J3LFe4 zHt;?f^PPxI^z5H}N#*5BLEqv<56PE<{^VO4y$I>1Avb;WqJ*%l!k>Lb>bfH>G?HCG z=8;B?=+7NEP5ZmBzZ=^<*fwJ$>^|)8H~tr_Ig;LjK-%^I+>7mTY-IKYvC#r^I=3JD zC$Swcjtjm!k{L-SULs)atQYm7Uwv7HN|?%}q{@J= z8qb>J5ps;RguZdsTER1z#oIWmMc`yfNjaQDnd0+}62??=NdsPmvQ~^eQMhO#7?ULM$tbzwPpd0;Ny8<>f= z2WH}}fo8UN`i%<=j?KD@Yc_FG!~+WdID zP(2Kk>0N>fuF8rBs-t$srw`**S$MwEn+@zbWA?N;9a(mH9>xaZ#fIBv7qMw<4r`vT zsbg7sZi|-9(0BcfyQF7!U6Rqcv69KO#_7#krDx{nw8%}*&Tg@3(5|k%o2BPUfs|SsiwpU+K;byi~U~)V?;z zJWXxQtDDzGSUbJB+8*?*VQc)2k;dTsFk8{s8eAG`TN7nLxpPIRwbHycHAbC(*c+?fio zF;k5C!mA_g&xTtQ&I=B2)@^5Hp`>Sf#KLC|7J94_lYElHW^&mTt_x1dXERk&-}_8{ zd!>^)-Bsao_$xPL6unWHaE>}3^~%B7ex29ZARIQtv~D(8uJza$JAFn7G#=DW8t9+E zvPN0w*Li{wm#hkfBDU&i9VPpBg&Ld@)|y{8sI(3#4Wnsu2AJi9@xZV+G{q=%E6SFq z4_?}7G^!pPV0i3v_GRc_Duap>s#2y;MCB;#e&@@Wt>TYVRS2fnl$?cMaX1V#w=Qj!* zS2Yg%WetxKno-R!?S)q~YO%_*OnAXk%>tPp3bBVmto^6B<#DF{RAv2IC6%2muR8MS zl&sX!e)<^OiIUv~hwU4*_AV{oMzvlRrTgKhbfm%RiF9hj2yw|3 zXW)S}I3kqr!tT5C<6lgKVnJQc7O{GgtH4A$_=F1dY3`9bLsOZ6qv@c(TQ~zkwMJnk z3$kir9JMoV()C>g30C^Y`AK=oL#Z*2QqD8VA;LodVIt^|2{N2X9V^M&iIbGbNAZLf zittMncri@}+Y~AR_v#>ax7kQ$d+@PIu&|nwrPAP}9dQCw8&%6mPC1Dx-zm@MdH*X? z>Fz};>~$&hI428os`$}%(4#E0HXxFQ6|`dxs_6t&tB8mo#3E!)B5`Tw-`z%N$cCvS zIn8roM3q;dCzJWHxVsJ~6v4x8$Cb7t>L!Z+m0ESnhnzx z#b?n>EW6px`-oh}W!XuCJF{VSl2`!W$$^JaI~hvxdJc%av3}g11F6Cs)J=wUy|L1$ zL)+I}|Ks`jL!D0>*I(=TmCs+?HD0~5sqcwBf6RN)`^25zliwd7&%Z8J89ctUMXyhN z>+rcd?tkPT{Il5gSwVT=*x-=vl&f$5xcpZm_K_V=>E-VBOF4bNRUF8rj^p+JRJ^CD z13sC(u;;0_+xBIMJ>v@T6I++ezf~^3S(SdIHaIYAJfFukq#Pq<#=3-cOesVhaXA;( z3qlyXe@pS9KOZFFIqb-XsIV7r@@OA+6hKtHpLC9LMVw`TIt39HrWb+{-!*`N2GP%I z%qRpAZy7+3eFm70=0f;Rx#M;%iU!D!mrMbbK>NnBsc=%6&?NBkR50^e^2D)tE{|U; zz%Gh~Z8#`GxuU-SzZIcN8Sb=T-89(9<-eUaCa*TaV~TAIL&oI)_%0)~D0i2Fdv^&$ zQVx=#Gq9_Knsy9tmQXW>vEu=VroTr8Kk#PI58b8ETI=`GXXq*e9)G3e@Y6)|Z!l`o z{59TLM!7JUycmzo1W6$r$75wsG;a;rK(C^*EfnaznIwlhT^&fS@aRe#oo p28rx9Ni30 zu5z2Y)+N(i{_}yeSHC**{vm2fz6qSEt9xGHB=kzW$l*L@g4k|}j)xf{!Ux!4hG@z; j(rV^Qs7KJv`Q=A$s8X?}9FF1~33Txq363f`tG)X#G7O_Q delta 66530 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 B