diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java
new file mode 100644
index 000000000..8877dcc42
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/productionplan/controller/PdmBiSlittingproductionplanController.java
@@ -0,0 +1,96 @@
+package org.nl.b_lms.pdm.productionplan.controller;
+
+import java.util.Set;
+import java.util.Map;
+
+import org.nl.b_lms.pdm.productionplan.dao.PdmBiSlittingproductionplan;
+import org.nl.common.TableDataInfo;
+import org.springframework.web.bind.annotation.*;
+import lombok.RequiredArgsConstructor;
+
+import javax.annotation.Resource;
+
+import lombok.extern.slf4j.Slf4j;
+import org.nl.common.domain.query.PageQuery;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.nl.modules.logging.annotation.Log;
+import org.nl.b_lms.pdm.productionplan.service.IpdmBiSlittingproductionplanService;
+
+
+/**
+ * {@code @Description:} 分切生产计划(PdmBiSlittingproductionplan)控制层
+ * {@code @Author:} gbx
+ *
+ * @since 2024-01-27
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/pdmBiSlittingproductionplan")
+@Slf4j
+public class PdmBiSlittingproductionplanController {
+
+
+ @Resource
+ private IpdmBiSlittingproductionplanService pdmBiSlittingproductionplanService;
+
+
+ /**
+ * 分页查询
+ *
+ * @param whereJson 查询条件
+ * @param page 分页参数
+ */
+ @GetMapping
+ @Log("查询分切生产计划")
+ public ResponseEntity
+ *
+ * @author generator
+ * @since 2023-11-10
+ */
+@Service
+public class InBoxManageServiceImpl implements InBoxManageService {
+
+ /**
+ * 入库不需要查询的排集合
+ */
+ private List notInRowList = new ArrayList<>();
+
+ /**
+ * 入库不需要查询的巷道集合
+ */
+ private List notInBlockList = new ArrayList<>();
+
+ /**
+ * 木箱信息服务
+ */
+ @Autowired
+ private IBstIvtBoxinfoService iBstIvtBoxinfoService;
+
+ @Override
+ @Transactional
+ public void inBox(JSONObject whereJson) {
+ /*
+ * 1.查询mes木箱信息,插入木箱信息表
+ * 2.找木箱区的一个仓位
+ * 3.插入木箱对象载具表
+ */
+ // 点位表
+ WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
+ // 仓位表
+ WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
+ // 载具表
+ WQLObject vehicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo");
+ // 载具扩展属性表
+ WQLObject veExtTab = WQLObject.getWQLObject("md_pb_storagevehicleext");
+
+ /*
+ * 查询mes木箱信息,插入木箱信息表
+ */
+
+ // 调用mes接口
+ JSONObject mesBoxInfo = new JSONObject();
+
+ // 插入木箱信息表
+// BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.mesInsert(mesBoxInfo);
+ BstIvtBoxinfo boxDao = BstIvtBoxinfo.builder().build();
+
+ /*
+ * 找一个木箱区的一个仓位,生辰任务并下发
+ */
+ // 判断起点点位是否存在
+ JSONObject jsonPoint = pointTab.query("point_code = '" + whereJson.getString("device_code") + "' AND is_delete = '" +
+ IOSEnum.IS_NOTANDYES.code("否") + "' AND is_used = '" +
+ IOSEnum.IS_NOTANDYES.code("是") + "'")
+ .uniqueResult(0);
+
+ if (ObjectUtil.isEmpty(jsonPoint)) {
+ throw new BadRequestException("起始点位不存在或未启用!");
+ }
+
+ // 找一个木箱区空位
+ JSONObject jsonParam = new JSONObject();
+ jsonParam.put("stor_id", IOSEnum.STOR_ID.code("二期"));
+ jsonParam.put("sect_id", RegionTypeEnum.TWO_MX01.getId());
+ jsonParam.put("box_length", boxDao.getBox_length());
+ jsonParam.put("box_width", boxDao.getBox_width());
+ jsonParam.put("box_high", boxDao.getBox_high());
+
+ JSONObject jsonAttr = getStruct(jsonParam);
+
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+ notInRowList.clear();
+ notInBlockList.clear();
+ throw new BadRequestException("仓位不足!");
+ }
+
+ // 生成任务
+ JSONObject jsonTaskParam = new JSONObject();
+ jsonTaskParam.put("task_type", "010502");
+ jsonTaskParam.put("start_device_code", whereJson.getString("device_code"));
+ jsonTaskParam.put("next_device_code", jsonAttr.getString("struct_code"));
+ jsonTaskParam.put("vehicle_code", whereJson.getString("box_no"));
+
+ TwoInBoxTask taskBean = new TwoInBoxTask();
+ taskBean.createTask(jsonTaskParam);
+
+ taskBean.immediateNotifyAcs(null);
+
+ // 锁定终点
+ jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱入库锁"));
+ attrTab.update(jsonAttr);
+
+ // 清空缓存
+ notInRowList.clear();
+ notInBlockList.clear();
+
+ /*
+ * 插入木箱对应载具表
+ */
+ JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + whereJson.getString("vehicle_code") + "'")
+ .uniqueResult(0);
+
+ if (ObjectUtil.isEmpty(jsonVehicle)) {
+ throw new BadRequestException("载具不存在!");
+ }
+
+ JSONObject jsonVeExt = new JSONObject();
+ jsonVeExt.put("storagevehicleext_id", IdUtil.getLongId());
+ jsonVeExt.put("storagevehicle_id", jsonVehicle.getLongValue("storagevehicle_id"));
+ jsonVeExt.put("storagevehicle_code", jsonVehicle.getString("storagevehicle_code"));
+ jsonVeExt.put("storagevehicle_type", jsonVehicle.getString("storagevehicle_type"));
+ jsonVeExt.put("pcsn", whereJson.getString("box_no"));
+ jsonVeExt.put("device_uuid", IdUtil.getLongId());
+ veExtTab.insert(jsonVeExt);
+ }
+
+ /**
+ * 找一个空仓位(木箱区)
+ * @param jsonParam {
+ * stor_id:仓库标识
+ * sect_id:库区标识
+ * box_length:木箱长度
+ * box_width:木箱宽度
+ * box_high:木箱高度
+ * }
+ * @return JSONObject : 仓位对象
+ */
+ public JSONObject getStruct(JSONObject jsonParam) {
+ // 仓位表
+ WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
+
+ /*
+ * 判断是否有仓位
+ * 判断条件:库区、仓库、是否启用、是否删除、未锁定、没有载具
+ */
+ JSONArray structArray = attrTab.query("IFNULL(storagevehicle_code,'') = '' " +
+ "AND is_used = '" + IOSEnum.IS_NOTANDYES.code("是") + "' AND is_delete = '" + IOSEnum.IS_NOTANDYES.code("否") + "' " +
+ "AND lock_type = '" + IOSEnum.LOCK_TYPE.code("未锁定") + "' AND stor_id = '"+jsonParam.getString("stor_id")+"' " +
+ "AND sect_id = '"+jsonParam.getString("sect_id")+"'").getResultJSONArray(0);
+
+ if (ObjectUtil.isEmpty(structArray)) {
+ notInRowList.clear();
+ notInBlockList.clear();
+ throw new BadRequestException("仓位不足!");
+ }
+
+ // 确定巷道:查看每个巷道最小木箱数的巷道,获取最小木箱数的巷道
+ String block_num = getMinBlock(jsonParam);
+
+ // 确定排:查看每排的木箱数量,找到数量最小的那排
+ jsonParam.put("block_num",block_num);
+ String row_num = getMinRow(jsonParam);
+
+ // 确定仓位: 找到仓位
+ jsonParam.put("row_num",row_num);
+ JSONObject jsonAttr = queryStruct(jsonParam);
+
+ // 为空则新找巷道
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+
+ jsonParam.put("flag", "1");
+ notInBlockList.add(jsonParam.getString("block_num"));
+
+ String join = "('" + String.join("','", notInBlockList) + "')";
+ jsonParam.put("not_block", join);
+
+ List blockList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ for (int i = 0; i < blockList.size(); i++) {
+ JSONObject json = blockList.get(i);
+ json.put("stor_id", jsonParam.getString("stor_id"));
+ json.put("sect_id", jsonParam.getString("sect_id"));
+ json.put("box_length", jsonParam.getString("box_length"));
+ json.put("box_width", jsonParam.getString("box_width"));
+ json.put("box_high", jsonParam.getString("box_high"));
+
+ String row_num_2 = getMinRow(json);
+ json.put("row_num",row_num_2);
+ JSONObject jsonAttr_2 = queryStruct(json);
+
+ if (ObjectUtil.isNotEmpty(jsonAttr_2)) {
+ jsonAttr = jsonAttr_2;
+ break;
+ } else {
+ continue;
+ }
+ }
+ }
+ notInRowList.clear();
+ notInBlockList.clear();
+ return jsonAttr;
+ }
+
+ /**
+ * 确定巷道
+ * @param jsonParam {
+ * stor_id: 仓库标识
+ * sect_id: 库区标识
+ * box_length:木箱长度
+ * box_width:木箱宽度
+ * box_high:木箱高度
+ * }
+ * @return String 巷道
+ */
+ private String getMinBlock(JSONObject jsonParam) {
+ jsonParam.put("flag", "1");
+
+ // 获取仓库、库区有空位的巷道
+ List blockList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ /*
+ * 查询所属巷道所有木箱
+ */
+ String block_in = blockList.stream()
+ .map(row -> row.getString("block_num"))
+ .collect(Collectors.joining("','"));
+
+ jsonParam.put("flag", "2");
+ jsonParam.put("block_in", "('"+block_in+"')");
+
+ List boxAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 为空说明没有木箱,返回最小巷道
+ if (ObjectUtil.isEmpty(boxAllList)) {
+ return blockList.get(0).getString("block_num");
+ }
+
+ // 计算每个巷道的木箱数
+ ArrayList blockBoxList = new ArrayList<>();
+
+ for (int i = 0; i < blockList.size(); i++) {
+ JSONObject jsonBlock = blockList.get(i);
+
+ List box_num = boxAllList.stream()
+ .filter(row -> row.getString("block_num").equals(jsonBlock.getString("block_num")))
+ .collect(Collectors.toList());
+
+ jsonBlock.put("box_num", String.valueOf(box_num.size()));
+ blockBoxList.add(jsonBlock);
+ }
+
+ // 最小木箱数的巷道
+ List boxNumList = blockBoxList.stream()
+ .sorted(Comparator.comparing(row -> row.getString("box_num")))
+ .collect(Collectors.toList());
+
+ return boxNumList.get(0).getString("block_num");
+ }
+
+ /**
+ * 确定排
+ * @param jsonParam {
+ * stor_id: 仓库标识
+ * sect_id: 库区标识
+ * block_num: 巷道
+ * box_length:木箱长度
+ * box_width:木箱宽度
+ * box_high:木箱高度
+ * }
+ * @return String 排
+ */
+ private String getMinRow(JSONObject jsonParam) {
+
+ jsonParam.put("flag", "3");
+
+ // 获取此仓库、库区、巷道 有空位的排
+ List rowList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ /*
+ * 查询所属排的所有木箱
+ */
+ String row_in = rowList.stream()
+ .map(row -> row.getString("row_num"))
+ .collect(Collectors.joining("','"));
+
+ jsonParam.put("flag", "2");
+ jsonParam.put("row_in", "('"+row_in+"')");
+
+ List boxAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 为空说明没有木箱,返回最小排
+ if (ObjectUtil.isEmpty(boxAllList)) {
+ if (ObjectUtil.isNotEmpty(rowList)) {
+ return rowList.get(0).getString("row_num");
+ }
+ }
+
+ // 计算最小排的托盘
+ ArrayList rowkBoxList = new ArrayList<>();
+
+ for (int i = 0; i < rowList.size(); i++) {
+ JSONObject jsonRow = rowList.get(i);
+
+ List box_num = boxAllList.stream()
+ .filter(row -> row.getString("row_num").equals(jsonRow.getString("row_num")))
+ .collect(Collectors.toList());
+
+ jsonRow.put("box_num", String.valueOf(box_num.size()));
+ rowkBoxList.add(jsonRow);
+ }
+
+ // 最小木箱数的排
+ List boxNumList = rowkBoxList.stream()
+ .sorted(Comparator.comparing(row -> row.getString("box_num")))
+ .collect(Collectors.toList());
+
+ String row_num = "";
+
+ if (ObjectUtil.isNotEmpty(boxNumList)) {
+ row_num = boxNumList.get(0).getString("row_num");
+ }
+ return row_num;
+ }
+
+ /**
+ * 确定仓位
+ * @param jsonParam {
+ * stor_id: 仓库标识
+ * sect_id: 库区标识
+ * block_num: 巷道
+ * row_num: 排
+ * box_length:木箱长度
+ * box_width:木箱宽度
+ * box_high:木箱高度
+ * }
+ * @return JSONObject 仓位对象
+ */
+ private JSONObject queryStruct(JSONObject jsonParam) {
+ JSONObject jsonAttr = getStructOne(jsonParam);
+
+ // 为空找此巷道新的一排
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+ notInRowList.add(jsonParam.getString("row_num"));
+
+ if (ObjectUtil.isEmpty(jsonParam.getString("row_num"))) {
+ return null;
+ }
+
+ String join = "('" + String.join("','", notInRowList) + "')";
+ jsonParam.put("not_row_in", join);
+
+ // 新的一排
+ String row_num_new = this.getMinRow(jsonParam);
+ jsonParam.put("row_num",row_num_new);
+
+ jsonAttr = this.getStructOne(jsonParam);
+ }
+ return jsonAttr;
+ }
+
+ /**
+ * 获取一个货位公共方法
+ * @param jsonParam {
+ * stor_id: 仓库标识
+ * sect_id: 库区标识
+ * block_num: 巷道
+ * row_num: 排
+ * box_length:木箱长度
+ * box_width:木箱宽度
+ * box_high:木箱高度
+ * }
+ * @return JSONObject 仓位对象
+ */
+ private JSONObject getStructOne(JSONObject jsonParam) {
+ // 获取此仓库、库区、巷道、排的所有空位 根据列、层、深度排序
+ jsonParam.put("flag", "4");
+
+ List rowStructList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 获取此仓库、库区、巷道、排的所有仓位
+ jsonParam.put("flag", "5");
+
+ List structAllList = WQL.getWO("BST_INBOX").addParamMap(jsonParam)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 需要返回的仓位
+ JSONObject jsonAttr = new JSONObject();
+
+ for (int i = 0; i < rowStructList.size(); i++) {
+ JSONObject json = rowStructList.get(i);
+
+ // 判断伸位
+ if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) {
+ // 无需深度
+ jsonAttr = json;
+ break;
+
+ } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) {
+ /*
+ * 深货位:判断浅货位是否被锁定
+ */
+
+ // 获取此货位对应的浅货位
+ List lowAttr = structAllList.stream()
+ .filter(row -> row.getString("col_num").equals(json.getString("col_num")) &&
+ row.getString("layer_num").equals(json.getString("layer_num")) &&
+ row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")))
+ .collect(Collectors.toList());
+
+ if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) {
+ notInRowList.clear();
+ notInBlockList.clear();
+ throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的浅货位错误!");
+ }
+
+ // 判断是否被锁定
+ JSONObject jsonAttrLow = lowAttr.get(0);
+
+ if (ObjectUtil.isEmpty(jsonAttrLow.getString("storagevehicle_code")) && jsonAttrLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
+ // 没有载具和被锁定
+ jsonAttr = json;
+ break;
+ } else {
+ continue;
+ }
+
+ } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) {
+ /*
+ * 浅货位:判断深货位是否空洞,是否是相同类型的托盘
+ */
+ // 获取此货位对应的深货位
+ List darkAttr = structAllList.stream()
+ .filter(row -> row.getString("col_num").equals(json.getString("col_num")) &&
+ row.getString("layer_num").equals(json.getString("layer_num")) &&
+ row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深")))
+ .collect(Collectors.toList());
+
+ if (ObjectUtil.isEmpty(darkAttr) || darkAttr.size() != 1) {
+ notInRowList.clear();
+ notInBlockList.clear();
+ throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的深货位错误!");
+ }
+
+ // 判断是否有托盘
+ JSONObject jsonAttrDark = darkAttr.get(0);
+
+ if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code"))) {
+
+ if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
+ jsonAttr = json;
+ break;
+ } else {
+ continue;
+ }
+ } else {
+ if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
+ jsonAttr = jsonAttrDark;
+ break;
+ } else {
+ continue;
+ }
+ }
+
+ }
+ }
+ return jsonAttr;
+ }
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java
index 908cfe1ed..68080df4a 100644
--- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBussManageServiceImpl.java
@@ -1,14 +1,24 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl;
+import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -27,6 +37,15 @@ import java.util.stream.Collectors;
@Service
public class InBussManageServiceImpl implements InBussManageService {
+ @Autowired
+ private IStIvtIostorinvService iStIvtIostorinvService;
+
+ @Autowired
+ private IStIvtIostorinvdtlService iStIvtIostorinvdtlService;
+
+ @Autowired
+ private IStIvtIostorinvdisService iStIvtIostorinvdisService;
+
/**
* 不需要查询的排集合
*/
@@ -144,6 +163,7 @@ public class InBussManageServiceImpl implements InBussManageService {
if (ObjectUtil.isNotEmpty(jsonAttr_2)) {
jsonAttr = jsonAttr_2;
+ break;
} else {
continue;
}
@@ -156,6 +176,97 @@ public class InBussManageServiceImpl implements InBussManageService {
return jsonAttr;
}
+ @Override
+ @Transactional
+ public void inTask(JSONObject jsonObject) {
+ // 子卷包装关系表
+ WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
+
+ // 处理子卷号
+ String material_barcode = jsonObject.getString("material_barcode");
+
+ if (ObjectUtil.isEmpty(material_barcode)) {
+ throw new BadRequestException("子卷号不能为空!");
+ }
+
+ if (ObjectUtil.isEmpty(jsonObject.getString("device_code"))) {
+ throw new BadRequestException("设备号不能为空!");
+ }
+
+ List pcsnList = Arrays.asList(material_barcode.split(","));
+
+ // 查询子卷包装关系
+ List subList = subTab.query("container_name in ('"+String.join("','", pcsnList)+"') and status = '0'")
+ .getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ if (ObjectUtil.isEmpty(subList)) {
+ throw new BadRequestException("未查询到子卷包装信息!");
+ }
+
+ // 主表
+ JSONObject mst = new JSONObject();
+ mst.put("stor_id", IOSEnum.STOR_ID.code("二期"));
+ mst.put("bill_status", IOSEnum.BILL_STATUS.code("生成"));
+ mst.put("total_qty", subList.stream().map(row -> row.getDoubleValue("net_weight")).reduce(Double::sum).orElse(0.00));
+ mst.put("detail_count", subList.size());
+ mst.put("bill_type", IOSEnum.IN_TYPE.code("生产入库"));
+ mst.put("biz_date", DateUtil.today());
+ mst.put("remark", "");
+
+ // 明细
+ ArrayList tableData = new ArrayList<>();
+ for (int i = 0; i < subList.size(); i++) {
+ JSONObject json = subList.get(i);
+
+ LinkedHashMap jsonDtl = new LinkedHashMap<>();
+
+ jsonDtl.put("package_box_sn", json.getString("package_box_sn"));
+ jsonDtl.put("thickness", json.getString("thickness"));
+ jsonDtl.put("plan_qty", json.getString("net_weight"));
+ jsonDtl.put("customer_description", json.getString("customer_description"));
+ jsonDtl.put("quanlity_in_box", json.getString("quanlity_in_box"));
+ jsonDtl.put("product_name", json.getString("product_name"));
+ jsonDtl.put("net_weight", json.getString("net_weight"));
+ jsonDtl.put("container_name", json.getString("container_name"));
+ jsonDtl.put("width", json.getString("width"));
+ jsonDtl.put("sap_pcsn", json.getString("sap_pcsn"));
+ jsonDtl.put("customer_name", json.getString("customer_name"));
+ jsonDtl.put("sale_order_name", json.getString("sale_order_name"));
+ jsonDtl.put("product_description", json.getString("product_description"));
+ jsonDtl.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品"));
+ jsonDtl.put("is_active", IOSEnum.IS_SEND.code("是"));
+ tableData.add(jsonDtl);
+ }
+ mst.put("tableData",tableData);
+
+ // 调用服务创建
+ String iostorinv_id = iStIvtIostorinvService.insertMst(mst);
+
+ // 调用分配货位并下发
+ JSONObject jsonDiv = new JSONObject();
+
+ StIvtIostorinvdtl dtlDao = iStIvtIostorinvdtlService.list(
+ new QueryWrapper().lambda()
+ .eq(StIvtIostorinvdtl::getIostorinv_id, iostorinv_id)
+ ).get(0);
+
+ List disList = iStIvtIostorinvdisService.list(
+ new QueryWrapper().lambda()
+ .eq(StIvtIostorinvdis::getIostorinv_id, iostorinv_id)
+ ).stream().map(row -> JSONObject.parseObject(JSON.toJSONString(row), LinkedHashMap.class))
+ .collect(Collectors.toList());
+
+ jsonDiv.put("dtl_row",JSONObject.parseObject(JSON.toJSONString(dtlDao)));
+ jsonDiv.put("tableMater", disList);
+ jsonDiv.put("checked", true);
+ jsonDiv.put("is_send", IOSEnum.IS_SEND.code("是"));
+ jsonDiv.put("point_code", jsonObject.getString("device_code"));
+ jsonDiv.put("sect_id", IOSEnum.SECT_ID.code("二期主存区"));
+ jsonDiv.put("stor_id", IOSEnum.STOR_ID.code("二期"));
+
+ iStIvtIostorinvService.divStruct(jsonDiv);
+ }
+
/**
* 获取最小巷道
* @param jsonSub {
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java
index 8051f477b..590dc2071 100644
--- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InVehicleManageServiceImpl.java
@@ -157,6 +157,7 @@ public class InVehicleManageServiceImpl implements InVehicleManageService {
if (ObjectUtil.isNotEmpty(jsonAttr_2)) {
jsonAttr = jsonAttr_2;
+ break;
} else {
continue;
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java
new file mode 100644
index 000000000..c0282c632
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/LashManageServiceImpl.java
@@ -0,0 +1,194 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.nl.b_lms.sch.point.dao.SchBasePoint;
+import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper;
+import org.nl.b_lms.sch.point.service.IschBasePointService;
+import org.nl.b_lms.sch.tasks.TwoLashTask;
+import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService;
+import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxlashboundService;
+import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo;
+import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxlashbound;
+import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService;
+import org.nl.common.utils.IdUtil;
+import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.core.bean.WQLObject;
+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.stream.Collectors;
+
+/**
+ *
+ * 捆扎业务处理 服务实现类
+ *
+ *
+ * @author generator
+ * @since 2023-11-10
+ */
+@Service
+@RequiredArgsConstructor
+public class LashManageServiceImpl implements LashManageService {
+
+ /**
+ * 木箱信息服务
+ */
+ @Autowired
+ private IBstIvtBoxinfoService iBstIvtBoxinfoService;
+
+ /**
+ * 点位服务
+ */
+ @Autowired
+ private IschBasePointService ischBasePointService;
+
+ /**
+ * 点位mapper服务
+ */
+ @Autowired
+ private SchBasePointMapper schBasePointMapper;
+
+ /**
+ * 木箱捆扎绑定服务
+ */
+ @Autowired
+ private IBstIvtBoxlashboundService iBstIvtBoxlashboundService;
+
+ @Override
+ @Transactional
+ public void createLashTask(JSONObject whereJson) {
+ /*
+ * 1.判断此木箱是否需要堆叠
+ * 2.插入木箱捆扎绑定表
+ * 3.生成任务
+ */
+ // 查询木箱信息
+ BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne(
+ new QueryWrapper().lambda()
+ .eq(BstIvtBoxinfo::getBox_no, whereJson.getString("box_no"))
+ );
+
+ if (ObjectUtil.isEmpty(boxDao)) {
+ throw new BadRequestException("没有此木箱信息:"+whereJson.getString("box_no"));
+ }
+
+ JSONObject jsonSub = WQLObject.getWQLObject("pdm_bi_subpackagerelation")
+ .query("package_box_sn = '" + boxDao.getBox_no() + "'")
+ .uniqueResult(0);
+
+ /*
+ * 查看点位是否为空:
+ * 为空记当前载具号,载具数量为1,
+ * 不为空,加载具数量,当点位载具数量与木箱信息捆扎数量相同时下发捆绑
+ */
+ // 查询捆扎的两个点位及木箱信息
+ List pointDaoList = schBasePointMapper.queryKZPoint();
+
+ if (ObjectUtil.isEmpty(pointDaoList)) {
+ throw new BadRequestException("点位不存在,或未启用!");
+ }
+
+ // 是否要移动至捆扎位
+ String is_move = IOSEnum.IS_NOTANDYES.code("否");
+ // 桁架任务终点
+ String end_point;
+
+ // 判断是否有相同订单号、木箱规格的木箱
+ List likeBoxList = pointDaoList.stream()
+ .filter(row -> ObjectUtil.isNotEmpty(row.getString("box_length")) &&
+ ObjectUtil.isNotEmpty(row.getString("box_width")) &&
+ ObjectUtil.isNotEmpty(row.getString("box_high")) &&
+ ObjectUtil.isNotEmpty(row.getString("sale_order_name"))
+
+ )
+ .filter(row -> row.getString("box_length").equals(boxDao.getBox_length()) &&
+ row.getString("box_width").equals(boxDao.getBox_width()) &&
+ row.getString("box_high").equals(boxDao.getBox_high()) &&
+ row.getString("sale_order_name").equals(jsonSub.getString("sale_order_name"))
+ )
+ .collect(Collectors.toList());
+
+ if (ObjectUtil.isNotEmpty(likeBoxList)) {
+ // 加载具数量
+ JSONObject jsonPoint = likeBoxList.get(0);
+
+ jsonPoint.put("vehicle_qty", NumberUtil.add(jsonPoint.getBigDecimal("vehicle_qty"),1));
+
+ if (jsonPoint.getIntValue("vehicle_qty") == Integer.parseInt(boxDao.getLash_num())) {
+ // 相同清空载具以及数量
+ jsonPoint.put("vehicle_qty",0);
+ jsonPoint.put("vehicle_code","");
+ is_move = IOSEnum.IS_NOTANDYES.code("是");
+ }
+
+ end_point = jsonPoint.getString("point_code");
+ ischBasePointService.updateById(JSON.parseObject(jsonPoint.toString(), SchBasePoint.class));
+
+ // 查询此点位绑定木箱表
+ BstIvtBoxlashbound boundDao = iBstIvtBoxlashboundService.getOne(
+ new QueryWrapper().lambda()
+ .eq(BstIvtBoxlashbound::getBox_no, jsonPoint.getString("box_no"))
+ );
+ /*
+ * 插入绑定木箱表
+ */
+ BstIvtBoxlashbound insertBound = BstIvtBoxlashbound.builder()
+ .lash_id(IdUtil.getLongId())
+ .bound_id(boundDao.getBound_id())
+ .box_no(boxDao.getBox_no())
+ .build();
+ iBstIvtBoxlashboundService.save(insertBound);
+
+ } else {
+ // 判断是否有载具
+ List empPointList = pointDaoList.stream()
+ .filter(row -> ObjectUtil.isEmpty(row.getString("vehicle_code")))
+ .collect(Collectors.toList());
+
+ if (ObjectUtil.isNotEmpty(empPointList)) {
+ // 有空位
+ JSONObject jsonPoint = empPointList.get(0);
+
+ // 加载具数量、更新载具号
+ jsonPoint.put("vehicle_qty", NumberUtil.add(jsonPoint.getBigDecimal("vehicle_qty"),1));
+ jsonPoint.put("vehicle_code",boxDao.getBox_no());
+
+ end_point = jsonPoint.getString("point_code");
+ ischBasePointService.updateById(JSON.parseObject(jsonPoint.toString(), SchBasePoint.class));
+ /*
+ * 插入绑定木箱表
+ */
+ BstIvtBoxlashbound insertBound = BstIvtBoxlashbound.builder()
+ .lash_id(IdUtil.getLongId())
+ .bound_id(IdUtil.getLongId())
+ .box_no(boxDao.getBox_no())
+ .build();
+ iBstIvtBoxlashboundService.save(insertBound);
+ } else {
+ // 没有空位
+ throw new BadRequestException("没有空位!");
+ }
+ }
+ /*
+ * 生成任务并下发
+ */
+ JSONObject jsonTaskParam = new JSONObject();
+ jsonTaskParam.put("task_type", "010504");
+ jsonTaskParam.put("start_device_code", whereJson.getString("device_code"));
+ jsonTaskParam.put("next_device_code", end_point);
+ jsonTaskParam.put("vehicle_code", whereJson.getString("box_no"));
+ jsonTaskParam.put("is_auto_issue", is_move);
+
+ TwoLashTask taskBean = new TwoLashTask();
+ taskBean.createTask(jsonTaskParam);
+ taskBean.immediateNotifyAcs(null);
+ }
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java
new file mode 100644
index 000000000..f826dbaf7
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBoxManageServiceImpl.java
@@ -0,0 +1,449 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.nl.b_lms.sch.tasks.TwoMoveBoxTask;
+import org.nl.b_lms.sch.tasks.TwoOutBoxTask;
+import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService;
+import org.nl.common.utils.IdUtil;
+import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.WQL;
+import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.pda.mps.eum.RegionTypeEnum;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 空载具业务处理 服务实现类
+ *
+ *
+ * @author generator
+ * @since 2023-11-10
+ */
+@Service
+public class OutBoxManageServiceImpl implements OutBoxManageService {
+
+ /**
+ * 出库不需要查询的排集合
+ */
+ private List notOutRowList = new ArrayList<>();
+
+ /**
+ * 出库不需要查询的巷道集合
+ */
+ private List notOutBlockList = new ArrayList<>();
+
+ @Override
+ @Transactional
+ public void outBox(JSONObject whereJson) {
+ /*
+ * 1.找到符合条件的空木箱
+ */
+ // 点位表
+ WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
+ // 仓位表
+ WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
+
+ whereJson.put("stor_id", IOSEnum.STOR_ID.code("二期"));
+ whereJson.put("sect_id", RegionTypeEnum.TWO_MX01.getId());
+
+ // 判断起点点位是否存在
+ JSONObject jsonPoint = pointTab.query("point_code = '" + whereJson.getString("device_code") + "' AND is_delete = '" +
+ IOSEnum.IS_NOTANDYES.code("否") + "' AND is_used = '" +
+ IOSEnum.IS_NOTANDYES.code("是") + "'")
+ .uniqueResult(0);
+
+ if (ObjectUtil.isEmpty(jsonPoint)) {
+ throw new BadRequestException("终点点位不存在或未启用!");
+ }
+
+ JSONObject jsonAttr = getStruct(whereJson);
+
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+ notOutRowList.clear();
+ notOutBlockList.clear();
+ throw new BadRequestException("没有符合规格的木箱!");
+ }
+
+ // 生成任务
+ JSONObject jsonTaskParam = new JSONObject();
+ jsonTaskParam.put("task_type", "010504");
+ jsonTaskParam.put("start_device_code", jsonAttr.getString("struct_code"));
+ jsonTaskParam.put("next_device_code", whereJson.getString("device_code"));
+ jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_code"));
+ jsonTaskParam.put("task_group_id", jsonAttr.getString("task_group_id"));
+
+ TwoOutBoxTask taskBean = new TwoOutBoxTask();
+ taskBean.createTask(jsonTaskParam);
+ taskBean.immediateNotifyAcs(null);
+
+ // 锁定起点
+ jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("木箱出库锁"));
+ attrTab.update(jsonAttr);
+
+ // 清空缓存
+ notOutRowList.clear();
+ notOutBlockList.clear();
+ }
+
+ /**
+ * 找一个空木箱
+ * @param whereJson {
+ * device_code:终点
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * }
+ * @return JSONObject: 仓位对象
+ */
+ private JSONObject getStruct(JSONObject whereJson) {
+ /*
+ * 判断是否有相同规格的木箱
+ * 判断条件:库区、仓库、是否启用、是否删除、未锁定、有载具、相同规格的木箱
+ */
+ whereJson.put("flag", "6");
+ JSONArray structArray = WQL.getWO("BST_OUTBOX").addParamMap(whereJson).process().getResultJSONArray(0);
+
+ if (ObjectUtil.isEmpty(structArray)) {
+ notOutRowList.clear();
+ notOutBlockList.clear();
+ throw new BadRequestException("没有相同规格的木箱!");
+ }
+
+ // 确定巷道:找相同规格木箱的最多的巷道
+ String block_num = getMaxBlock(whereJson);
+
+ // 确定排:找某一巷道规格木箱的最多排
+ whereJson.put("block_num", block_num);
+ String row_num = getMaxRow(whereJson);
+
+ // 确定仓位
+ whereJson.put("row_num", row_num);
+ JSONObject jsonAttr = getBox(whereJson);
+
+ // 为空则新找巷道
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+
+ whereJson.put("flag", "1");
+ notOutBlockList.add(whereJson.getString("block_num"));
+
+ String join = "('" + String.join("','", notOutBlockList) + "')";
+ whereJson.put("not_block_id", join);
+
+ List blockList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ for (int i = 0; i < blockList.size(); i++) {
+ JSONObject json = blockList.get(i);
+ json.put("stor_id", whereJson.getString("stor_id"));
+ json.put("sect_id", whereJson.getString("sect_id"));
+ json.put("box_length", whereJson.getString("box_length"));
+ json.put("box_width", whereJson.getString("box_width"));
+ json.put("box_high", whereJson.getString("box_high"));
+ json.put("num", whereJson.getString("num"));
+
+ String row_num_2 = getMaxRow(json);
+ json.put("row_num",row_num_2);
+ JSONObject jsonAttr_2 = getBox(json);
+
+ if (ObjectUtil.isNotEmpty(jsonAttr_2)) {
+ jsonAttr = jsonAttr_2;
+ break;
+ } else {
+ continue;
+ }
+ }
+ }
+ return jsonAttr;
+ }
+
+ /**
+ * 找相同规格木箱的最多的巷道
+ * @param whereJson {
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * }
+ * @return block_num: 巷道
+ */
+ private String getMaxBlock(JSONObject whereJson) {
+ whereJson.put("flag", "1");
+
+ // 查询所有相同规格木箱的巷道集合
+ List allBlockList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ if (ObjectUtil.isEmpty(allBlockList)) {
+ notOutRowList.clear();
+ notOutBlockList.clear();
+ throw new BadRequestException("没有相同规格的木箱!");
+ }
+
+ // 查询所有相同规格木箱巷道的仓位
+ String block_num_in = allBlockList.stream()
+ .map(row -> row.getString("block_num"))
+ .collect(Collectors.joining("','"));
+
+ whereJson.put("flag", "2");
+ whereJson.put("block_num_in", "('"+block_num_in+"')");
+
+ List likeAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 计算每个巷道的数量
+ ArrayList blockBoxList = new ArrayList<>();
+
+ for (int i = 0; i < allBlockList.size(); i++) {
+ JSONObject jsonBlock = allBlockList.get(i);
+
+ List blockAttrNum = likeAttrList.stream()
+ .filter(row -> row.getString("block_num").equals(jsonBlock.getString("block_num")))
+ .collect(Collectors.toList());
+
+ jsonBlock.put("box_num", String.valueOf(blockAttrNum.size()));
+ blockBoxList.add(jsonBlock);
+ }
+
+ // 最大木箱数的巷道
+ List boxNumList = blockBoxList.stream()
+ .sorted(Comparator.comparing(row -> row.getString("box_num")))
+ .collect(Collectors.toList());
+
+ String block_num = "";
+ if (ObjectUtil.isNotEmpty(boxNumList)) {
+ block_num = boxNumList.get(boxNumList.size() - 1).getString("block_num");
+ }
+
+ return block_num ;
+ }
+
+ /**
+ * 找到某一巷道相同规格木箱的最多的排
+ * @param whereJson {
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * block_num: 巷道
+ * }
+ * @return String: 排
+ */
+ private String getMaxRow(JSONObject whereJson) {
+ whereJson.put("flag", "3");
+
+ // 查询所有某一巷道相同规格木箱的排集合
+ List allRowList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ if (ObjectUtil.isEmpty(allRowList)) {
+ throw new BadRequestException("请当前排列任务执行完后在试!");
+ }
+
+ // 查询某一巷道所有相同规格木箱排的仓位
+ String row_num_in = allRowList.stream()
+ .map(row -> row.getString("row_num"))
+ .collect(Collectors.joining("','"));
+
+ whereJson.put("flag", "2");
+ whereJson.put("row_num_in", "('"+row_num_in+"')");
+
+ List likeAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 计算每个排的数量
+ ArrayList blockBoxList = new ArrayList<>();
+
+ for (int i = 0; i < allRowList.size(); i++) {
+ JSONObject jsonRow = allRowList.get(i);
+
+ List blockAttrNum = likeAttrList.stream()
+ .filter(row -> row.getString("row_num").equals(jsonRow.getString("row_num")))
+ .collect(Collectors.toList());
+
+ jsonRow.put("box_num", String.valueOf(blockAttrNum.size()));
+ blockBoxList.add(jsonRow);
+ }
+
+ // 最大木箱数的排
+ List boxNumList = blockBoxList.stream()
+ .sorted(Comparator.comparing(row -> row.getString("box_num")))
+ .collect(Collectors.toList());
+
+ String row_num = "";
+ if (ObjectUtil.isNotEmpty(boxNumList)) {
+ row_num = boxNumList.get(boxNumList.size() - 1).getString("row_num");
+ }
+
+ return row_num;
+ }
+
+ /**
+ * 找一个空木箱
+ * @param whereJson {
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * block_num: 巷道
+ * row_num: 排
+ * }
+ * @return JSONObject: 需要出库的空木箱
+ */
+ private JSONObject getBox(JSONObject whereJson) {
+ // 确定仓位:找一个未锁定的空木箱
+ JSONObject jsonAttr = getBoxOne(whereJson);
+
+ // 为空找此巷道新的一排
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+ notOutRowList.add(whereJson.getString("row_num"));
+
+ String join = "('" + String.join("','", notOutRowList) + "')";
+ whereJson.put("not_row_in", join);
+
+ // 新的一排
+ String row_num_new = this.getMaxRow(whereJson);
+ whereJson.put("row_num",row_num_new);
+
+ jsonAttr = this.getBoxOne(whereJson);
+ }
+
+ return jsonAttr;
+ }
+
+ /**
+ * 确定巷道、确定排,找一个空木箱
+ * @param whereJson {
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * block_num: 巷道
+ * row_num: 排
+ * }
+ * @return JSONObject: 空木箱
+ */
+ private JSONObject getBoxOne(JSONObject whereJson) {
+ // 查相同规格木箱某一巷道某一排的所有木箱
+ whereJson.put("flag", "4");
+
+ List allAttrList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ // 获取此仓库、库区、巷道、排的所有仓位
+ whereJson.put("flag", "5");
+
+ List structAllList = WQL.getWO("BST_OUTBOX").addParamMap(whereJson)
+ .process().getResultJSONArray(0).toJavaList(JSONObject.class);
+
+ JSONObject jsonAttr = new JSONObject();
+
+ for (int i = 0; i < allAttrList.size(); i++){
+ JSONObject json = allAttrList.get(i);
+
+ if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("无"))) {
+ jsonAttr = json;
+ break;
+ } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("深"))) {
+ /*
+ * 深货位: 判断浅货位是否被锁定
+ */
+ // 获取此货位对应的浅货位
+ List lowAttr = structAllList.stream()
+ .filter(row -> row.getString("col_num").equals(json.getString("col_num")) &&
+ row.getString("layer_num").equals(json.getString("layer_num")) &&
+ row.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅")))
+ .collect(Collectors.toList());
+
+ if (ObjectUtil.isEmpty(lowAttr) || lowAttr.size() != 1) {
+ notOutRowList.clear();
+ notOutBlockList.clear();
+ throw new BadRequestException("仓位:" + json.getString("struct_code") + "对应的浅货位错误!");
+ }
+
+ // 判断浅货位是否有木箱
+ if (ObjectUtil.isEmpty(lowAttr.get(0).getString("storagevehicle_code"))) {
+ // 判断是否被锁定
+ if (lowAttr.get(0).getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
+ jsonAttr = json;
+ break;
+ } else {
+ continue;
+ }
+ } else {
+ // 判断是否被锁定
+ if (lowAttr.get(0).getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
+ // 创建木箱移库单
+ String task_group_id = createBoxMove(lowAttr.get(0));
+
+ json.put("task_group_id",task_group_id);
+ jsonAttr = json;
+ break;
+ } else {
+ jsonAttr = json;
+ break;
+ }
+ }
+ } else if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("浅"))) {
+ /*
+ * 浅货位: 直接出
+ */
+ jsonAttr = json;
+ break;
+ }
+ }
+ return jsonAttr;
+ }
+
+ /**
+ * 创建木箱移库任务
+ * @param jsonObject : 需要移库的仓位对象
+ * @return String: 任务组标识
+ */
+ private String createBoxMove(JSONObject jsonObject) {
+ WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
+
+ // 找一个空的仓位
+ JSONObject paramIn = new JSONObject();
+ paramIn.put("stor_id", IOSEnum.STOR_ID.code("二期"));
+ paramIn.put("sect_id", RegionTypeEnum.TWO_MX01.getId());
+
+ JSONObject jsonAttr = new InBoxManageServiceImpl().getStruct(paramIn);
+
+ if (ObjectUtil.isEmpty(jsonAttr)) {
+ throw new BadRequestException("木箱移库任务生成失败,没有空位!");
+ }
+
+ // 锁定起点
+ jsonObject.put("lock_type", IOSEnum.LOCK_TYPE.code("移出锁"));
+ attrTab.update(jsonObject);
+
+ // 锁定终点
+ jsonAttr.put("lock_type",IOSEnum.LOCK_TYPE.code("移入锁"));
+ attrTab.update(jsonAttr);
+
+ // 生成任务
+ JSONObject jsonTaskParam = new JSONObject();
+ jsonTaskParam.put("task_type", "010505");
+ jsonTaskParam.put("start_device_code", jsonObject.getString("struct_code"));
+ jsonTaskParam.put("next_device_code", jsonAttr.getString("struct_code"));
+ jsonTaskParam.put("vehicle_code", jsonObject.getString("storagevehicle_code"));
+ jsonTaskParam.put("task_group_id", IdUtil.getLongId());
+
+ TwoMoveBoxTask taskBan = new TwoMoveBoxTask();
+ taskBan.createTask(jsonTaskParam);
+ taskBan.immediateNotifyAcs(null);
+
+ return jsonTaskParam.getString("task_group_id");
+ }
+
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java
index 56ede66d0..5636d93c2 100644
--- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutBussManageServiceImpl.java
@@ -5,7 +5,6 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
-import org.nl.b_lms.sch.tasks.TwoOutTask;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService;
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java
index 6c545fe6d..342591ecc 100644
--- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/OutVehicleManageServiceImpl.java
@@ -81,14 +81,14 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService {
jsonTaskParam.put("task_type", "010504");
jsonTaskParam.put("start_device_code", jsonAttr.getString("struct_code"));
jsonTaskParam.put("next_device_code", whereJson.getString("device_code"));
- jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_type"));
+ jsonTaskParam.put("vehicle_code", jsonAttr.getString("storagevehicle_code"));
jsonTaskParam.put("vehicle_type", whereJson.getString("vehicle_type"));
TwoOutEmpTask taskBean = new TwoOutEmpTask();
taskBean.createTask(jsonTaskParam);
taskBean.immediateNotifyAcs(null);
- // 锁定终点
+ // 锁定起点
jsonAttr.put("lock_type", IOSEnum.LOCK_TYPE.code("空托盘出库锁"));
attrTab.update(jsonAttr);
@@ -160,6 +160,7 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService {
if (ObjectUtil.isNotEmpty(jsonAttr_2)) {
jsonAttr = jsonAttr_2;
+ break;
} else {
continue;
}
@@ -278,6 +279,10 @@ public class OutVehicleManageServiceImpl implements OutVehicleManageService {
List allRowList = WQL.getWO("BST_OUTVEHICLE").addParamMap(whereJson)
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
+ if (ObjectUtil.isEmpty(allRowList)) {
+ throw new BadRequestException("请当前排列任务执行完后在试!");
+ }
+
// 查询某一巷道所有相同托盘类型排的仓位
String row_num_in = allRowList.stream()
.map(row -> row.getString("row_num"))
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java
new file mode 100644
index 000000000..0b0a65afe
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java
@@ -0,0 +1,221 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import lombok.RequiredArgsConstructor;
+import org.nl.b_lms.sch.point.dao.SchBasePoint;
+import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper;
+import org.nl.b_lms.sch.point.service.IschBasePointService;
+import org.nl.b_lms.sch.tasks.TwoSendOutTask;
+import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.SendOutManageService;
+import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.pda.mps.eum.RegionTypeEnum;
+import org.nl.wms.sch.tasks.CutConveyorTask;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 发货业务处理 服务实现类
+ *
+ *
+ * @author generator
+ * @since 2023-11-10
+ */
+@Service
+@RequiredArgsConstructor
+public class SendOutManageServiceImpl implements SendOutManageService {
+
+ /**
+ * 点位服务
+ */
+ private final IschBasePointService ischBasePointService;
+
+ /**
+ * 点位mapper服务
+ */
+ private final SchBasePointMapper schBasePointMapper;
+
+ @Override
+ @Transactional
+ public void createSendOutTask(JSONObject whereJson) {
+ // 子卷包装关系表
+ WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
+ // 载具扩展属性表
+ WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext");
+ /*
+ * 1.找相同订单号的木箱
+ * 1)有相同订单号有空位的:相同订单号的放在一排
+ * 2)没有相同订单号的:新开一排
+ * 3)有相同订单号的但是没有空位:新开一排
+ * 2.删除载具对应木箱记录
+ */
+ CutConveyorTask cutConveyorTask = new CutConveyorTask();
+
+ // 所有发货区点位
+ List pointDaoList = ischBasePointService.list(
+ new QueryWrapper().lambda()
+ .eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId())
+ .eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code("是"))
+ .eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code("否"))
+ );
+
+ // 根据载具号找到对应的木箱号
+ JSONObject jsonExt = extTab.query("storagevehicle_code = '" + whereJson.getString("vehicle_code") + "'").uniqueResult(0);
+ if (ObjectUtil.isEmpty(jsonExt)) {
+ throw new BadRequestException("此载具上没有木箱,请检查!"+whereJson.getString("vehicle_code"));
+ }
+
+ // 1.查询此木箱号的子卷包装关系
+ JSONObject jsonSub = subTab.query("package_box_sn = '" + jsonExt.getString("pcsn") + "'").uniqueResult(0);
+ if (ObjectUtil.isEmpty(jsonSub)) {
+ throw new BadRequestException("未查询到该木箱对应的包装关系!");
+ }
+
+ // 2.找相同订单号的所有排
+ jsonSub.put("region_id", RegionTypeEnum.TWO_FH01.getId());
+ List pointLikeOrder = schBasePointMapper.queryLikeOrderRow(jsonSub);
+
+ // 3.找相同订单号的所在排的所有空位
+ String point_code = "";
+ List joArr = new ArrayList<>();
+
+ for (int i = 0; i < pointLikeOrder.size(); i++) {
+ JSONObject json = pointLikeOrder.get(i);
+
+ // 过滤此排的空位
+ List rowPointList = pointDaoList.stream()
+ .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
+ ObjectUtil.isEmpty(row.getVehicle_code()) &&
+ row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
+ )
+ .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq))
+ .collect(Collectors.toList());
+
+ joArr.addAll(rowPointList);
+ }
+
+ if (ObjectUtil.isEmpty(joArr)) {
+ //查询新的一排
+ List newRowPointList = schBasePointMapper.queryNewRow(jsonSub);
+
+ if (ObjectUtil.isEmpty(newRowPointList)) {
+ throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
+ }
+
+ for (int i = 0; i < newRowPointList.size(); i++) {
+ JSONObject json = newRowPointList.get(i);
+
+ // 找出这一排的所有空位
+ List rowPointList = pointDaoList.stream()
+ .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
+ ObjectUtil.isEmpty(row.getVehicle_code()) &&
+ row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
+ )
+ .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq))
+ .collect(Collectors.toList());
+
+ if (rowPointList.size() == 4) {
+ JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0)));
+
+ if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) {
+ continue;
+ }
+
+ point_code = jsonNewRow.getString("point_code");
+ break;
+ }
+ }
+ } else {
+ // 校验此货位是否被堵住:1.如果被堵住则判断下一个是否被堵住 2.如果全部被堵住则新开一排
+ for (int i = 0; i < joArr.size(); i++) {
+ JSONObject json = JSONObject.parseObject(JSON.toJSONString(joArr.get(i)));
+
+ // 判断是否被挡住
+ JSONObject paramJson = new JSONObject();
+ paramJson.put("point_code", json.getString("point_code"));
+ paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId());
+ List isBlock = schBasePointMapper.isBlock(paramJson);
+
+ if (ObjectUtil.isNotEmpty(isBlock)) {
+ // 堵住则判断下一个
+ continue;
+ } else {
+ if (cutConveyorTask.isSingleTask(json.getString("point_code"))) {
+ continue;
+ }
+ // 未堵住: 跳出循环
+ point_code = json.getString("point_code");
+ break;
+ }
+ }
+ }
+
+ if (ObjectUtil.isEmpty(point_code)) {
+ //查询新的一排
+ List newRowPointList = schBasePointMapper.queryNewRow(jsonSub);
+
+ if (ObjectUtil.isEmpty(newRowPointList)) {
+ throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
+ }
+
+ for (int i = 0; i < newRowPointList.size(); i++) {
+ JSONObject json = newRowPointList.get(i);
+
+ // 找出这一排的所有空位
+ List rowPointList = pointDaoList.stream()
+ .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) &&
+ ObjectUtil.isEmpty(row.getVehicle_code()) &&
+ row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))
+ )
+ .sorted(Comparator.comparing(SchBasePoint::getOut_order_seq))
+ .collect(Collectors.toList());
+
+ if (rowPointList.size() == 4) {
+ JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0)));
+
+ if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) {
+ continue;
+ }
+
+ point_code = jsonNewRow.getString("point_code");
+ break;
+ }
+ }
+ }
+
+ if (ObjectUtil.isEmpty(point_code)) {
+ throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!");
+ }
+ //创建任务
+ JSONObject task_jo = new JSONObject();
+ task_jo.put("point_code1", whereJson.getString("device_code"));
+ task_jo.put("point_code2", point_code);
+ task_jo.put("vehicle_code", whereJson.getString("vehicle_code"));
+ task_jo.put("task_type", "010506");
+ TwoSendOutTask taskBean = new TwoSendOutTask();
+ taskBean.createTask(task_jo);
+
+ // 锁住点位
+ ischBasePointService.update(
+ new UpdateWrapper().lambda()
+ .eq(SchBasePoint::getPoint_code, point_code)
+ .set(SchBasePoint::getLock_type, IOSEnum.LOCK_TYPE.code("其它"))
+ .set(SchBasePoint::getVehicle_code, whereJson.getString("vehicle_code"))
+ );
+
+ // 删除载具对应木箱记录
+ extTab.delete(jsonExt);
+ }
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java
new file mode 100644
index 000000000..e0d53cba1
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBoxManageService.java
@@ -0,0 +1,25 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ *
+ * 木箱入库业务处理 服务类
+ *
+ *
+ * @author generator
+ * @since 2023-11-16
+ */
+public interface InBoxManageService {
+
+ /**
+ * 木箱入库
+ * @param whereJson:{
+ * box_no: 木箱号
+ * vehicle_code:托盘号
+ * device_code:起点点位
+ * }
+ */
+ void inBox(JSONObject whereJson);
+
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java
index e13fe5b0f..6ef3f1d3e 100644
--- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/InBussManageService.java
@@ -43,4 +43,14 @@ public interface InBussManageService {
*/
JSONObject getOneStruct(JSONObject jsonObject);
+ /**
+ * 申请入库任务
+ * @param jsonObject {
+ * device_code: 起点
+ * vehicle_code: 载具号
+ * material_barcode: 子卷号: a,b,c
+ * }
+ */
+ void inTask(JSONObject jsonObject);
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java
new file mode 100644
index 000000000..a6fbc9723
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/LashManageService.java
@@ -0,0 +1,25 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ *
+ * 捆扎业务处理 服务类
+ *
+ *
+ * @author generator
+ * @since 2023-11-16
+ */
+public interface LashManageService {
+
+ /**
+ * 创建桁架任务
+ * @param whereJson {
+ * device_code:起点
+ * box_no: 箱号
+ *
+ * }
+ */
+ void createLashTask(JSONObject whereJson);
+
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java
new file mode 100644
index 000000000..7ac4a7b35
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/OutBoxManageService.java
@@ -0,0 +1,27 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ *
+ * 空木箱业务处理 服务类
+ *
+ *
+ * @author generator
+ * @since 2023-11-16
+ */
+public interface OutBoxManageService {
+
+ /**
+ * 出空木箱
+ * @param whereJson {
+ * device_code:终点
+ * box_length: 长
+ * box_width: 宽
+ * box_high: 高
+ * num: 子卷数
+ * }
+ */
+ void outBox(JSONObject whereJson);
+
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java
new file mode 100644
index 000000000..deba0362c
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java
@@ -0,0 +1,24 @@
+package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ *
+ * 发货业务处理 服务类
+ *
+ *
+ * @author generator
+ * @since 2023-11-16
+ */
+public interface SendOutManageService {
+
+ /**
+ * 创建发货任务
+ * @param whereJson {
+ * device_code:起点
+ * vehicle_code: 载具号
+ * }
+ */
+ void createSendOutTask(JSONObject whereJson);
+
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql
new file mode 100644
index 000000000..728aa8ad2
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_INBOX.wql
@@ -0,0 +1,166 @@
+[交易说明]
+ 交易名: 木箱入库逻辑
+ 所属模块:
+ 功能简述:
+ 版权所有:
+ 表引用:
+ 版本经历:
+
+[数据库]
+ --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库
+
+[IO定义]
+ #################################################
+ ## 表字段对应输入参数
+ #################################################
+ 输入.flag TYPEAS s_string
+ 输入.stor_id TYPEAS s_string
+ 输入.sect_id TYPEAS s_string
+ 输入.block_num TYPEAS s_string
+ 输入.row_num TYPEAS s_string
+ 输入.block_in TYPEAS f_string
+ 输入.row_in TYPEAS f_string
+ 输入.not_row_in TYPEAS f_string
+ 输入.not_block TYPEAS f_string
+
+[临时表]
+ --这边列出来的临时表就会在运行期动态创建
+
+[临时变量]
+ --所有中间过程变量均可在此处定义
+
+[业务过程]
+
+ ##########################################
+ # 1、输入输出检查 #
+ ##########################################
+
+
+ ##########################################
+ # 2、主过程前处理 #
+ ##########################################
+
+
+ ##########################################
+ # 3、业务主过程 #
+ ##########################################
+
+ IF 输入.flag = "1"
+ QUERY
+ SELECT
+ attr.block_num
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') = ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.not_block <> ""
+ attr.block_num NOT IN 输入.not_block
+ ENDOPTION
+
+ group by attr.block_num
+ order by attr.block_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "2"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+ AND IFNULL(attr.storagevehicle_code,'') <> ''
+
+ OPTION 输入.block_in <> ""
+ attr.block_num in 输入.block_in
+ ENDOPTION
+
+ OPTION 输入.row_in <> ""
+ attr.row_num in 输入.row_in
+ ENDOPTION
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "3"
+ QUERY
+ SELECT
+ attr.row_num
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') = ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.block_num <> ""
+ attr.block_num = 输入.block_num
+ ENDOPTION
+
+ OPTION 输入.not_row_in <> ""
+ attr.row_num NOT IN 输入.not_row_in
+ ENDOPTION
+
+ group by attr.row_num
+ order by attr.row_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "4"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') = ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+ AND attr.block_num = 输入.block_num
+ AND attr.row_num = 输入.row_num
+
+ order by attr.col_num,attr.layer_num ASC,attr.zdepth DESC
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+
+ IF 输入.flag = "5"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+ AND attr.block_num = 输入.block_num
+ AND attr.row_num = 输入.row_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
\ No newline at end of file
diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql
new file mode 100644
index 000000000..9b30a0e8b
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/wql/BST_OUTBOX.wql
@@ -0,0 +1,294 @@
+[交易说明]
+ 交易名: 木箱出库逻辑
+ 所属模块:
+ 功能简述:
+ 版权所有:
+ 表引用:
+ 版本经历:
+
+[数据库]
+ --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库
+
+[IO定义]
+ #################################################
+ ## 表字段对应输入参数
+ #################################################
+ 输入.flag TYPEAS s_string
+ 输入.stor_id TYPEAS s_string
+ 输入.sect_id TYPEAS s_string
+ 输入.block_num TYPEAS s_string
+ 输入.row_num TYPEAS s_string
+ 输入.block_num_in TYPEAS f_string
+ 输入.row_num_in TYPEAS f_string
+ 输入.not_row_in TYPEAS f_string
+ 输入.not_block_id TYPEAS f_string
+
+ 输入.box_length TYPEAS s_string
+ 输入.box_width TYPEAS s_string
+ 输入.box_high TYPEAS s_string
+ 输入.num TYPEAS s_string
+
+[临时表]
+ --这边列出来的临时表就会在运行期动态创建
+
+[临时变量]
+ --所有中间过程变量均可在此处定义
+
+[业务过程]
+
+ ##########################################
+ # 1、输入输出检查 #
+ ##########################################
+
+
+ ##########################################
+ # 2、主过程前处理 #
+ ##########################################
+
+
+ ##########################################
+ # 3、业务主过程 #
+ ##########################################
+
+ IF 输入.flag = "1"
+ QUERY
+ SELECT
+ attr.block_num
+ FROM
+ st_ivt_structattr attr
+ INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') <> ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.not_block_id <> ""
+ attr.block_num not in = 输入.not_block_id
+ ENDOPTION
+
+
+ OPTION 输入.box_length <> ""
+ box.box_length = 输入.box_length
+ ENDOPTION
+
+ OPTION 输入.box_width <> ""
+ box.box_width = 输入.box_width
+ ENDOPTION
+
+ OPTION 输入.box_high <> ""
+ box.box_high = 输入.box_high
+ ENDOPTION
+
+ OPTION 输入.num <> ""
+ box.num = 输入.num
+ ENDOPTION
+
+ group by attr.block_num
+ order by attr.block_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "2"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') <> ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.block_num <> ""
+ attr.block_num = 输入.block_num
+ ENDOPTION
+
+ OPTION 输入.block_num_in <> ""
+ attr.block_num in 输入.block_num_in
+ ENDOPTION
+
+ OPTION 输入.row_num_in <> ""
+ attr.row_num in 输入.row_num_in
+ ENDOPTION
+
+
+ OPTION 输入.box_length <> ""
+ box.box_length = 输入.box_length
+ ENDOPTION
+
+ OPTION 输入.box_width <> ""
+ box.box_width = 输入.box_width
+ ENDOPTION
+
+ OPTION 输入.box_high <> ""
+ box.box_high = 输入.box_high
+ ENDOPTION
+
+ OPTION 输入.num <> ""
+ box.num = 输入.num
+ ENDOPTION
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "3"
+ QUERY
+ SELECT
+ attr.row_num
+ FROM
+ st_ivt_structattr attr
+ INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') <> ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.block_num <> ""
+ attr.block_num = 输入.block_num
+ ENDOPTION
+
+ OPTION 输入.not_row_in <> ""
+ attr.row_num not in 输入.not_row_in
+ ENDOPTION
+
+
+ OPTION 输入.box_length <> ""
+ box.box_length = 输入.box_length
+ ENDOPTION
+
+ OPTION 输入.box_width <> ""
+ box.box_width = 输入.box_width
+ ENDOPTION
+
+ OPTION 输入.box_high <> ""
+ box.box_high = 输入.box_high
+ ENDOPTION
+
+ OPTION 输入.num <> ""
+ box.num = 输入.num
+ ENDOPTION
+
+ group by attr.row_num
+ order by attr.row_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "4"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(attr.storagevehicle_code,'') <> ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.block_num <> ""
+ attr.block_num = 输入.block_num
+ ENDOPTION
+
+
+ OPTION 输入.row_num <> ""
+ attr.row_num = 输入.row_num
+ ENDOPTION
+
+ OPTION 输入.box_length <> ""
+ box.box_length = 输入.box_length
+ ENDOPTION
+
+ OPTION 输入.box_width <> ""
+ box.box_width = 输入.box_width
+ ENDOPTION
+
+ OPTION 输入.box_high <> ""
+ box.box_high = 输入.box_high
+ ENDOPTION
+
+ OPTION 输入.num <> ""
+ box.num = 输入.num
+ ENDOPTION
+
+ order by attr.col_num, attr.zdepth, attr.layer_num
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "5"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.block_num <> ""
+ attr.block_num = 输入.block_num
+ ENDOPTION
+
+ OPTION 输入.row_num <> ""
+ attr.row_num = 输入.row_num
+ ENDOPTION
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
+
+ IF 输入.flag = "6"
+ QUERY
+ SELECT
+ attr.*
+ FROM
+ st_ivt_structattr attr
+ INNER JOIN bst_ivt_boxinfo box ON attr.storagevehicle_code = box.box_no
+ WHERE
+ attr.is_used = '1'
+ AND attr.is_delete = '0'
+ AND attr.lock_type = '1'
+ AND IFNULL(storagevehicle_code,'') <> ''
+ AND attr.stor_id = 输入.stor_id
+ AND attr.sect_id = 输入.sect_id
+
+ OPTION 输入.box_length <> ""
+ box.box_length = 输入.box_length
+ ENDOPTION
+
+ OPTION 输入.box_width <> ""
+ box.box_width = 输入.box_width
+ ENDOPTION
+
+ OPTION 输入.box_high <> ""
+ box.box_high = 输入.box_high
+ ENDOPTION
+
+ OPTION 输入.num <> ""
+ box.num = 输入.num
+ ENDOPTION
+
+ ENDSELECT
+ ENDQUERY
+ ENDIF
diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java
new file mode 100644
index 000000000..d6061dc38
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/ContainerLevelEnum.java
@@ -0,0 +1,44 @@
+package org.nl.common.enums;
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * 子卷等级
+ * @author gbx
+ * @since 2023-01-27
+ */
+public enum ContainerLevelEnum {
+ //
+ BEST(1, "A+", "1"),
+ WELL(2, "A", "2"),
+ COMMON(3, "A-", "3"),
+ REWORK(4, "返切", "4"),
+ SCRAP(5, "报废", "5"),
+ CONTROL(6, "管制", "6"),
+ OTHER(7, "其他", "7");
+
+ private int index;
+ private String name;
+ private String code;
+
+ public int getIndex() { return index;}
+
+ public String getName() {
+ return name;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ ContainerLevelEnum(int index, String name, String code) {
+ this.index = index;
+ this.name = name;
+ this.code = code;
+ }
+
+ public static ContainerLevelEnum getType(String type) {
+ Optional first = Arrays.stream(ContainerLevelEnum.values()).filter(a -> a.getCode().equals(type)).findFirst();
+ return first.orElse(ContainerLevelEnum.OTHER);
+ }
+}
\ No newline at end of file
diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java
new file mode 100644
index 000000000..1a0bc88ff
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java
@@ -0,0 +1,63 @@
+package org.nl.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+import org.nl.common.utils.MapOf;
+import org.nl.modules.common.exception.BadRequestException;
+
+import java.util.Map;
+
+/**
+ * 装箱区点位库存枚举
+ *
+ * @author gbx
+ * @since 2024-01-31
+ */
+@AllArgsConstructor
+@Getter
+public enum PackageInfoIvtEnum {
+ //点位类型
+ POINT_STATUS(MapOf.of("满轴缓存位", "1", "空载具缓存位", "2", "待检区", "3", "管制区", "4", "装箱区", "5", "装箱位", "6")),
+
+ //任务类型
+ TASK_TYPE(MapOf.of("输送线->满轴缓存位", "010701", "满轴缓存位->待检区", "010702", "满轴缓存位->管制区", "010703", "放空(空载具缓存位->输送线)",
+ "010704", "取空(待检区->空载具缓存位)", "010705", "待检区->管制区", "010706","管制区->待检区", "010707","待检区->装箱区", "010708", "装箱区->装箱对接位", "010709")),
+
+ //ACS任务类型
+ ACS_TASK_TYPE(MapOf.of("agv任务", "1", "桁架任务", "6")),
+
+ //ACS系统类型
+ AGV_SYSTEM_TYPE(MapOf.of("1楼叉车系统", "1", "2楼1区域AGV系统", "2", "2楼2区域AGV系统", "3")),
+
+ //桁架任务类型
+ TRUSS_TYPE(MapOf.of("点对点任务", "1", "下卷拔轴任务", "6", "换轴任务", "7","放轴任务", "8")),
+
+ //是否
+ IS_USED(MapOf.of("启用", "1", "未启用", "0")),
+
+ //位置
+ POINT_LOCATION(MapOf.of("上", "0", "下", "1")),
+
+ //库存状态
+ IVT_STATUS(MapOf.of("空", "0", "1", "空载具", "2", "有子卷"));
+
+ private Map code;
+
+ public String code(String desc) {
+ String code = this.getCode().get(desc);
+ if (StringUtils.isNotEmpty(code)) {
+ return code;
+ }
+ throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
+ }
+
+ public String check(String code) {
+ for (Map.Entry entry : this.getCode().entrySet()) {
+ if (entry.getValue().equals("code")) {
+ return entry.getValue();
+ }
+ }
+ throw new BadRequestException(this.name() + "对应类型" + code + "未定义");
+ }
+}
\ No newline at end of file
diff --git a/lms/nladmin-system/src/main/java/org/nl/start/Init.java b/lms/nladmin-system/src/main/java/org/nl/start/Init.java
index 00813ad7e..f3290745f 100644
--- a/lms/nladmin-system/src/main/java/org/nl/start/Init.java
+++ b/lms/nladmin-system/src/main/java/org/nl/start/Init.java
@@ -21,6 +21,7 @@ public class Init implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// initTwoAttr(4,30,3,2, "2");
+// createAttr();
}
/**
@@ -152,27 +153,27 @@ public class Init implements ApplicationRunner {
String now = DateUtil.now();
- for (int i = 1; i <= 2000; i++) {
+ for (int i = 1; i <= 3000; i++) {
JSONObject json = new JSONObject();
json.put("struct_id", IdUtil.getSnowflake(1,1).nextId());
if (i < 10) {
- json.put("struct_code", "B01-"+"000"+i+"-01");
- json.put("struct_name", "B01排"+"000"+i+"列-01层");
+ json.put("struct_code", "81-"+"000"+i+"-01");
+ json.put("struct_name", "81排"+"000"+i+"列-01层");
}else if (i >= 10 && i < 100) {
- json.put("struct_code", "B01-"+"00"+i+"-01");
- json.put("struct_name", "B01排"+"00"+i+"列-01层");
+ json.put("struct_code", "81-"+"00"+i+"-01");
+ json.put("struct_name", "81排"+"00"+i+"列-01层");
}else if (i >= 100 && i < 1000) {
- json.put("struct_code", "B01-"+"0"+i+"-01");
- json.put("struct_name", "B01排"+"0"+i+"列-01层");
+ json.put("struct_code", "81-"+"0"+i+"-01");
+ json.put("struct_name", "81排"+"0"+i+"列-01层");
} else {
- json.put("struct_code", "B01-"+i+"-01");
- json.put("struct_name", "B01排"+i+"列-01层");
+ json.put("struct_code", "81-"+i+"-01");
+ json.put("struct_name", "81排"+i+"列-01层");
}
- JSONObject jsonObject = tab2.query("stor_id = '1582991156504039455'").uniqueResult(0);
- JSONObject jsonObjec2 = tab3.query("stor_id = '1582991156504039455' and sect_code = 'BXN01'").uniqueResult(0);
+ JSONObject jsonObject = tab2.query("stor_id = '1597073830499717137'").uniqueResult(0);
+ JSONObject jsonObjec2 = tab3.query("stor_id = '1597073830499717137' and sect_code = 'XN81'").uniqueResult(0);
// 新增仓位
json.put("simple_name", json.getString("struct_name"));
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls
index 02df2d11c..9f5da0576 100644
Binary files a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls and b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls differ
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java
index fdbd8f9b9..db694714e 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java
@@ -29,12 +29,16 @@ public class AcsToWmsController {
@PostMapping("/status")
@Log(value = "ACS给WMS反馈任务状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
-
@SaIgnore
public ResponseEntity receiveTaskStatusAcs(@RequestBody String string) {
return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK);
}
+
+
+
+
+
@PostMapping("/orderFinish")
@Log(value = "ACS给WMS下发工单完成状态", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
@@ -137,4 +141,34 @@ public class AcsToWmsController {
}
+
+ @PostMapping("/sendProductToFirstFloor")
+ @Log(value = "成品子卷到达一楼输送线", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
+ @SaIgnore
+ public ResponseEntity sendProductToFirstFloor(@RequestBody JSONObject json) {
+ return new ResponseEntity<>(acsToWmsService.sendProductToFirstFloor(json), HttpStatus.OK);
+ }
+
+ @PostMapping("/applyTwo")
+ @Log(value = "二期入库申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
+ @SaIgnore
+ public ResponseEntity applyTwo(@RequestBody JSONObject whereJson) {
+ return new ResponseEntity<>(acsToWmsService.applyTwo(whereJson), HttpStatus.OK);
+ }
+
+ @PostMapping("/applySendOutTwo")
+ @Log(value = "二期发货申请任务", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
+ @SaIgnore
+ public ResponseEntity applySendOutTwo(@RequestBody JSONObject whereJson) {
+ return new ResponseEntity<>(acsToWmsService.applySendOutTwo(whereJson), HttpStatus.OK);
+ }
+
+ @PostMapping("/deviceApplyTwo")
+ @Log(value = "二期发货申请捆扎、贴标", isInterfaceLog = true, interfaceLogType = InterfaceLogType.ACS_TO_LMS)
+ @SaIgnore
+ public ResponseEntity deviceApplyTwo(@RequestBody JSONObject whereJson) {
+ return new ResponseEntity<>(acsToWmsService.deviceApplyTwo(whereJson), HttpStatus.OK);
+ }
+
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java
index f1615091f..5445e4abf 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java
@@ -79,6 +79,9 @@ public interface AcsToWmsService {
*/
JSONObject shipDeviceUpdate(JSONObject whereJson);
+
+
+
/**
* ACS客户端--->LMS服务端
* 输送线光电无货上报
@@ -105,4 +108,51 @@ public interface AcsToWmsService {
* 点位初始化
*/
void initPoint();
+
+
+
+ /**
+ * ACS客户端--->LMS服务端
+ * 成品子卷到达一楼输送线
+ *
+ * @param whereJson 条件
+ * @return JSONObject
+ */
+ JSONObject sendProductToFirstFloor(JSONObject whereJson);
+
+
+ /**
+ * 二期入库任务申请
+ * @param whereJson {
+ * type:任务类型(1-成品入库任务 2-空盘入库 3-空盘出库 4-异常处理位)
+ * device_code:设备号
+ * vehicle_code:载具号
+ * material_barcode:子卷编码(a,b,c)
+ * container_type:托盘类型(1-小托盘 2-大托盘)
+ *
+ * }
+ * @return JSONObject 反馈状态
+ */
+ JSONObject applyTwo(JSONObject whereJson);
+
+ /**
+ * 二期发货申请任务
+ * @param whereJson {
+ * device_code: 设备号
+ * vehicle_code: 载具号
+ * }
+ * @return JSONObject: 反馈状态
+ */
+ JSONObject applySendOutTwo(JSONObject whereJson);
+
+ /**
+ * 二期申请捆扎、贴标
+ * @param whereJson {
+ * device_code: 设备号
+ * vehicle_code: 载具号
+ * type: 任务类型(1-贴标 2-捆扎)
+ * }
+ * @return
+ */
+ JSONObject deviceApplyTwo(JSONObject whereJson);
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
index d1fc33a85..199f6b759 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
@@ -1,5 +1,6 @@
package org.nl.wms.ext.acs.service.impl;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
@@ -7,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.google.common.collect.Interner;
import com.google.common.collect.Interners;
import lombok.RequiredArgsConstructor;
@@ -38,12 +40,15 @@ import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
+
@Service
@RequiredArgsConstructor
@Slf4j
@@ -66,6 +71,37 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
private final ISysNoticeService noticeService;
+ /**
+ * 入库处理类服务
+ */
+ private final InBussManageService inBussManageService;
+
+ /**
+ * 空载具入库处理服务
+ */
+ private final InVehicleManageService inVehicleManageService;
+
+ /**
+ * 空载具出库处理服务
+ */
+ private final OutVehicleManageService outVehicleManageService;
+
+ /**
+ * 发货处理服务
+ */
+ private final SendOutManageService sendOutManageService;
+
+ @Resource
+ private IschBaseTaskService taskService;
+ @Resource
+ private IschBasePointService pointService;
+ @Resource
+ private IbstIvtPackageinfoivtService packageinfoivtService;
+
+ @Resource
+ private MzhcwTask mzhcwTask;
+
+
/**
* task_id:任务标识
* task_code:任务编码
@@ -1655,4 +1691,244 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
}
}
+
+ /**
+ * 成品子卷到达一楼输送线
+ */
+ @Override
+ public JSONObject sendProductToFirstFloor(JSONObject whereJson) {
+ // JSONObject whereJson 应该传子卷号,设备号,车间号
+ // 先查询满轴缓存位是否有可用库位,有创建搬运任务
+ // 任务完成创建空载具补充到输送线桁架任务,子卷搬运至待检区或或管制区agv任务
+ // 如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发;
+ // 这个情况是有agv任务在搬去待检区或管制区的路上,还没有更新任务状态;需要查询是否有这种任务,等这个任务更新完后,
+ // 再补发之前创建的输送线到满轴缓存位任务;
+ log.info("sendProductToFirstFloor--------------------------:" + whereJson.toString());
+ JSONObject result = new JSONObject();
+ if (StringUtils.isBlank(whereJson.getString("device_code")) || StringUtils.isBlank(whereJson.getString("material_barcode"))) {
+ throw new BadRequestException("接口sendProductToFirstFloor,任务号或子卷号参数为空!");
+
+ }
+ //1.查询满轴缓存位是否有空位
+ List bstIvtPackageinfoivtList = packageinfoivtService
+ .list(new LambdaUpdateWrapper()
+ .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"))
+ .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用"))
+ .eq(BstIvtPackageinfoivt::getIvt_status, PackageInfoIvtEnum.IVT_STATUS.code("空")).orderByAsc(BstIvtPackageinfoivt::getSort_seq));
+ JSONObject jo = new JSONObject();
+ jo.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("输送线->满轴缓存位"));
+ jo.put("acs_task_type", PackageInfoIvtEnum.ACS_TASK_TYPE.code("桁架任务"));
+ //todo 获取子卷号,子卷号就是载具号?
+ jo.put("vehicle_code", whereJson.getString("material_barcode"));
+ //2.创建输送线->满轴位桁架任务,
+ String point_code1 = whereJson.getString("device_code");
+ jo.put("point_code1", point_code1);
+ if (CollectionUtils.isNotEmpty(bstIvtPackageinfoivtList)) {
+ //任意一个满轴缓存位为终点
+ jo.put("point_code2", bstIvtPackageinfoivtList.get(0).getPoint_code());
+ jo.put("is_send", true);
+ mzhcwTask.createTask(jo);
+ result.put("status", HttpStatus.OK.value());
+ result.put("message", "反馈成功!");
+ return result;
+ } else {
+ //3.满轴缓存位点位,查找正在搬运到待检区的任务
+ List packageinfoivtList = packageinfoivtService
+ .list(new LambdaUpdateWrapper()
+ .eq(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位")));
+ //todo 查找正在起点为满轴缓存位点位,且执行中搬运到待检区或管制区的任务,如果有一个或多个,现场其实有多个车正在搬运过去
+ List taskList = taskService.list(new LambdaUpdateWrapper()
+ //执行中
+ .nested(
+ r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区"))
+ .or().eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->管制区")))
+ .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode())
+ .and(
+ r -> r.in(SchBaseTask::getPoint_code1, packageinfoivtList)
+ ));
+ //4.满轴缓存位无空闲库位,且无执行中搬运到待检区或管制区的任务,则报错!
+ if (CollectionUtils.isEmpty(taskList)) {
+ throw new BadRequestException("接口sendProductToFirstFloor,满轴缓存位暂无空闲库位!");
+ }
+ // 5.如果满轴位没有可用的空点位,先创建一个桁架任务但是不下发,等这边空出来点位,判断是否有这种桁架任务然后补发;
+ // 创建前先判断是否有已创建相同任务
+ List existTaskList = taskService.list(new LambdaUpdateWrapper()
+ .eq(SchBaseTask::getPoint_code1, point_code1)
+ .eq(SchBaseTask::getTask_status, TaskStatusEnum.SURE_START.getCode()));
+ //6.如果有就不创建,没有就创建
+ // 等这边空出来点位,也就是满轴位->待检区或管制区任务完成后,再补发;
+ if (CollectionUtils.isEmpty(existTaskList)) {
+ //暂时只确定起点,正在搬运的满轴位->待检区的点位,暂不作为终点
+ //jo.put("point_code2", taskList.get(0).getPoint_code1());
+ jo.put("task_status", TaskStatusEnum.SURE_START.getCode());
+ jo.put("is_send", false);
+ mzhcwTask.createTask(jo);
+ }
+ result.put("status", HttpStatus.OK.value());
+ result.put("message", "反馈成功!");
+ return result;
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @SneakyThrows
+ public JSONObject applyTwo(JSONObject whereJson) {
+ log.info("applyTwo请求参数:---------------------------------------------" + whereJson.toString());
+ JSONObject result = new JSONObject();
+
+ String type = whereJson.getString("type");
+ RLock lock = redissonClient.getLock("acs_to_wms_two_a:" + type);
+ boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
+
+ try {
+ if (tryLock) {
+ // 基础校验
+ if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) {
+ throw new BadRequestException("设备不能为空!");
+ }
+
+ if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘入库")) || type.equals(IOSEnum.ACSTOLMS_TYPE.code("异常处理位"))) {
+ if (ObjectUtil.isEmpty(whereJson.getString("container_type"))) {
+ throw new BadRequestException("载具类型不能为空!");
+ }
+
+ if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) {
+ throw new BadRequestException("载具不能为空!");
+ }
+ }
+
+ // 1-成品入库任务
+ if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("成品入库任务"))) {
+
+ // 调用服务处理
+ if (ObjectUtil.isEmpty(whereJson.getString("material_barcode"))) {
+ throw new BadRequestException("子卷号不能为空!");
+ }
+
+ inBussManageService.inTask(whereJson);
+
+ } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘入库"))) {
+
+ // 2-空盘入库
+ whereJson.put("vehicle_type", whereJson.getString("container_type"));
+ inVehicleManageService.inVehicle(whereJson);
+
+ } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("空盘出库"))) {
+
+ // 3-空盘出库
+ if (ObjectUtil.isEmpty(whereJson.getString("container_type"))) {
+ throw new BadRequestException("载具类型不能为空!");
+ }
+
+ whereJson.put("vehicle_type", whereJson.getString("container_type"));
+ outVehicleManageService.outVehicle(whereJson);
+
+ } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("异常处理位"))) {
+
+ // 4-异常处理
+ JSONObject jsonTaskParam = new JSONObject();
+ jsonTaskParam.put("task_type", "010504");
+ jsonTaskParam.put("start_device_code", whereJson.getString("device_code"));
+ jsonTaskParam.put("next_device_code", "");
+ jsonTaskParam.put("vehicle_code", whereJson.getString("vehicle_code"));
+ jsonTaskParam.put("vehicle_type", whereJson.getString("container_type"));
+
+ TwoEmpExcepTask taskBean = new TwoEmpExcepTask();
+ taskBean.createTask(jsonTaskParam);
+ }
+ result.put("status", HttpStatus.OK.value());
+ result.put("message", "下发成功!");
+ log.info("applyTwo返回参数:---------------------------------------------" + result.toString());
+ return result;
+ }
+ } finally {
+ if (tryLock) {
+ lock.unlock();
+ }
+ }
+
+ result.put("status", HttpStatus.BAD_REQUEST.value());
+ result.put("message", "申请任务超时!" + type);
+ log.info("applyTwo返回参数:---------------------------------------------" + result.toString());
+ return result;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public JSONObject applySendOutTwo(JSONObject whereJson) {
+ log.info("applySendOutTwo输入参数:---------------------------------------------" + whereJson.toString());
+
+ // 校验
+ if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) {
+ throw new BadRequestException("设备号不能为空!");
+ }
+
+ if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) {
+ throw new BadRequestException("载具号不能为空!");
+ }
+
+ JSONObject result = new JSONObject();
+ try {
+ // 调用服务
+ sendOutManageService.createSendOutTask(whereJson);
+
+ result.put("status", HttpStatus.OK.value());
+ result.put("message", "下发成功!");
+ return result;
+ } catch (Exception e) {
+ result.put("status", HttpStatus.BAD_REQUEST.value());
+ result.put("message", e.getMessage());
+ }
+
+ log.info("applySendOutTwo返回参数:---------------------------------------------" + result.toString());
+ return result;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @SneakyThrows
+ public JSONObject deviceApplyTwo(JSONObject whereJson) {
+ log.info("deviceApplyTwo请求参数:---------------------------------------------" + whereJson.toString());
+ JSONObject result = new JSONObject();
+
+ String type = whereJson.getString("type");
+ RLock lock = redissonClient.getLock("acs_to_wms_two_b:" + type);
+ boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
+
+ try {
+ if (tryLock) {
+ // 校验
+ if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) {
+ throw new BadRequestException("设备号不能为空!");
+ }
+
+ if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) {
+ throw new BadRequestException("载具号不能为空!");
+ }
+
+ // 1-贴标
+ if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("贴标"))) {
+
+ } else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("贴标"))) {
+ // 2-捆扎
+ }
+
+ result.put("status", HttpStatus.OK.value());
+ result.put("message", "下发成功!");
+ log.info("deviceApplyTwo返回参数:---------------------------------------------" + result.toString());
+ return result;
+ }
+ } finally {
+ if (tryLock) {
+ lock.unlock();
+ }
+ }
+
+ result.put("status", HttpStatus.BAD_REQUEST.value());
+ result.put("message", "申请任务超时!" + type);
+ log.info("deviceApplyTwo返回参数:---------------------------------------------" + result.toString());
+ return result;
+ }
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java
index 7d4d78a83..2394deb59 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java
@@ -114,4 +114,12 @@ public class MesToLmsController {
}
+ @PostMapping("/sendTargetHouse")
+ @Log("MES传递给LMS入线边库或者入成品库")
+ @SaIgnore
+ public ResponseEntity sendTargetHouse(@RequestBody JSONObject jo) {
+ return new ResponseEntity<>(mesToLmsService.sendTargetHouse(jo), HttpStatus.OK);
+ }
+
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java
index fd296d665..6e3073fb8 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java
@@ -62,4 +62,12 @@ public interface MesToLmsService {
JSONObject sendAuditResult(JSONObject param);
JSONObject sendProcessInfo(JSONObject param);
+
+ /**
+ * MES传递给LMS入线边库或者入成品库
+ */
+ JSONObject sendTargetHouse(JSONObject param);
+
+
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java
index 326e98a94..4a432e540 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java
@@ -7,9 +7,17 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt;
+import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService;
import org.nl.b_lms.sch.tasks.ProcessTask;
+import org.nl.b_lms.sch.tasks.first_floor_area.DjqTask;
+import org.nl.b_lms.sch.tasks.first_floor_area.GzqTask;
+import org.nl.common.enums.PackageInfoIvtEnum;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
@@ -28,8 +36,11 @@ import org.nl.wms.st.instor.service.impl.ProductScrapServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -42,6 +53,15 @@ public class MesToLmsServiceImpl implements MesToLmsService {
private final InService inService;
+ @Resource
+ private DjqTask djqTask;
+ @Resource
+ private GzqTask gzqTask;
+
+ @Resource
+ private IbstIvtPackageinfoivtService packageinfoivtService;
+
+
/**
* 生箔烘箱:
* 母卷批次创建信息发送智能物流(MES生箔工序Move In)
@@ -1470,68 +1490,68 @@ public class MesToLmsServiceImpl implements MesToLmsService {
throw new BadRequestException("传入的类型不能为空!");
}
- JSONObject device_jo = WQLObject.getWQLObject("st_ivt_stpointivt").query("ext_code = '"+ResourceName+"'").uniqueResult(0);
- if (ObjectUtil.isEmpty(device_jo)){
- throw new BadRequestException("未查询到["+ResourceName+"]应的表处机设备!");
+ JSONObject device_jo = WQLObject.getWQLObject("st_ivt_stpointivt").query("ext_code = '" + ResourceName + "'").uniqueResult(0);
+ if (ObjectUtil.isEmpty(device_jo)) {
+ throw new BadRequestException("未查询到[" + ResourceName + "]应的表处机设备!");
}
ProcessTask processTask = SpringContextHolder.getBean(ProcessTask.class);
//上料
- if ("1".equals(Type)){
+ if ("1".equals(Type)) {
String up_scroll = device_jo.getString("up_scroll");
String up_pcsn = device_jo.getString("up_pcsn");
- if (StrUtil.isNotEmpty(up_pcsn)){
- throw new BadRequestException("LMS系统上【"+ResourceName+"】表处机上还存在母卷号,不能进行上料!");
+ if (StrUtil.isNotEmpty(up_pcsn)) {
+ throw new BadRequestException("LMS系统上【" + ResourceName + "】表处机上还存在母卷号,不能进行上料!");
}
//查询母卷所在点位
JSONObject jsonCoolIvt = coolIvtTab.query("container_name = '" + containerName + "' and full_point_status = '02' and cool_ivt_status <> '04'").uniqueResult(0);
JSONObject form = new JSONObject();
- if (StrUtil.isEmpty(up_scroll)){
+ if (StrUtil.isEmpty(up_scroll)) {
//取满放满
- form.put("point_code1",jsonCoolIvt.getString("point_code"));
- form.put("point_code2",device_jo.getString("point_code"));
- form.put("task_type","010702");
- form.put("material_code",jsonCoolIvt.getString("container_name"));
- form.put("vehicle_code",jsonCoolIvt.getString("full_vehicle_code"));
- form.put("product_area",device_jo.getString("product_area"));
- }else {
+ form.put("point_code1", jsonCoolIvt.getString("point_code"));
+ form.put("point_code2", device_jo.getString("point_code"));
+ form.put("task_type", "010702");
+ form.put("material_code", jsonCoolIvt.getString("container_name"));
+ form.put("vehicle_code", jsonCoolIvt.getString("full_vehicle_code"));
+ form.put("product_area", device_jo.getString("product_area"));
+ } else {
//取满取空放满放空
- form.put("point_code1",jsonCoolIvt.getString("full_point_code"));
- form.put("point_code2",device_jo.getString("point_code"));
- form.put("point_code3",device_jo.getString("point_code"));
+ form.put("point_code1", jsonCoolIvt.getString("full_point_code"));
+ form.put("point_code2", device_jo.getString("point_code"));
+ form.put("point_code3", device_jo.getString("point_code"));
//判断对应空轴点位是否为空,为空用当前点位,不为空查询其他点位
- if (jsonCoolIvt.getString("empty_point_status").equals("01")){
- form.put("point_code4",jsonCoolIvt.getString("empty_point_code"));
- }else {
+ if (jsonCoolIvt.getString("empty_point_status").equals("01")) {
+ form.put("point_code4", jsonCoolIvt.getString("empty_point_code"));
+ } else {
JSONObject map = new JSONObject();
map.put("flag", "6");
map.put("product_area", device_jo.getString("product_area"));
JSONObject jsonIvt = WQL.getWO("PDA_RAWFOIL_01").addParamMap(map).process().uniqueResult(0);
- form.put("point_code4",jsonIvt.getString("empty_point_code"));
+ form.put("point_code4", jsonIvt.getString("empty_point_code"));
}
- form.put("task_type","010701");
- form.put("material_code",jsonCoolIvt.getString("container_name"));
- form.put("vehicle_code",jsonCoolIvt.getString("full_vehicle_code"));
- form.put("product_area",device_jo.getString("product_area"));
+ form.put("task_type", "010701");
+ form.put("material_code", jsonCoolIvt.getString("container_name"));
+ form.put("vehicle_code", jsonCoolIvt.getString("full_vehicle_code"));
+ form.put("product_area", device_jo.getString("product_area"));
}
processTask.createTask(form);
}
//退料
- if ("2".equals(Type)){
+ if ("2".equals(Type)) {
//取满取空放满放空
JSONObject form = new JSONObject();
JSONObject map = new JSONObject();
map.put("flag", "1");
map.put("product_area", device_jo.getString("product_area"));
JSONObject jsonIvt = WQL.getWO("PDA_RAWFOIL_01").addParamMap(map).process().uniqueResult(0);
- form.put("point_code1",device_jo.getString("point_code"));
+ form.put("point_code1", device_jo.getString("point_code"));
//寻找可用的冷却区满轴点位
- form.put("point_code2",jsonIvt.getString("full_point_code"));
- form.put("task_type","010704");
- form.put("material_code",device_jo.getString("up_pcsn"));
- form.put("vehicle_code",device_jo.getString("up_scroll"));
- form.put("product_area",device_jo.getString("product_area"));
+ form.put("point_code2", jsonIvt.getString("full_point_code"));
+ form.put("task_type", "010704");
+ form.put("material_code", device_jo.getString("up_pcsn"));
+ form.put("vehicle_code", device_jo.getString("up_scroll"));
+ form.put("product_area", device_jo.getString("product_area"));
processTask.createTask(form);
}
@@ -1547,4 +1567,68 @@ public class MesToLmsServiceImpl implements MesToLmsService {
log.info("sendProcessInfo接口输出参数为:-------------------" + resultParam.toString());
return resultParam;
}
+
+ @Override
+ public JSONObject sendTargetHouse(JSONObject param) {
+ log.info("sendTargetHouse输入参数为:-------------------" + param.toString());
+ JSONObject resultParam = new JSONObject();
+ try {
+ String containerName = param.getString("sconds");
+ String TargetHouse = param.getString("TargetHouse");
+ if (StringUtils.isBlank(containerName)) {
+ throw new BadRequestException("传入的母卷号不能为空!");
+ }
+ if (StringUtils.isBlank(TargetHouse)) {
+ throw new BadRequestException("传入的目标库不能为空!");
+ }
+ //待检区和管制区库位信息
+ List bstIvtPackageinfoivtList = packageinfoivtService
+ .list(new LambdaUpdateWrapper()
+ .in(BstIvtPackageinfoivt::getPoint_status, PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.POINT_STATUS.code("管制区"))
+ .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用"))
+ .orderByAsc(BstIvtPackageinfoivt::getSort_seq));
+ //子卷信息
+ BstIvtPackageinfoivt containerInfo =
+ bstIvtPackageinfoivtList.stream().filter(r -> r.getContainer_name().equals(containerName)).collect(Collectors.toList()).get(0);
+ JSONObject toDjqTask = new JSONObject();
+ toDjqTask.put("vehicle_code", containerName);
+ //0 管制区 1待检区
+ if ("0".equals(TargetHouse)) {
+ if (containerInfo.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区"))) {
+ List djqList = bstIvtPackageinfoivtList.stream().filter(r -> r.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("待检区")) && r.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code("空"))).collect(Collectors.toList());
+ //待检区有空位,搬到待检区
+ if (CollectionUtils.isNotEmpty(djqList)) {
+ toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("管制区->待检区"));
+ toDjqTask.put("point_code1", containerInfo.getPoint_code());
+ toDjqTask.put("point_code2", djqList.get(0).getPoint_code());
+ djqTask.createTask(toDjqTask);
+ }
+ }
+
+ } else if ("1".equals(TargetHouse)) {
+ if (containerInfo.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("管制区"))) {
+ List gzqList = bstIvtPackageinfoivtList.stream().filter(r -> r.getPoint_status().equals(PackageInfoIvtEnum.POINT_STATUS.code("管制区")) && r.getIvt_status().equals(PackageInfoIvtEnum.IVT_STATUS.code("空"))).collect(Collectors.toList());
+ //管制区有空位
+ if (CollectionUtils.isNotEmpty(gzqList)) {
+ toDjqTask.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("管制区->待检区"));
+ toDjqTask.put("point_code1", containerInfo.getPoint_code());
+ toDjqTask.put("point_code2", gzqList.get(0).getPoint_code());
+ gzqTask.createTask(toDjqTask);
+ }
+
+ }
+ }
+ resultParam.put("RTYPE", "S");
+ resultParam.put("Code", "0");
+ resultParam.put("RTMSG", "操作成功!");
+ } catch (Exception e) {
+ resultParam.put("RTYPE", "E");
+ resultParam.put("Code", "1");
+ resultParam.put("RTMSG", "操作失败!," + e.getMessage());
+ }
+ log.info("sendTargetHouse接口输出参数为:-------------------" + resultParam);
+ return resultParam;
+ }
+
+
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java
index a80c8cecc..03579cce6 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/eum/RegionTypeEnum.java
@@ -20,8 +20,12 @@ public enum RegionTypeEnum {
LKCK("17", "密集库出库输送线", "1585167595403874304"),
XN01("18", "虚拟区", "1586913215886004224"),
PD01("19", "盘点区", "1645705331612979200"),
- TWO_ZZ01("20", "二期暂存区", ""),
- TWO_TTP01("21", "二期空托盘区", "1750471797729529856");
+ TWO_ZZ01("20", "二期暂存区", "1760183596628447232"),
+ TWO_TTP01("21", "二期空托盘区", "1750471797729529856"),
+ TWO_MX01("22", "二期木箱区", "1752254266938101760"),
+ TWO_KZ01("23", "二期捆扎区", "1754774130626007040"),
+ TWO_FH01("24", "二期发货区", "1759453285649092608"),
+ TWO_OUT01("25", "二期出库区", "1760141408548818944");
private String name;
private String code;
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java
index c9afb704b..b1a25052c 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java
@@ -110,7 +110,6 @@ public abstract class AbstractAcsTask {
public JSONObject immediateNotifyAcs(String task_id) {
List taskList = this.schedule();
if (ObjectUtil.isNotEmpty(taskList)) {
-
JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList));
return AcsUtil.notifyAcs("api/wms/task", arr);
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java
index 6fdcea1f6..d30bace53 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java
@@ -1,6 +1,7 @@
package org.nl.wms.sch.manage;
public enum TaskStatusEnum {
+
CREATED("01", "生成"),
SURE_START("02", "确定起点"),
SURE_END("03", "确定终点"),
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java
index a7383d9a1..b7a66b33c 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CutTrussTask.java
@@ -85,71 +85,6 @@ public class CutTrussTask extends AbstractAcsTask {
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
- if (StrUtil.equals(status, "0")) {
- // 更新删除字段
- jsonTask.put("is_delete", "1");
- jsonTask.put("update_time", DateUtil.now());
- taskTab.update(jsonTask);
-
- //桁架标准任务
- if ("010403".equals(jsonTask.getString("task_type"))) {
- //更新入站气涨轴的分切计划状态
- JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05')").getResultJSONArray(0);
- if (ObjectUtil.isEmpty(plan_jo)) {
- throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:入站中或入站完成的分切计划!");
- }
- for (int i = 0; i < plan_jo.size(); i++) {
- JSONObject plan_row = plan_jo.getJSONObject(i);
- plan_row.put("status", "03");
- plan_row.put("end_time", DateUtil.now());
- WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row);
- }
-
- //更新出站气涨轴的分切计划状态
- JSONArray plan_jo2 = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code2") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0);
- if (ObjectUtil.isEmpty(plan_jo2)) {
- throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code2") + "状态为:出站中的分切计划!");
- }
- for (int i = 0; i < plan_jo2.size(); i++) {
- JSONObject plan_row = plan_jo2.getJSONObject(i);
- plan_row.put("status", "05");
- plan_row.put("end_time", DateUtil.now());
- WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row);
- }
- }
-
- //分切>输送线 子卷出站
- if ("010404".equals(jsonTask.getString("task_type"))) {
- if (!jsonTask.getString("vehicle_code").contains("废箔")) {
- //更新出站气涨轴的分切计划状态
- JSONArray plan_jo2 = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status = '06'").getResultJSONArray(0);
- if (ObjectUtil.isEmpty(plan_jo2)) {
- throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:出站中的分切计划!");
- }
- for (int i = 0; i < plan_jo2.size(); i++) {
- JSONObject plan_row = plan_jo2.getJSONObject(i);
- plan_row.put("status", "05");
- plan_row.put("end_time", DateUtil.now());
- WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row);
- }
- }
- }
- //分切>输送线 子卷入站
- if ("010405".equals(jsonTask.getString("task_type"))) {
- //更新入站气涨轴的分切计划状态
- JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0);
- if (ObjectUtil.isEmpty(plan_jo)) {
- throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "状态为:入站中或入站完成的分切计划!");
- }
- for (int i = 0; i < plan_jo.size(); i++) {
- JSONObject plan_row = plan_jo.getJSONObject(i);
- plan_row.put("status", "03");
- plan_row.put("end_time", DateUtil.now());
- WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row);
- }
- }
- }
-
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
// 更新任务状态为执行中
jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode());
@@ -165,7 +100,6 @@ public class CutTrussTask extends AbstractAcsTask {
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
-
//桁架标准任务,双工位任务
if ("010403".equals(jsonTask.getString("task_type"))) {
//更新分切机对应位置的气涨轴
@@ -264,84 +198,6 @@ public class CutTrussTask extends AbstractAcsTask {
cutConveyorTask.createTask(form);
}
- //子卷入站
- if ("010405".equals(jsonTask.getString("task_type"))) {
- //更新输送线的气涨轴编码
- JSONObject delivery_point = WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0);
- if (ObjectUtil.isEmpty(delivery_point)) {
- throw new BadRequestException("未查询到对应的输送线点位!");
- }
- delivery_point.put("qzzno", "");
- delivery_point.put("point_status", "02");
- WQLObject.getWQLObject("ST_IVT_DeliveryPointIvt").update(delivery_point);
-
- //更新入站气涨轴的分切计划状态
- JSONArray plan_jo = WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").query("qzzno = '" + jsonTask.getString("vehicle_code") + "' AND is_child_tz_ok = '1' AND is_child_ps_ok = '1' AND is_delete = '0' AND status IN ('04','05') ").getResultJSONArray(0);
- if (ObjectUtil.isEmpty(plan_jo)) {
- throw new BadRequestException("未查询到气涨轴:" + jsonTask.getString("vehicle_code") + "对应的分切计划!");
- }
- for (int i = 0; i < plan_jo.size(); i++) {
- JSONObject plan_row = plan_jo.getJSONObject(i);
- plan_row.put("status", "05");
- plan_row.put("end_time", DateUtil.now());
- WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(plan_row);
- }
-
- //如果桁架任务执行完,右侧的输送线上存在气涨轴,则生成一个输送出的任务,防止左侧空载具挡住右侧气涨轴进行横移
- log.debug("如果桁架任务执行完,缓存位的输送线上存在气涨轴,则对上料位的空载具生成一个输送出的任务");
- char dtl_type = jsonTask.getString("point_code1").charAt(jsonTask.getString("point_code1").length() - 1);
- if (Integer.valueOf(String.valueOf(dtl_type)) % 2 != 0) {
- String point_location = delivery_point.getString("point_location");
- String product_area = delivery_point.getString("product_area");
- String sort_seq = delivery_point.getString("sort_seq");
- JSONObject right_point = WQL.getWO("PDA_02")
- .addParam("point_location", point_location)
- .addParam("point_code", jsonTask.getString("point_code1"))
- .addParam("product_area", product_area)
- .addParam("sort_seq", sort_seq)
- .addParam("find_type", "3")
- .addParam("flag", "17").process().uniqueResult(0);
- if (ObjectUtil.isNotEmpty(right_point)) {
- log.debug("生成一个输送线出库任务");
- //生成一个输送线出库任务
- JSONObject form = new JSONObject();
- form.put("point_code1", jsonTask.getString("point_code1"));
- JSONObject ss_jo = WQLObject.getWQLObject("sch_base_point").query("product_area = '" + delivery_point.getString("product_area") + "' AND point_type = '7'").uniqueResult(0);
- form.put("point_code2", ss_jo.getString("point_code"));
- if (StrUtil.isEmpty(delivery_point.getString("vehicle_code"))) {
- throw new BadRequestException("点位:" + delivery_point.getString("point_code") + "载具号为空!");
- }
- form.put("vehicle_code2", delivery_point.getString("vehicle_code"));
- //分切输送出
- form.put("task_type", "010401");
- form.put("product_area", delivery_point.getString("product_area"));
- cutConveyorTask.createTask(form);
- } else {
-
- right_point = WQL.getWO("PDA_02")
- .addParam("point_location", point_location)
- .addParam("point_code", jsonTask.getString("point_code1"))
- .addParam("product_area", product_area)
- .addParam("sort_seq", sort_seq)
- .addParam("find_type", "4")
- .addParam("flag", "18").process().uniqueResult(0);
- if (ObjectUtil.isNotEmpty(right_point)) {
- //判断对应缓存位是否存在需要末次下卷或者废箔下卷的任务
- JSONObject task_jo = WQLObject.getWQLObject("sch_base_task").query("vehicle_code2 = '" + right_point.getString("vehicle_code") + "' AND is_delete = '0' AND task_status = '02'").uniqueResult(0);
- if (ObjectUtil.isNotEmpty(task_jo)) {
- if ("010404".equals(task_jo.getString("task_type"))) {
- //出站
- task_jo.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
- task_jo.put("point_code2", jsonTask.getString("point_code1"));
- task_jo.put("vehicle_code2", delivery_point.getString("vehicle_code"));
- WQLObject.getWQLObject("sch_base_task").update(task_jo);
- new CutTrussTask().immediateNotifyAcs(null);
- }
- }
- }
- }
- }
- }
}
}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java
index 97e9a51bf..87acec304 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java
@@ -5,8 +5,10 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
-import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.InVehicleManageServiceImpl;
-import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.OutVehicleManageServiceImpl;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.*;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
+import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.LashManageService;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.st.inbill.service.CheckOutBillService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,12 @@ public class CheckOutBillController {
@Autowired
private IStIvtIostorinvOutService iStIvtIostorinvOutService;
+ private final LashManageService lashManageService;
+
+ private final InBussManageService inBussManageService;
+
+ private final SendOutManageServiceImpl sendOutManageService;
+
@GetMapping
@Log("查询出库单")
@@ -377,4 +385,39 @@ public class CheckOutBillController {
return new ResponseEntity<>(HttpStatus.OK);
}
+ @PostMapping("/testInBox")
+ @Log("木箱入库测试")
+ public ResponseEntity testInBox(@RequestBody JSONObject whereJson) {
+ new InBoxManageServiceImpl().inBox(whereJson);
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
+ @PostMapping("/testOutBox")
+ @Log("木箱出库测试")
+ public ResponseEntity testOutBox(@RequestBody JSONObject whereJson) {
+ new OutBoxManageServiceImpl().outBox(whereJson);
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
+ @PostMapping("/testBoxLash")
+ @Log("木箱捆扎测试")
+ public ResponseEntity testBoxLash(@RequestBody JSONObject whereJson) {
+ lashManageService.createLashTask(whereJson);
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
+ @PostMapping("/testSendOut")
+ @Log("发货区测试")
+ public ResponseEntity testSendOut(@RequestBody JSONObject whereJson) {
+ sendOutManageService.createSendOutTask(whereJson);
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
+ @PostMapping("/testIn")
+ @Log("申请入库")
+ public ResponseEntity testIn(@RequestBody JSONObject whereJson) {
+ inBussManageService.inTask(whereJson);
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
}
diff --git a/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue b/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue
index be120c759..70cc19381 100644
--- a/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue
+++ b/lms/nladmin-ui/src/views/wms/basedata/st/struct/index.vue
@@ -228,6 +228,16 @@
{{ dict.label.placement_type[scope.row.placement_type] }}
+
+
+ {{ dict.label.zdepth[scope.row.zdepth] }}
+
+
+
+
+ {{ dict.label.storagevehicle_type[scope.row.storagevehicle_type] }}
+
+
{
crudRawAssist.getIODtl({ 'bill_code': this.form.dtl_row.bill_code, 'open_flag': '1' }).then(res => {
this.openParam = res