diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java index c470ad07..7595cd64 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java @@ -37,6 +37,14 @@ public class RegionController { return new ResponseEntity<>(regionService.queryAll(whereJson, page), HttpStatus.OK); } + @GetMapping("/getPointQuery") + @Log("获取可用点位") + @ApiOperation("获取可用点位") + //@SaCheckPermission("region:list") + public ResponseEntity getPointQuery(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(regionService.getPointQuery(whereJson, page), HttpStatus.OK); + } + @PostMapping @Log("新增区域管理") @ApiOperation("新增区域管理") diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java index 32bce07e..bc91ac25 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java @@ -82,4 +82,13 @@ public interface RegionService { * @return JSONObject */ JSONObject getRegionSelect(JSONObject whereJson); + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map getPointQuery(Map whereJson, Pageable page); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java index 384cdbf3..c5da13bf 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java @@ -200,4 +200,20 @@ public class RegionServiceImpl implements RegionService { return jo; } + @Override + public Map getPointQuery(Map whereJson, Pageable page) { + String product_area = MapUtil.getStr(whereJson, "stor_id"); // 生产区域 + String region_code = MapUtil.getStr(whereJson, "sect_id"); // 所属区域 + String point_code = MapUtil.getStr(whereJson, "point_code"); + + JSONObject map = new JSONObject(); + map.put("flag", "4"); + map.put("product_area",product_area); + map.put("region_code",region_code); + if (ObjectUtil.isNotEmpty(point_code)) map.put("point_code","%"+point_code+"%"); + + JSONObject jsonObject = WQL.getWO("QSCH_REGION_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point.point_code ASC"); + return jsonObject; + } + } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_REGION_01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_REGION_01.wql index a5232908..b78710bf 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_REGION_01.wql +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_REGION_01.wql @@ -16,6 +16,7 @@ 输入.flag TYPEAS s_string 输入.region_code TYPEAS s_string 输入.product_area TYPEAS s_string + 输入.point_code TYPEAS s_string 输入.value TYPEAS s_string [临时表] @@ -89,4 +90,34 @@ ENDOPTION ENDSELECT ENDQUERY - ENDIF \ No newline at end of file + ENDIF + + IF 输入.flag = "4" + PAGEQUERY + SELECT + point.*, + region.region_name + FROM + sch_base_point point + LEFT JOIN sch_base_region region ON point.region_code = region.region_code + WHERE + point.lock_type = '1' + and point.is_used = '1' + and point.is_delete = '0' + + OPTION 输入.product_area <> "" + point.product_area = 输入.product_area + ENDOPTION + + OPTION 输入.region_code <> "" + point.region_code = 输入.region_code + ENDOPTION + + OPTION 输入.point_code <> "" + (point.point_code like 输入.point_code or + point.point_code like 输入.point_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/rest/ProductInController.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/rest/ProductInController.java index f6d3d05e..96485908 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/rest/ProductInController.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/rest/ProductInController.java @@ -91,10 +91,18 @@ public class ProductInController { return new ResponseEntity<>(productInService.getDisDtl(whereJson), HttpStatus.OK); } + @PostMapping("/confirmvehicle") + @Log("组盘确认") + @ApiOperation("组盘确认") + public ResponseEntity confirmvehicle(@RequestBody JSONObject whereJson) { + productInService.confirmvehicle(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/divStruct") @Log("分配货位") @ApiOperation("分配货位") - public ResponseEntity divStruct(@RequestBody Map whereJson) { + public ResponseEntity divStruct(@RequestBody JSONObject whereJson) { productInService.divStruct(whereJson); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -102,7 +110,7 @@ public class ProductInController { @PostMapping("/unDivStruct") @Log("取消分配货位") @ApiOperation("取消分配货位") - public ResponseEntity unDivStruct(@RequestBody Map whereJson) { + public ResponseEntity unDivStruct(@RequestBody JSONObject whereJson) { productInService.unDivStruct(whereJson); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -134,7 +142,6 @@ public class ProductInController { @Log("查询箱内子卷") @ApiOperation("查询箱内子卷") public ResponseEntity queryBoxMater(@RequestBody JSONArray whereJson) { - return new ResponseEntity<>(productInService.queryBoxMater(whereJson), HttpStatus.OK); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/ProductInService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/ProductInService.java index 13f89688..64ceb267 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/ProductInService.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/ProductInService.java @@ -50,9 +50,17 @@ public interface ProductInService { */ JSONArray getIODtl(JSONObject whereJson); - void divStruct(Map whereJson); + /** + * 分配货位 + * @param whereJson / + */ + void divStruct(JSONObject whereJson); - void unDivStruct(Map whereJson); + /** + * 取消分配 + * @param whereJson / + */ + void unDivStruct(JSONObject whereJson); void divPoint(Map whereJson); @@ -79,6 +87,11 @@ public interface ProductInService { JSONArray queryTask(Map whereJson); + /** + * 自动分配 + * @param whereJson / + * @return JSONObject + */ JSONObject autoDis(JSONObject whereJson); JSONObject autoDisMove(JSONObject whereJson); @@ -88,4 +101,10 @@ public interface ProductInService { * @return JSONArray */ JSONArray queryStor(); + + /** + * 组盘确认 + * @param whereJson / + */ + void confirmvehicle(JSONObject whereJson); } diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/StorPublicService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/StorPublicService.java new file mode 100644 index 00000000..ce04202d --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/StorPublicService.java @@ -0,0 +1,47 @@ +package org.nl.wms.st.in.service; + +import com.alibaba.fastjson.JSONObject; + +public interface StorPublicService { + /** + * 出入库仓位库存修改 + * @param from 仓位库存变动信息 + * { + * struct_id ,仓位标识 + * material_id ,物料标识 + * quality_scode ,品质类型 + * pcsn ,批次 + * ivt_level ,库存等级 + * is_active ,是否可用 + * change_qty ,变动数(必填,大于0) + * bill_type_scode ,单据类型 + * inv_id,单据标识 + * bill_code ,单据编号 + * bill_table ,单据表名(非必填) + * qty_unit_id ,单位标识 + * qty_unit_name ,单位名称 + * } + * @param change_type_scode (变动类型:11-扣减可用; 12-增加可用;21-减库存; 22-加库存; 23-同时加; 24-同时减;25-同时减(配粉出库)31-加待入; 32-减待入;33-减待入加库存加可用;99-其它) + */ + void IOStor(JSONObject from, String change_type_scode); + + /** + * 出入库仓位点位更新 + * @param from 仓位点位变动信息 + * { + * struct_id ,仓位id + * point_code ,点位编码 + * lock_type ,锁定类型 + * storagevehicle_code ,载具编码 + * is_free,是否清除载具(1是,0或缺省为否) + * taskdtl_type锁定任务类型 + * taskdtl_id锁定任务明细标识 + * task_code锁定任务编码 + * inv_type锁定单据类型 + * inv_id锁定单据标识 + * inv_code锁定单据编码 + * } + */ + void updateStructAndPoint(JSONObject from); + void updateStructAndPoint2(JSONObject from); +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/ProductInServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/ProductInServiceImpl.java index e26979fd..e236e0c3 100644 --- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/ProductInServiceImpl.java +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/ProductInServiceImpl.java @@ -16,7 +16,9 @@ import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.WqlUtil; +import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.wms.basedata.st.service.StorattrService; import org.nl.wms.basedata.st.service.StructattrService; import org.nl.wms.basedata.st.service.dto.StorattrDto; @@ -24,6 +26,7 @@ import org.nl.wms.basedata.st.service.dto.StructattrDto; import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.dto.PointDto; import org.nl.wms.st.in.service.ProductInService; +import org.nl.wms.st.in.service.StorPublicService; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +50,8 @@ public class ProductInServiceImpl implements ProductInService { private final PointService pointService; + private final StorPublicService storPublicService; + @Override public Map pageQuery(Map whereJson, Pageable page) { @@ -342,138 +347,108 @@ public class ProductInServiceImpl implements ProductInService { @Transactional(rollbackFor = Exception.class) @Override - public void divStruct(Map whereJson) { + public void divStruct(JSONObject whereJson) { + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - String sect_id = ""; - String sect_code = ""; - String sect_name = ""; - String struct_id = ""; - String struct_code = ""; - String struct_name = ""; - ArrayList rows = (ArrayList) whereJson.get("tableMater"); - JSONObject whereJson2 = JSONObject.parseObject(JSON.toJSONString(whereJson)); - HashMap map = rows.get(0); - Boolean auto_div = false; - if (whereJson2.containsKey("auto_div")) { - auto_div = whereJson2.getBoolean("auto_div"); - } - //判断该载具是否已经分配货位或者起点 - JSONArray now_dis_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "17").addParam("box_no", map.get("box_no")).process().getResultJSONArray(0); - if (now_dis_rows.size() > 0 && !auto_div) { - throw new BadRequestException("该木箱已经分配过货位,无法继续分配!"); - } + String region_code = ""; + String region_name = ""; + String point_id = ""; + String point_code = ""; + String point_name = ""; + String is_length = ""; - String point_code = map.get("point_code"); - if (StrUtil.isNotEmpty(point_code)) { - HashMap point_map = new HashMap<>(); - PointDto pointDto = pointService.findByCode(point_code); - point_map.put("point_code", pointDto.getPoint_code()); - point_map.put("point_id", pointDto.getPoint_id() + ""); - point_map.put("point_name", pointDto.getPoint_name()); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(point_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'"); - } + JSONArray rows = whereJson.getJSONArray("tableMater"); + JSONObject map = rows.getJSONObject(0); + JSONObject jsonDtl = whereJson.getJSONObject("dtl_row"); - Boolean checked = whereJson2.getBoolean("checked"); - //是否分配货位 - if (ObjectUtil.isNotEmpty(checked) && checked) { - JSONObject jo_form = new JSONObject(); - jo_form.put("box_no", map.get("box_no")); - JSONObject struct_jo = new JSONObject(); - if (whereJson.containsKey("sect_id")) { - String need_sect = (String) whereJson.get("sect_id"); - JSONObject need_sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id = '" + need_sect + "'").uniqueResult(0); - //判断是否为主存区,主存区调用自动分配,虚拟区调用普通查询 - if (StrUtil.isNotEmpty(need_sect) && !need_sect_jo.getString("sect_type_attr").equals("00")) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("sect_id = '" + need_sect + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0); - } else { - jo_form.put("sect_id", whereJson.get("sect_id")); - struct_jo = this.autoDis(jo_form); - } - } else { - throw new BadRequestException("请选择需要分配的库区!"); - } - - - if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到适用仓位!"); - } - sect_id = struct_jo.getString("sect_id"); - sect_code = struct_jo.getString("sect_code"); - sect_name = struct_jo.getString("sect_name"); - struct_id = struct_jo.getString("struct_id"); - struct_code = struct_jo.getString("struct_code"); - struct_name = struct_jo.getString("struct_name"); - } else { - //更新入库分配表仓位相关字段 - sect_id = map.get("sect_id"); - sect_code = map.get("sect_code"); - sect_name = map.get("sect_name"); - struct_id = map.get("struct_id"); - struct_code = map.get("struct_code"); - struct_name = map.get("struct_name"); - } - HashMap dis_map = new HashMap(); - dis_map.put("sect_id", sect_id); - dis_map.put("sect_code", sect_code); - dis_map.put("sect_name", sect_name); - dis_map.put("struct_id", struct_id); - dis_map.put("struct_code", struct_code); - dis_map.put("struct_name", struct_name); - - //锁定货位 - JSONObject lock_map = new JSONObject(); - lock_map.put("end_point", struct_code); //查询主表信息 JSONObject mst = WQLObject.getWQLObject("st_ivt_iostorinv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); - lock_map.put("inv_type", mst.get("bill_type")); - lock_map.put("inv_id", mst.get("iostorinv_id")); - lock_map.put("inv_code", mst.get("bill_code")); -// inbillService.operatePoint("0", lock_map); - //判断起点是否不为空 - JSONObject ios_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").uniqueResult(0); - - JSONObject sect_jo = WQLObject.getWQLObject("st_ivt_sectattr").query("sect_id ='" + sect_id + "'").uniqueResult(0); - boolean is_virtual = false; - if (sect_jo.getString("sect_type_attr").equals("09")) { - is_virtual = true; - String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - dis_map.put("task_id", task_id); - dis_map.put("work_status", "01"); + JSONObject jsonDis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdis_id = '" + map.getString("iostorinvdis_id") + "'").uniqueResult(0); + // 校验是否已分配 + if (ObjectUtil.isNotEmpty(jsonDis.getString("struct_id"))) { + throw new BadRequestException("该明细已分配,无法继续分配!"); } - if (StrUtil.isNotEmpty(ios_dis.getString("point_id")) && !is_virtual) { -// Boolean transfer = whereJson2.getBoolean("transfer",false); - Boolean transfer = whereJson2.getBoolean("transfer"); - if (ObjectUtil.isEmpty(transfer)) { - transfer = false; + // 校验是否已组盘 + if (ObjectUtil.isEmpty(jsonDis.getString("storagevehicle_code"))) { + throw new BadRequestException("请先进行组盘"); + } + + Boolean checked = whereJson.getBoolean("checked"); + if (ObjectUtil.isNotEmpty(checked) && checked) { + // 自动分配 + JSONObject jsonParam = new JSONObject(); + JSONObject jsonPoint = new JSONObject(); + if (whereJson.containsKey("sect_id")) { + jsonParam.put("sect_id", whereJson.get("sect_id")); + jsonParam.put("stor_id", whereJson.get("stor_id")); + jsonParam.put("material_id", jsonDtl.getString("material_id")); + jsonPoint = this.autoDis(jsonParam); + is_length = jsonPoint.getString("is_length"); + } else { + throw new BadRequestException("请选择需要分配的区域!"); } - //创建任务并下发 -// InTask task = new InTask(); - JSONObject task_form = new JSONObject(); - task_form.put("task_type", "010501"); - task_form.put("start_device_code", map.get("point_code")); - task_form.put("next_device_code", struct_code); - task_form.put("vehicle_code", map.get("box_no")); - task_form.put("storagevehicle_type", map.get("storagevehicle_type")); -// String task_id = task.createTask(task_form); - // 下发 -// task.immediateNotifyAcs(task_id); - /* if (whereJson.containsKey("auto_issue")) { - }*/ -// dis_map.put("task_id", task_id); - dis_map.put("work_status", "01"); + if (ObjectUtil.isEmpty(jsonPoint)) { + throw new BadRequestException("未查询到适用点位!"); + } + + region_code = jsonPoint.getString("region_code"); + region_name = jsonPoint.getString("region_name"); + point_id = jsonPoint.getString("point_id"); + point_code = jsonPoint.getString("point_code"); + point_name = jsonPoint.getString("point_name"); + } else { + // 指定货位: 判断所选货位是否满足物料 + // 判断物料是否超长 + JSONObject jsonMater = materTab.query("material_id = '" + map.getString("material_id") + "'").uniqueResult(0); + + String length_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MATERIAL_LENGTH_UP").getValue(); + double material_length = jsonMater.getDoubleValue("length"); + double material_length_up = Double.valueOf(length_up); + + if (material_length > material_length_up) { + throw new BadRequestException("物料超长,请自动分配"); + } + + region_code = map.getString("region_code"); + region_name = map.getString("region_name"); + point_id = map.getString("struct_id"); + point_code = map.getString("struct_code"); + point_name = map.getString("struct_name"); } - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'"); + HashMap dis_map = new HashMap(); + dis_map.put("region_code", region_code); + dis_map.put("region_name", region_name); + dis_map.put("struct_id", point_id); + dis_map.put("struct_code", point_code); + dis_map.put("struct_name", point_name); - //修改库存 + //锁定货位 + JSONObject jsonPoint1 = pointTab.query("point_id = '" + point_id + "'").uniqueResult(0); + jsonPoint1.put("lock_type", "2"); + pointTab.update(jsonPoint1); + // 判断是否需要锁定两个货位 + if (is_length.equals("1")) { + JSONObject jsonPoint2 = pointTab.query("point_id = '" + jsonPoint1.getString("control_point") + "'").uniqueResult(0); + jsonPoint2.put("lock_type", "2"); + pointTab.update(jsonPoint2); + } + + // 更新分配明细 + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "iostorinv_id = '" + map.get("iostorinv_id") + "'"); + + /* + * 更新库存 + */ //直接取出入库分配表的库存 - JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND box_no = '" + map.get("box_no") + "'").getResultJSONArray(0); - JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); + JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").getResultJSONArray(0); for (int i = 0; i < dis_rows.size(); i++) { JSONObject dis_jo = dis_rows.getJSONObject(i); JSONObject i_form = new JSONObject(); @@ -481,95 +456,86 @@ public class ProductInServiceImpl implements ProductInService { i_form.put("material_id", dis_jo.getString("material_id")); i_form.put("pcsn", dis_jo.getString("pcsn")); i_form.put("change_qty", dis_jo.getString("plan_qty")); - i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("bill_type_scode", mst.getString("bill_type")); i_form.put("quality_scode", "01"); - i_form.put("inv_id", mst_jo.getString("iostorinv_id")); - i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("inv_id", mst.getString("iostorinv_id")); + i_form.put("bill_code", mst.getString("bill_code")); i_form.put("bill_table", "ST_IVT_IOStorInv"); i_form.put("qty_unit_id", dis_jo.getString("qty_unit_id")); i_form.put("qty_unit_name", dis_jo.getString("qty_unit_name")); -// storPublicService.IOStor(i_form, "31"); + storPublicService.IOStor(i_form, "31"); JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); - if (StrUtil.isNotEmpty(ios_dis.getString("point_id")) || is_virtual) { - if (dtl_jo.getDoubleValue("unassign_qty") == 0) { - //判断该明细下是否还存在未分配货位的分配明细 - JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null) AND (point_id = '' OR point_id is null)").getResultJSONArray(0); - if (disdiv_rows.size() == 0) { - dtl_jo.put("bill_status", "40"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); - //判断主表下的明细是否都为40 - JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '40'").getResultJSONArray(0); - if (dtl_rows.size() == 0) { - mst_jo.put("bill_status", "40"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } else { - mst_jo.put("bill_status", "30"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); - } + + if (dtl_jo.getDoubleValue("unassign_qty") == 0) { + //判断该明细下是否还存在未分配货位的分配明细 + JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null)").getResultJSONArray(0); + if (disdiv_rows.size() == 0) { + dtl_jo.put("bill_status", "30"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); + //判断主表下的明细是否都为40 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '30'").getResultJSONArray(0); + if (dtl_rows.size() == 0) { + mst.put("bill_status", "30"); + mst.put("dis_optid", currentUserId); + mst.put("dis_optname", nickName); + mst.put("dis_time", now); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst); + } else { + mst.put("bill_status", "20"); + mst.put("dis_optid", currentUserId); + mst.put("dis_optname", nickName); + mst.put("dis_time", now); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst); } } - } else { - dtl_jo.put("bill_status", "30"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); - mst_jo.put("bill_status", "30"); - mst_jo.put("dis_optid", currentUserId); - mst_jo.put("dis_optname", nickName); - mst_jo.put("dis_time", now); - WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); } } - //如果是虚拟区,直接更新完成分配任务 - if (is_virtual) { - JSONObject dis_form = new JSONObject(); - dis_form.put("task_id", dis_map.get("task_id")); -// inbillService.confirmDis(dis_form); - } } @Transactional(rollbackFor = Exception.class) @Override - public void unDivStruct(Map jo) { + public void unDivStruct(JSONObject jo) { WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); - WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); - ArrayList rows = (ArrayList) jo.get("tableMater"); - HashMap whereJson = rows.get(0); + JSONArray rows = jo.getJSONArray("tableMater"); + JSONObject whereJson = rows.getJSONObject(0); //解锁原货位点位 - HashMap unlock_map = new HashMap(); - unlock_map.put("lock_type", "1"); - unlock_map.put("taskdtl_type", ""); - unlock_map.put("taskdtl_id", ""); - unlock_map.put("task_code", ""); - unlock_map.put("inv_type", ""); - unlock_map.put("inv_id", ""); - unlock_map.put("inv_code", ""); - point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); - struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); + JSONObject jsonPoint1 = point_table.query("point_code = '" + whereJson.getString("struct_code") + "'").uniqueResult(0); + jsonPoint1.put("lock_type", "1"); + point_table.update(jsonPoint1); + + // 判断此物料是否超长 + JSONObject jsonMater = materTab.query("material_id = '" + whereJson.getString("material_id") + "'").uniqueResult(0); + + String length_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MATERIAL_LENGTH_UP").getValue(); + double material_length = jsonMater.getDoubleValue("length"); + double material_length_up = Double.valueOf(length_up); + + if (material_length > material_length_up) { + // 超长则解锁对应点位 + JSONObject jsonPoint2 = point_table.query("point_id = '" + jsonPoint1.getString("control_point") + "'").uniqueResult(0); + jsonPoint2.put("lock_type","1"); + point_table.update(jsonPoint2); + } //减去原货位的待入数 JSONArray dis_rows = dis_wql.query("struct_code = '" + whereJson.get("struct_code") + "' AND work_status < '99'").getResultJSONArray(0); if (dis_rows.size() <= 0) { throw new BadRequestException("数据参数有误!"); } - StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); for (int i = 0; i < dis_rows.size(); i++) { JSONObject i_form = new JSONObject(); JSONObject dis_row = dis_rows.getJSONObject(i); - i_form.put("struct_id", old_struct.getStruct_id()); + i_form.put("struct_id", dis_row.getString("struct_id")); i_form.put("material_id", dis_row.getString("material_id")); - i_form.put("quality_scode", dis_row.getString("quality_scode")); + i_form.put("quality_scode", "01"); i_form.put("pcsn", dis_row.getString("pcsn")); - i_form.put("ivt_level", dis_row.getString("ivt_level")); i_form.put("change_qty", dis_row.getString("plan_qty")); i_form.put("bill_type_scode", mst_jo.getString("bill_type")); i_form.put("inv_id", mst_jo.getString("iostorinv_id")); @@ -577,28 +543,23 @@ public class ProductInServiceImpl implements ProductInService { i_form.put("bill_table", "ST_IVT_IOStorInv"); i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); -// storPublicService.IOStor(i_form, "32"); - + storPublicService.IOStor(i_form, "32"); } //更新分配状态 HashMap map = new HashMap<>(); - map.put("point_id", ""); - map.put("sect_id", ""); - map.put("sect_code", ""); - map.put("sect_name", ""); + map.put("region_code", ""); + map.put("region_name", ""); map.put("struct_id", ""); map.put("struct_code", ""); map.put("struct_name", ""); map.put("work_status", "00"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "'"); //修改明细状态 - JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_rows.getJSONObject(0).getString("iostorinvdtl_id") + "'").uniqueResult(0); - HashMap dtl_map = new HashMap<>(); dtl_map.put("bill_status", "10"); - WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND box_no = '" + whereJson.get("box_no") + "'"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_map, "iostorinv_id = '" + mst_jo.get("iostorinv_id") + "'"); //更新主表状态 JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); @@ -692,288 +653,69 @@ public class ProductInServiceImpl implements ProductInService { public JSONObject autoDis(JSONObject whereJson) { /* * 分配逻辑: - * 1、先查找该木箱内属于什么物料、订单,定位到具体的块、排,查看是否存在空位 - * a、存在的话,优先放在这一块这一排中(遍历) - * b、不存在则根据该订单物料大概数量、选择数量相近的一个空巷道 - * 1)存在空巷道 - * 2)不存在,则找一个双通有空位置、数量相近的巷道 + * 1、如果物料超长则占用两个货位并把物料放在一层 (暂时用系统参数) + * 2、如果物料超重则尽量把物料放在一层(暂时用系统参数) * */ + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); // 物料表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONObject struct_jo = new JSONObject(); + String material_id = whereJson.getString("material_id"); + String region_code = whereJson.getString("sect_id"); + String product_area = whereJson.getString("stor_id"); - String box_no = whereJson.getString("box_no"); + JSONObject jsonMater = materTab.query("material_id = '" + material_id + "'").uniqueResult(0); - String sect_id = whereJson.getString("sect_id"); + // 判断物料是否超长 + String length_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MATERIAL_LENGTH_UP").getValue(); + double material_length = jsonMater.getDoubleValue("length"); + double material_length_up = Double.valueOf(length_up); - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0); + if (material_length > material_length_up) { + // 超长:找一层两个货位 + JSONArray pointArr = WQL.getWO("QST_IVT_DIS_01").addParam("flag", "1") + .addParam("region_code", region_code) + .addParam("product_area", product_area) + .process().getResultJSONArray(0); - String material_code = sub_jo.getString("product_name"); + for (int i = 0; i < pointArr.size(); i++) { + JSONObject json = pointArr.getJSONObject(i); + // 查询此点位对应的点位是否是无货未锁定状态 + JSONObject jsonControlPoint = pointTab.query("point_id = '" + json.getString("control_point") + + "' and is_delete = '0' and is_used = '1' and point_status = '1' and lock_type = '1'").uniqueResult(0); - String sale_order_name = sub_jo.getString("sale_order_name"); - - HashMap row_map = new HashMap<>(); - row_map.put("material_code", material_code); - row_map.put("sale_order_name", sale_order_name); - row_map.put("sect_id", sect_id); - row_map.put("flag", "11"); - //查询到当前可用的巷道 - JSONArray rowArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - - for (int i = 0; i < rowArr.size(); i++) { - JSONObject row_jo = rowArr.getJSONObject(i); - - String block_num = row_jo.getString("block_num"); - String row_num = row_jo.getString("row_num"); - String placement_type = row_jo.getString("placement_type"); - - // 判断此排是否有除:入库锁、移入锁以外的锁 - JSONArray isLock = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - if (ObjectUtil.isEmpty(isLock)) { - if (placement_type.equals("02")) { - // 左通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - break; - } else if (placement_type.equals("03")) { - // 右通 - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonControlPoint)) { + json.put("is_length", "1"); + struct_jo = json; break; } else { - // 双通 - - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox)) { - String out_order_seq = jsonDescBox.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct)) { - struct_jo = jsonDescStruct; - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox)) { - String out_order_seq2 = jsonAscBox.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "'AND placement_type = '" + placement_type + "' AND row_num = '" + row_num + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct)) { - struct_jo = jsonAscStruct; - break; - } else { - // 说明这排有任务在执行,新开一排 - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "13").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num2 = empty_row.getString("block_num"); - String row_num2 = empty_row.getString("row_num"); - String placement_type2 = empty_row.getString("placement_type"); - - if (placement_type.equals("02")) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - break; - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num2 + "' AND row_num = '" + row_num2 + "' AND placement_type = '" + placement_type2 + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - break; - } - } else { - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - break; - } - } - } else { - continue; - } - } - } - } - } + continue; } + } + } else { + // 未超长:判断是否超重 + String weight_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("MATERIAL_WEIGHT_UP").getValue(); + double material_weight = jsonMater.getDoubleValue("net_weight"); + double material_weight_up = Double.valueOf(weight_up); + + if (material_weight > material_weight_up) { + // 超重: 尽量放在一层 + struct_jo = WQL.getWO("QST_IVT_DIS_01").addParam("flag", "2") + .addParam("region_code", region_code) + .addParam("product_area", product_area) + .process().uniqueResult(0); } else { - continue; - } - } - - if (ObjectUtil.isEmpty(rowArr) || ObjectUtil.isEmpty(struct_jo)) { - //如果不存在相同订单物料的巷道 或者未找到相同物料订单号巷道中的货位 则 - - //根据分切计划查询该订单物料大概还有多少未入 - row_map.put("flag", "12"); - JSONArray plan_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(plan_rows)) { - plan_rows = new JSONArray(); - } - //查询该销售订单及行号有多少个生成状态的箱子 - row_map.put("flag", "27"); - JSONArray box_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0); - if (ObjectUtil.isEmpty(box_rows)) { - box_rows = new JSONArray(); - } - int box_num = (int) Math.ceil(plan_rows.size() / 2) + box_rows.size(); - - //查询数量与订单物料箱子数量相近的一排 - JSONObject empty_row = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "13").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num),block_num,row_num").process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(empty_row)) { - String block_num = empty_row.getString("block_num"); - String row_num = empty_row.getString("row_num"); - String placement_type = empty_row.getString("placement_type"); - - if (placement_type.equals("02")) { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "' AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq ASC").uniqueResult(0); - } else { - struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num + "' AND row_num = '" + row_num + "' AND placement_type = '" + placement_type + "'AND is_delete = '0' AND is_used = '1' AND lock_type = '1' order by out_order_seq DESC").uniqueResult(0); - } - } else { - - //如果查询不到空的一排,则查询有空位双通的一排 - JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("sect_id", sect_id).addParam("flag", "14").addParam("sql_str", " ORDER BY abs(" + box_num + "-a.struct_num)").process().getResultJSONArray(0); - for (int j = 0; j < haveArr.size(); j++) { - JSONObject have_row = haveArr.getJSONObject(j); - - String block_num3 = have_row.getString("block_num"); - String row_num3 = have_row.getString("row_num"); - - JSONArray isLock2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type not in ('1','2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1'").getResultJSONArray(0); - - if (ObjectUtil.isEmpty(isLock2)) { - // 先倒序找到第一个木箱、判断上一个是否有货位 - JSONObject jsonDescBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC").uniqueResult(0); - - JSONObject jsonDescStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonDescBox2)) { - String out_order_seq = jsonDescBox2.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } else { - // 先倒序找到第一个入库锁或者移库锁、判断上一个是否有货位 - JSONObject jsonDescEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDescEmpStruct)) { - String out_order_seq = jsonDescEmpStruct.getString("out_order_seq"); - jsonDescStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq > '" + out_order_seq + "' order by out_order_seq ASC").uniqueResult(0); - } - } - - if (ObjectUtil.isNotEmpty(jsonDescStruct2)) { - struct_jo = jsonDescStruct2; - break; - } else { - // 没有就正序找到第一个物料、判断上一个是否有货位 - JSONObject jsonAscBox2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC").uniqueResult(0); - - JSONObject jsonAscStruct2 = new JSONObject(); - if (ObjectUtil.isNotEmpty(jsonAscBox2)) { - String out_order_seq2 = jsonAscBox2.getString("out_order_seq"); - // 上一个货位顺序号 - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } else { - JSONObject jsonAscEmpStruct = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type in ('2','7') AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' order by out_order_seq ASC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonAscEmpStruct)) { - String out_order_seq2 = jsonAscEmpStruct.getString("out_order_seq"); - jsonAscStruct2 = WQLObject.getWQLObject("st_ivt_structattr").query("lock_type = '1' AND block_num = '" + block_num3 + "' AND row_num = '" + row_num3 + "' AND is_delete = '0' AND is_used = '1' AND IFNULL(storagevehicle_code,'') = '' and out_order_seq < '" + out_order_seq2 + "' order by out_order_seq DESC").uniqueResult(0); - } - - } - if (ObjectUtil.isNotEmpty(jsonAscStruct2)) { - struct_jo = jsonAscStruct2; - break; - } - } - } else { - continue; - } - } + // 未超重: 尽量放在三层 + struct_jo = WQL.getWO("QST_IVT_DIS_01").addParam("flag", "3") + .addParam("region_code", region_code) + .addParam("product_area", product_area) + .process().uniqueResult(0); } } if (ObjectUtil.isEmpty(struct_jo)) { - throw new BadRequestException("未查询到可用的仓位!"); + throw new BadRequestException("未找到可用点位!"); } return struct_jo; } @@ -1279,6 +1021,30 @@ public class ProductInServiceImpl implements ProductInService { return resultJSONArray; } + @Override + @Transactional(rollbackFor = Exception.class) + public void confirmvehicle(JSONObject whereJson) { + WQLObject vehicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); + + String storagevehicle_code = whereJson.getString("storagevehicle_code"); + + // 校验载具是否存在 + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + storagevehicle_code + "' and is_delete = '0' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVehicle)) throw new BadRequestException("载具不存在"); + + // 更新分配明细载具号 + JSONObject jsonDis = disTab.query("iostorinvdis_id = '" + whereJson.getString("iostorinvdis_id") + "'").uniqueResult(0); + // 校验此明细是否已经分配 + if (ObjectUtil.isNotEmpty(jsonDis.getString("struct_id"))) { + throw new BadRequestException("此明细已分配不可组盘!"); + } + jsonDis.put("storagevehicle_id", jsonVehicle.getString("storagevehicle_id")); + jsonDis.put("storagevehicle_code", jsonVehicle.getString("storagevehicle_code")); + disTab.update(jsonDis); + + } + public JSONObject queryEmpStruct(JSONObject whereJson) { JSONObject struct_jo = new JSONObject(); String sect_id = whereJson.getString("sect_id"); diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/StorPublicServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/StorPublicServiceImpl.java new file mode 100644 index 00000000..f1481400 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/in/service/impl/StorPublicServiceImpl.java @@ -0,0 +1,558 @@ +package org.nl.wms.st.in.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.utils.SecurityUtils; +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.st.in.service.StorPublicService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +/** + * PC端出入库新增 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class StorPublicServiceImpl implements StorPublicService { + + @Transactional(rollbackFor = Exception.class) + void createStor(JSONObject from) { + // 货位库存表 + WQLObject wql_StructIvt = WQLObject.getWQLObject("ST_IVT_StructIvt"); + // 查询货位信息 + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "1") + .addParam("id", from.getString("struct_id")) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("点位不存在或者未启用:" + from.getString("struct_id")); + } + // 查询物料信息 + JSONObject jo_WMSMaterial = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "2") + .addParam("material_id", from.getString("material_id")) + .process() + .uniqueResult(0); + if (ObjectUtil.isEmpty(jo_WMSMaterial)) { + throw new BadRequestException("物料不存在或者未启用:" + from.getString("material_id")); + } + from.put("stockrecord_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + from.put("struct_code", jo.getString("point_code")); + from.put("struct_name", jo.getString("point_name")); + from.put("product_area", jo.getString("product_area")); + from.put("instorage_time", DateUtil.now()); + wql_StructIvt.insert(from); + // 更新库存变动日志 + from.put("result_qty", from.getDoubleValue("ivt_qty")); + from.put("stor_code", jo.getString("stor_code")); +// this.createStructIvtFlow(from); + } + + @Transactional(rollbackFor = Exception.class) + void createStructIvtFlow(JSONObject from) { + // 仓位库存变动记录表 + WQLObject wql_StructIvtFlow = WQLObject.getWQLObject("ST_IVT_StructIvtFlow"); + // 库区物流日表 + WQLObject wql_IOSectDaily = WQLObject.getWQLObject("ST_IVT_IOStorDaily"); + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + from.put("change_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + from.put("change_time", DateUtil.now()); + from.put("change_person_id", currentUserId + ""); + from.put("change_person_name", nickName); + + String change_type_scode = from.getString("change_type_scode"); + String bill_code = from.getString("bill_code"); + + wql_StructIvtFlow.insert(from); + //拆拼盘不汇总到日表,库存变动记录还是要有记录 + if (bill_code.startsWith("YK") || bill_code.startsWith("CPP")) { + return; + } + if ("22,23,33,21,24,25,34".contains(change_type_scode)) { + String sect_date = DateUtil.today(); + // 出查询更新条件 + String sql_where = "stor_id = '" + from.getString("stor_id") + + "' and sect_date = '" + sect_date + + "' and material_id = '" + from.getString("material_id") + + "' and pcsn = '" + from.getString("pcsn") + + "' and quality_scode = '" + from.getString("quality_scode") + "'"; + JSONObject jo = wql_IOSectDaily.query(sql_where).uniqueResult(0); + if (jo == null) {// 新增 + String sql_where_before = "stor_id = '" + from.getString("stor_id") + + "' and material_id = '" + from.getString("material_id") + + "' and pcsn = '" + from.getString("pcsn") + + "' and quality_scode = '" + from.getString("quality_scode") + "'"; + JSONObject jo_before = wql_IOSectDaily.query(sql_where_before, "sect_date desc").uniqueResult(0); + if (jo_before == null) { + from.put("start_num", "0"); + } else { + from.put("start_num", jo_before.getDoubleValue("end_num")); + } + from.put("sect_date", sect_date); + if ("22,33".contains(change_type_scode)) { + from.put("in_num", from.getDoubleValue("change_qty")); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") + from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", "0"); + } else if ("21,25,34".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", from.getDoubleValue("change_qty")); + from.put("end_num", from.getDoubleValue("start_num") - from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", "0"); + } else if ("23".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") + from.getDoubleValue("change_qty")); + from.put("more_num", from.getDoubleValue("change_qty")); + from.put("less_num", "0"); + } else if ("24".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") - from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", from.getDoubleValue("change_qty")); + } + + from.put("stordaily_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + wql_IOSectDaily.insert(from); + } else {// 更新 + HashMap map = new HashMap(); + if ("22,33".contains(change_type_scode)) { + map.put("in_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("in_num")) + ""); + map.put("end_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("end_num")) + ""); + } else if ("21,25,34".contains(change_type_scode)) { + map.put("out_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("out_num")) + ""); + map.put("end_num", (jo.getDoubleValue("end_num") - from.getDoubleValue("change_qty")) + ""); + } else if ("24".contains(change_type_scode)) { + map.put("less_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("less_num")) + ""); + map.put("end_num", (jo.getDoubleValue("end_num") - from.getDoubleValue("change_qty")) + ""); + } else if ("23".contains(change_type_scode)) { + map.put("more_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("more_num")) + ""); + map.put("end_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("end_num")) + ""); + } + wql_IOSectDaily.update(map, sql_where); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void IOStor(JSONObject from, String change_type_scode) { + // 仓位库存表 + WQLObject wql = WQLObject.getWQLObject("ST_IVT_StructIvt"); + String struct_id_In = ""; + String material_id_In = ""; + String pcsn_In = ""; + String storagevehicle_code = from.getString("storagevehicle_code"); + String quality_scode_In = ""; + double change_qty = 0; + if (ObjectUtil.isEmpty(from)) { + throw new BadRequestException("输入from异常,请检查"); + } + if (StrUtil.isBlank(change_type_scode)) { + throw new BadRequestException("变动类型不能为空"); + } + from.put("change_type_scode", change_type_scode); + struct_id_In = from.getString("struct_id"); + if (StrUtil.isBlank(struct_id_In)) { + throw new BadRequestException("货位不能为空"); + } + material_id_In = from.getString("material_id"); + if (StrUtil.isBlank(material_id_In)) { + throw new BadRequestException("物料不能为空"); + } + pcsn_In = from.getString("pcsn"); + if (StrUtil.isBlank(pcsn_In)) { + throw new BadRequestException("物料批次不能为空"); + } + quality_scode_In = from.getString("quality_scode"); + if (StrUtil.isBlank(quality_scode_In)) { + throw new BadRequestException("品质类型不能为空"); + } + change_qty = from.getDoubleValue("change_qty"); + if (change_qty <= 0) { + throw new BadRequestException("变动数异常,请检查"); + } + /*"struct_id = '" + struct_id_In + + "' and material_id = '" + material_id_In + + "' and pcsn = '" + pcsn_In + + "' and quality_scode = '" + quality_scode_In + "'";*/ + // 查询条件 + StringBuffer sql_where = new StringBuffer("struct_id = '"); + sql_where.append(struct_id_In); + sql_where.append("' and material_id = '"); + sql_where.append(material_id_In); + sql_where.append("' and pcsn = '"); + sql_where.append(pcsn_In); + sql_where.append("' and quality_scode = '"); + sql_where.append(quality_scode_In); + sql_where.append("'"); + + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("struct_id", struct_id_In); + map.put("material_id", material_id_In); + map.put("pcsn", pcsn_In); + map.put("quality_scode", quality_scode_In); + if (StrUtil.equals(change_type_scode, "12")) { + if (ObjectUtil.isNotEmpty(storagevehicle_code)) map.put("storagevehicle_code",storagevehicle_code); + } + + // 获取仓位物料信息 +// JSONObject jo_in = wql.query(sql_where.toString()).uniqueResult(0); + JSONObject jo_in = WQL.getWO("QST_IVT_STORPUBLIC").addParamMap(map).process().uniqueResult(0); + switch (change_type_scode) { + case "11": //11加冻结、减可用:出库分配、移库移出 + if (jo_in != null) { + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + double canuse_qty = NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"), change_qty); + if (canuse_qty < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + jo_in.put("canuse_qty", canuse_qty); + jo_in.put("frozen_qty", jo_in.getDoubleValue("frozen_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "12": //12减冻结、加可用:出库分配取消、移库移出取消 + if (jo_in != null) { + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + jo_in.put("frozen_qty", NumberUtil.sub(jo_in.getDoubleValue("frozen_qty"), change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("frozen_qty") < 0) { + throw new BadRequestException("冻结数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "21": //21减冻结、减库存:出库确认、移库移出确认 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"), change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("frozen_qty", NumberUtil.sub(jo_in.getDoubleValue("frozen_qty"), change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("frozen_qty") < 0) { + throw new BadRequestException("冻结数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "22": //22加冻结、加库存:出库确认取消、移库移出确认取消 + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("frozen_qty", jo_in.getDoubleValue("frozen_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", "0"); + from.put("ivt_qty", change_qty); + from.put("frozen_qty", change_qty); + from.put("warehousing_qty", "0"); + this.createStor(from); + } + break; + case "23": //23同时加:质检(新)、损益单(溢)、损益单(损取消) + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", change_qty); + from.put("ivt_qty", change_qty); + from.put("frozen_qty", "0"); + from.put("warehousing_qty", "0"); + this.createStor(from); + } + break; + case "24": //24同时减:质检(旧)、损益单(溢取消)、损益单(损) + case "25": //25同时减:配粉出库确认 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"), change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"), change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "31": //31加待入:入库分配、移库移入 + if (jo_in != null) { + jo_in.put("warehousing_qty", jo_in.getDoubleValue("warehousing_qty") + change_qty); + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", "0"); + from.put("ivt_qty", "0"); + from.put("frozen_qty", "0"); + from.put("warehousing_qty", change_qty); + this.createStor(from); + } + break; + case "32": //32减待入:入库分配取消、移库移入取消 + if (jo_in != null) { + jo_in.put("warehousing_qty", NumberUtil.sub(jo_in.getDoubleValue("warehousing_qty"), change_qty)); + if (jo_in.getDoubleValue("warehousing_qty") < 0) { + throw new BadRequestException("待入数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "33": //33减待入、加库存、加可用:入库确认、移库移入确认 + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + jo_in.put("warehousing_qty", NumberUtil.sub(jo_in.getDoubleValue("warehousing_qty"), change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("warehousing_qty") < 0) { + throw new BadRequestException("待入数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "34": //34加待入、减库存、减可用:入库确认取消、移库移入确认取消 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"), change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"), change_qty)); + jo_in.put("warehousing_qty", jo_in.getDoubleValue("warehousing_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + default: + throw new BadRequestException("变动类型不存在:" + change_type_scode); + } + if (jo_in != null) { + if (jo_in.getDoubleValue("ivt_qty") == 0 && jo_in.getDoubleValue("canuse_qty") == 0 && jo_in.getDoubleValue("warehousing_qty") == 0) { + wql.delete(sql_where.toString()); + } + // 更新库存变动日志 + jo_in.put("result_qty", jo_in.getDoubleValue("ivt_qty")); + jo_in.put("change_type_scode", change_type_scode); + jo_in.put("bill_type_scode", from.getString("bill_type_scode")); + jo_in.put("inv_id", from.getString("inv_id")); + jo_in.put("bill_code", from.getString("bill_code")); + jo_in.put("bill_table", from.getString("bill_table")); + jo_in.put("change_qty", from.getString("change_qty")); + // 查询货位信息 + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "1") + .addParam("id", from.getString("struct_id")) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("仓位不存在或者未启用:" + from.getString("struct_id")); + } + jo_in.put("stor_code", jo.getString("stor_code")); + jo_in.put("stor_id", jo.getString("stor_id")); + jo_in.put("stor_name", jo.getString("stor_name")); +// this.createStructIvtFlow(jo_in); + } + } + + @Override + public void updateStructAndPoint(JSONObject from) { + //货位表 + WQLObject wo_Struct = WQLObject.getWQLObject("ST_IVT_StructAttr"); + //点位表 + WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); + //载具表 + WQLObject wo_Storage = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + String struct_id = from.getString("struct_id"); + String point_code = from.getString("point_code"); + //锁定类型 + String lock_type = from.getString("lock_type"); + //载具编码 + String storagevehicle_code = from.getString("storagevehicle_code"); + if (StrUtil.isEmpty(struct_id) && StrUtil.isEmpty(point_code)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + if (StrUtil.isEmpty(lock_type)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "3") + .addParam("id", struct_id) + .addParam("point_code", point_code) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("点位仓位更新未查询到符合条件的点位仓位!"); + } + HashMap map = new HashMap<>(); + if (lock_type.equals("1")) {//解锁 + map.put("lock_type", lock_type); + map.put("task_code", ""); + map.put("inv_type", ""); + map.put("inv_id", ""); + map.put("inv_code", ""); + map.put("point_status", "1"); + map.put("storagevehicle_code", ""); + map.put("vehicle_code", ""); + if (from.containsKey("is_free") && !from.getString("is_free").equals("1") && StrUtil.isNotEmpty(storagevehicle_code)) { + map.put("storagevehicle_code", storagevehicle_code); + map.put("storagevehicle_qty", "1"); + map.put("vehicle_code", storagevehicle_code); + map.put("point_status", "01"); + } + wo_Struct.update(map, "struct_id = '" + jo.getString("struct_id") + "'"); + wo_Point.update(map, "point_id = '" + jo.getString("point_id") + "'"); + } else {//锁定 + map.put("lock_type", lock_type); + map.put("taskdtl_type", from.getString("task_type")); + map.put("taskdtl_id", from.getString("task_id")); + map.put("task_code", from.getString("task_code")); + map.put("inv_type", from.getString("inv_type")); + map.put("inv_id", from.getString("inv_id")); + map.put("inv_code", from.getString("inv_code")); + if (StrUtil.isNotEmpty(storagevehicle_code)) { + map.put("storagevehicle_code", storagevehicle_code); + map.put("storagevehicle_qty", "1"); + map.put("vehicle_code", storagevehicle_code); + map.put("point_status", "01"); + } + } + wo_Struct.update(map, "struct_id = '" + jo.getString("struct_id") + "'"); + wo_Point.update(map, "point_id = '" + jo.getString("point_id") + "'"); + } + + @Override + public void updateStructAndPoint2(JSONObject from) { + //货位表 + WQLObject wo_Struct = WQLObject.getWQLObject("ST_IVT_StructAttr"); + //点位表 + WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); + //载具表 + WQLObject wo_Storage = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + String struct_id = from.getString("struct_id"); + String point_code = from.getString("point_code"); + //锁定类型 + String lock_type = from.getString("lock_type"); + //载具编码 + String storagevehicle_code = from.getString("storagevehicle_code"); + if (StrUtil.isEmpty(struct_id) && StrUtil.isEmpty(point_code)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + if (StrUtil.isEmpty(lock_type)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "3") + .addParam("id", struct_id) + .addParam("point_code", point_code) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("点位仓位更新未查询到符合条件的点位仓位!"); + } + HashMap map = new HashMap<>(); + if (lock_type.equals("1")) {//解锁 + map.put("lock_type", lock_type); + map.put("task_code", ""); + map.put("inv_type", ""); + map.put("inv_id", ""); + map.put("inv_code", ""); + map.put("point_status", "1"); + wo_Struct.update(map, "struct_id = '" + jo.getString("struct_id") + "'"); + wo_Point.update(map, "point_id = '" + jo.getString("point_id") + "'"); + } else {//锁定 + map.put("lock_type", lock_type); + map.put("taskdtl_type", from.getString("task_type")); + map.put("taskdtl_id", from.getString("task_id")); + map.put("task_code", from.getString("task_code")); + map.put("inv_type", from.getString("inv_type")); + map.put("inv_id", from.getString("inv_id")); + map.put("inv_code", from.getString("inv_code")); + if (StrUtil.isNotEmpty(storagevehicle_code)) { + map.put("storagevehicle_code", storagevehicle_code); + map.put("storagevehicle_qty", "1"); + map.put("vehicle_code", storagevehicle_code); + map.put("point_status", "01"); + } + } + wo_Struct.update(map, "struct_id = '" + jo.getString("struct_id") + "'"); + wo_Point.update(map, "point_id = '" + jo.getString("point_id") + "'"); + } + +} diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_DIS_01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_DIS_01.wql new file mode 100644 index 00000000..ca50944a --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_DIS_01.wql @@ -0,0 +1,127 @@ +[交易说明] + 交易名: 成品入库分配逻辑 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.product_area TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + *, + region.region_name + FROM + sch_base_point point + LEFT JOIN sch_base_region region ON point.region_code = region.region_code + WHERE + point.lock_type = '1' + AND point.point_status = '1' + AND point.is_delete = '0' + AND point.is_used = '1' + AND point.layer_num = '1' + AND IFNULL(point.control_point,'') <> '' + + OPTION 输入.product_area <> "" + point.product_area = 输入.product_area + ENDOPTION + + OPTION 输入.region_code <> "" + point.region_code = 输入.region_code + ENDOPTION + + order by point.point_code ASC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + *, + region.region_name + FROM + sch_base_point point + LEFT JOIN sch_base_region region ON point.region_code = region.region_code + WHERE + point.lock_type = '1' + AND point.point_status = '1' + AND point.is_delete = '0' + AND point.is_used = '1' + + OPTION 输入.product_area <> "" + point.product_area = 输入.product_area + ENDOPTION + + OPTION 输入.region_code <> "" + point.region_code = 输入.region_code + ENDOPTION + + order by point.layer_num ASC,point.point_code ASC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + *, + region_name + FROM + sch_base_point point + LEFT JOIN sch_base_region region ON point.region_code = region.region_code + WHERE + point.lock_type = '1' + AND point.point_status = '1' + AND point.is_delete = '0' + AND point.is_used = '1' + + OPTION 输入.product_area <> "" + point.product_area = 输入.product_area + ENDOPTION + + OPTION 输入.region_code <> "" + point.region_code = 输入.region_code + ENDOPTION + + order by point.layer_num DESC,point.point_code ASC + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_STORPUBLIC.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_STORPUBLIC.wql new file mode 100644 index 00000000..8d9636e0 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/QST_IVT_STORPUBLIC.wql @@ -0,0 +1,78 @@ +[交易说明] + 交易名: + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.struct_id TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.pcsn TYPEAS s_string + 输入.quality_scode TYPEAS s_string + 输入.storagevehicle_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + ivt.* + FROM + st_ivt_structivt ivt + LEFT JOIN sch_base_point point ON point.point_id = ivt.struct_id + WHERE + 1=1 + + OPTION 输入.struct_id <> "" + ivt.struct_id = 输入.struct_id + ENDOPTION + + OPTION 输入.material_id <> "" + ivt.material_id = 输入.material_id + ENDOPTION + + OPTION 输入.pcsn <> "" + ivt.pcsn = 输入.pcsn + ENDOPTION + + OPTION 输入.quality_scode <> "" + ivt.quality_scode = 输入.quality_scode + ENDOPTION + + OPTION 输入.storagevehicle_code <> "" + point.vehicle_code = 输入.storagevehicle_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/ST_PUB_QUERY_01.wql b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/ST_PUB_QUERY_01.wql new file mode 100644 index 00000000..a158b830 --- /dev/null +++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/st/wql/ST_PUB_QUERY_01.wql @@ -0,0 +1,118 @@ +[交易说明] + 交易名: 物料更新接口 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + //sql类型 + 输入.flag TYPEAS s_string + // + 输入.id TYPEAS s_string + // + 输入.material_id TYPEAS s_string + // + 输入.point_code TYPEAS s_string + // + 输入.ids TYPEAS f_string +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + struct.* + FROM + sch_base_point struct + WHERE + struct.is_delete = '0' + AND struct.is_used = '1' + + OPTION 输入.id <> "" + struct.point_id = 输入.id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + mater.material_id + FROM + md_me_materialbase mater + WHERE + mater.is_delete = '0' + AND mater.is_used = '1' + OPTION 输入.material_id <> "" + mater.material_id = 输入.material_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + struct.struct_id, + struct.struct_code, + point.point_code, + point.point_id, + struct.storagevehicle_code + FROM + SCH_BASE_Point point + left join ST_IVT_StructAttr struct on point.source_id=struct.struct_id + WHERE 1=1 + OPTION 输入.id <> "" + struct.struct_id = 输入.id + ENDOPTION + OPTION 输入.point_code <> "" + point.point_code = 输入.point_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + max(value) AS CODE, + max(label) AS NAME + FROM + sys_dict + WHERE + 1 = 1 + AND CODE LIKE '%INV_TYPE%' + + group by value + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/mes/qd/src/views/wms/pub/StructDialog.vue b/mes/qd/src/views/wms/pub/StructDialog.vue new file mode 100644 index 00000000..b68f3d8f --- /dev/null +++ b/mes/qd/src/views/wms/pub/StructDialog.vue @@ -0,0 +1,205 @@ + + + + diff --git a/mes/qd/src/views/wms/st/productIn/DivDialog.vue b/mes/qd/src/views/wms/st/productIn/DivDialog.vue index 89dec7ea..fee7259d 100644 --- a/mes/qd/src/views/wms/st/productIn/DivDialog.vue +++ b/mes/qd/src/views/wms/st/productIn/DivDialog.vue @@ -100,7 +100,7 @@ - + @@ -175,22 +176,20 @@ - - - +