add:新增成品入库功能

This commit is contained in:
2023-03-29 19:54:48 +08:00
parent 584bd2587c
commit 391804f8bf
14 changed files with 1471 additions and 486 deletions

View File

@@ -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<Object> getPointQuery(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(regionService.getPointQuery(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增区域管理")
@ApiOperation("新增区域管理")

View File

@@ -82,4 +82,13 @@ public interface RegionService {
* @return JSONObject
*/
JSONObject getRegionSelect(JSONObject whereJson);
/**
* 查询数据分页
*
* @param whereJson 条件
* @param page 分页参数
* @return Map<String, Object>
*/
Map<String, Object> getPointQuery(Map whereJson, Pageable page);
}

View File

@@ -200,4 +200,20 @@ public class RegionServiceImpl implements RegionService {
return jo;
}
@Override
public Map<String, Object> 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;
}
}

View File

@@ -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
[临时表]
@@ -90,3 +91,33 @@
ENDSELECT
ENDQUERY
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

View File

@@ -91,10 +91,18 @@ public class ProductInController {
return new ResponseEntity<>(productInService.getDisDtl(whereJson), HttpStatus.OK);
}
@PostMapping("/confirmvehicle")
@Log("组盘确认")
@ApiOperation("组盘确认")
public ResponseEntity<Object> confirmvehicle(@RequestBody JSONObject whereJson) {
productInService.confirmvehicle(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/divStruct")
@Log("分配货位")
@ApiOperation("分配货位")
public ResponseEntity<Object> divStruct(@RequestBody Map whereJson) {
public ResponseEntity<Object> 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<Object> unDivStruct(@RequestBody Map whereJson) {
public ResponseEntity<Object> unDivStruct(@RequestBody JSONObject whereJson) {
productInService.unDivStruct(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -134,7 +142,6 @@ public class ProductInController {
@Log("查询箱内子卷")
@ApiOperation("查询箱内子卷")
public ResponseEntity<Object> queryBoxMater(@RequestBody JSONArray whereJson) {
return new ResponseEntity<>(productInService.queryBoxMater(whereJson), HttpStatus.OK);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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<String, Object> 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<HashMap> rows = (ArrayList<HashMap>) whereJson.get("tableMater");
JSONObject whereJson2 = JSONObject.parseObject(JSON.toJSONString(whereJson));
HashMap<String, String> 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<String, String> 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<String, String> 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<String, String> 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<HashMap> rows = (ArrayList<HashMap>) jo.get("tableMater");
HashMap<String, String> 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<String, String> 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<String, String> 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<String, String> 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");

View File

@@ -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<String, String> map = new HashMap<String, String>();
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<String, String> 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<String, String> 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") + "'");
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,205 @@
<template>
<el-dialog
title="货位选择"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
width="1000px"
@close="close"
@open="open"
>
<!-- 搜索 -->
<el-row>
<el-col :span="6">
<el-cascader
v-model="query.sect"
placeholder="所属库区"
:options="sects"
:props="{ checkStrictly: true }"
clearable
@change="sectQueryChange"
/>
</el-col>
<el-col :span="6">
<el-input
v-model="query.point_code"
clearable
style="width: 200px"
size="mini"
placeholder="输入点位编码、名称"
prefix-icon="el-icon-search"
class="filter-item"
/> </el-col>
<el-col :span="6">
<rrOperation />
</el-col>
</el-row>
<!--表格渲染-->
<el-table
ref="table"
v-loading="crud.loading"
:data="crud.data"
style="width: 100%;"
border
:header-cell-style="{background:'#f5f7fa',color:'#606266'}"
@select="handleSelectionChange"
@select-all="onSelectAll"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="point_code" label="点位编码" />
<el-table-column prop="point_name" label="点位名称" />
<el-table-column prop="region_name" label="区域名称" />
<el-table-column prop="product_area" label="生产区域" />
</el-table>
<!--分页组件-->
<pagination />
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</el-dialog>
</template>
<script>
import CRUD, { header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
import crudRegion from '@/api/wms/sch/region'
export default {
name: 'StructDialog',
components: { rrOperation, pagination },
cruds() {
return CRUD({
title: '点位',
optShow: {},
url: 'api/region/getPointQuery',
idField: 'region_code',
sort: 'region_code,desc',
query: { search: '', is_lock: '1', lock_type: '', sect_id: '', stor_id: '' },
crudMethod: { ...crudRegion }
})
},
mixins: [presenter(), header()],
props: {
dialogShow: {
type: Boolean,
default: false
},
sectProp: {
type: Object
},
storId: {
type: String,
default: null
}
},
data() {
return {
sects: [],
classes: [],
dialogVisible: false,
sect: {},
checkrow: {},
rows: [],
dialogDis: true,
lock: ''
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
},
sectProp: {
handler(newValue, oldValue) {
debugger
this.sect = newValue
}
}
},
methods: {
/**
* 接受父组件传值
* @param msg
*/
getMsg(msg) {
this.dialogDis = msg
this.lock = '1'
},
[CRUD.HOOK.beforeRefresh]() {
this.query.lock_type = this.lock
return true
},
open() {
crudRegion.getRegionSelect({ 'stor_id': this.storId }).then(res => {
this.sects = res.content
})
if (this.sect) {
this.query.sect = this.sect
if (this.sect.length === 1) {
this.query.stor_id = this.sect[0]
this.query.stor_id = this.storId
}
if (this.sect.length === 0) {
this.query.sect_id = ''
this.query.stor_id = ''
}
if (this.sect.length === 2) {
this.query.stor_id = this.sect[0]
this.query.sect_id = this.sect[1]
}
}
this.query.is_lock = '1'
this.query.lock_type = this.lock
this.query.is_used = '1'
debugger
this.query.stor_id = this.storId
this.crud.toQuery()
},
handleSelectionChange(val, row) {
if (val.length > 1) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(val.pop())
} else {
this.checkrow = row
}
},
sectQueryChange(val) {
if (val.length === 1) {
this.crud.query.stor_id = val[0]
this.crud.query.sect_id = ''
}
if (val.length === 0) {
this.crud.query.sect_id = ''
this.crud.query.stor_id = ''
}
if (val.length === 2) {
this.crud.query.stor_id = val[0]
this.crud.query.sect_id = val[1]
}
},
onSelectAll() {
this.$refs.table.clearSelection()
},
close() {
this.crud.resetQuery()
this.query.sect = null
this.$emit('update:dialogShow', false)
},
submit() {
this.rows = this.$refs.table.selection
if (this.rows.length <= 0) {
this.$message('请先勾选仓位')
return
}
this.$emit('update:dialogShow', false)
this.$emit('tableChanged', this.checkrow)
}
}
}
</script>

View File

@@ -100,7 +100,7 @@
<span class="crud-opts-right2">
<!--左侧插槽-->
<slot name="left"/>
<!-- <el-button
<el-button
slot="left"
class="filter-item"
type="primary"
@@ -109,7 +109,7 @@
@click="confirmvehicle()"
>
组盘确认
</el-button>-->
</el-button>
<el-button
slot="left"
:loading="divBtn"
@@ -152,6 +152,7 @@
max-height="300"
border
:header-cell-style="{background:'#f5f7fa',color:'#606266'}"
@row-click="clcikRowDis"
>
<el-table-column show-overflow-tooltip type="index" label="序号" align="center" />
<el-table-column show-overflow-tooltip prop="material_code" label="物料编码" align="center" />
@@ -175,22 +176,20 @@
</el-table>
</el-card>
<!-- <StructDiv ref="child" :stor-id="storId" :dialog-show.sync="structShow" :sect-prop="sectProp"-->
<!-- @tableChanged="tableChanged"/>-->
<StructDiv ref="child" :stor-id="storId" :dialog-show.sync="structShow" :sect-prop="sectProp" @tableChanged="tableChanged"/>
</el-dialog>
</template>
<script>
import CRUD, { crud } from '@crud/crud'
// import StructDiv from '@/views/wms/pub/StructDialog'
import StructDiv from '@/views/wms/pub/StructDialog'
import crudProductIn from '@/views/wms/st/productIn/productin'
import crudPoint from '@/api/wms/sch/point'
import crudRegion from '@/api/wms/sch/region'
export default {
name: 'DivDialog',
components: { },
components: { StructDiv },
mixins: [crud()],
dicts: ['IO_BILL_STATUS'],
props: {
@@ -229,12 +228,13 @@ export default {
bucketShow: false,
sects: [],
sect_val: null,
dis_row: null,
form: {
dtl_row: null,
bucketunique: '',
storage_qty: '',
sect_id: '',
stor_id: '',
point_code: null,
storagevehicle_code: '',
checked: true,
tableMater: []
},
@@ -282,6 +282,9 @@ export default {
this.form.tableMater = res
})
},
clcikRowDis(row, column, event) {
this.dis_row = row
},
vehicleCheck() {
if (!this.form.dtl_row) {
this.crud.notify('请选择一条入库明细', CRUD.NOTIFICATION_TYPE.INFO)
@@ -349,22 +352,15 @@ export default {
}
},
confirmvehicle() {
if (this.form.tableMater.length <= 0) {
this.crud.notify('至少添加一条载具明细', CRUD.NOTIFICATION_TYPE.INFO)
if (this.dis_row === null) {
this.crud.notify('请先选择一条分配明细', CRUD.NOTIFICATION_TYPE.INFO)
return
}
const carrier_no = this.form.tableMater[0].storagevehicle_code
const flag = this.form.tableMater.every(mater => mater.storagevehicle_code === carrier_no)
if (!flag) {
this.crud.notify('请选择唯一载具进行组盘!', CRUD.NOTIFICATION_TYPE.INFO)
if (this.dis_row.storagevehicle_code === '') {
this.crud.notify('载具号不能为空', CRUD.NOTIFICATION_TYPE.INFO)
return
}
const flag2 = this.form.tableMater.some(mater => mater.point_code !== this.form.point_code && mater.point_code)
if (flag2) {
this.crud.notify('请选择相同入库点!', CRUD.NOTIFICATION_TYPE.INFO)
return
}
crudProductIn.confirmvehicle(this.form).then(res => {
crudProductIn.confirmvehicle(this.dis_row).then(res => {
crudProductIn.getIODtl({ 'bill_code': this.form.dtl_row.bill_code }).then(res => {
this.openParam = res
})
@@ -411,14 +407,15 @@ export default {
}
},
tableChanged(row) {
this.form.sect_id = this.sect_id
this.form.stor_id = this.stor_id
// 新增一行物料时,给行进行赋值
for (let i = 0; i < this.form.tableMater.length; i++) {
this.form.tableMater[i].struct_code = row.struct_code
this.form.tableMater[i].sect_id = row.sect_id
this.form.tableMater[i].struct_id = row.struct_id
this.form.tableMater[i].struct_name = row.struct_name
this.form.tableMater[i].sect_code = row.sect_code
this.form.tableMater[i].sect_name = row.sect_name
this.form.tableMater[i].struct_id = row.point_id
this.form.tableMater[i].struct_code = row.point_code
this.form.tableMater[i].struct_name = row.point_name
this.form.tableMater[i].region_code = row.region_code
this.form.tableMater[i].region_name = row.region_name
this.form.tableMater.splice(i, 1, this.form.tableMater[i]) // 通过splice 替换数据 触发视图更新
}
crudProductIn.divStruct(this.form).then(res => {
@@ -429,7 +426,6 @@ export default {
})
},
bucketChange(row) {
debugger
this.bucketObj = row
this.form.bucketunique = row.bucketunique
this.form.storage_qty = row.storage_qty
@@ -455,8 +451,8 @@ export default {
})
},
divStruct() {
if (this.form.tableMater.length === 0) {
this.crud.notify('请先选择一条明细!', CRUD.NOTIFICATION_TYPE.INFO)
if (this.dis_row === null) {
this.crud.notify('请先选择一条分配明细!', CRUD.NOTIFICATION_TYPE.INFO)
return
}
// 如果勾选了,直接跳后台