This commit is contained in:
2022-11-04 14:56:12 +08:00
parent 204e5bde5f
commit 535e89a8e3
9 changed files with 1116 additions and 238 deletions

View File

@@ -81,7 +81,7 @@ public class LmsToMesServiceImpl implements LmsToMesService {
log.info("momRollBakeInBound接口输入参数为-------------------"+param.toString());
JSONObject result = new JSONObject();
String isConnect = "1";
String isConnect = "0";
if (StrUtil.equals("0", isConnect)) {
result.put("status", HttpStatus.OK.value());
result.put("message", "下发成功但未连接MES!");
@@ -127,7 +127,7 @@ public class LmsToMesServiceImpl implements LmsToMesService {
log.info("momRollBakeOutBound接口输入参数为-------------------"+param.toString());
JSONObject result = new JSONObject();
String isConnect = "1";
String isConnect = "0";
if (StrUtil.equals("0", isConnect)) {
result.put("status", HttpStatus.OK.value());
result.put("message", "下发成功但未连接MES!");
@@ -173,7 +173,7 @@ public class LmsToMesServiceImpl implements LmsToMesService {
log.info("momRollSemiFGInboundComplete接口输入参数为-------------------"+param.toString());
JSONObject result = new JSONObject();
String isConnect = "1";
String isConnect = "0";
if (StrUtil.equals("0", isConnect)) {
result.put("status", HttpStatus.OK.value());
result.put("message", "下发成功但未连接MES!");

View File

@@ -0,0 +1,140 @@
package org.nl.wms.sch.tasks;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.mes.service.impl.LmsToMesServiceImpl;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.service.TaskService;
import org.nl.wms.st.inbill.service.impl.InbillServiceImpl;
import org.nl.wms.st.inbill.service.impl.RawAssistIStorServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* Created by Lxy on 2021/12/22.
*/
public class OutTask extends AbstractAcsTask {
private final String THIS_CLASS = OutTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
/*
* 下发给ACS时需要特殊处理
*/
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(json.getString("point_code1"))
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
.priority(json.getString("priority"))
.remark(json.getString("remark"))
.build();
resultList.add(dto);
}
return resultList;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject taskObj, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
if (StrUtil.equals(status, "0")) {
// 取消删除任务
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
// 更新任务状态为执行中
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
}
}
@Override
public void findStartPoint() {
}
@Override
public void findNextPoint() {
}
@Override
@Transactional(rollbackFor = Exception.class)
public String createTask(JSONObject form) {
Long currentUserId = SecurityUtils.getCurrentUserId();
String currentUsername = SecurityUtils.getCurrentUsername();
JSONObject json = new JSONObject();
json.put("task_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
json.put("task_type", form.getString("task_type"));
json.put("vehicle_code", form.getString("vehicle_code"));
json.put("task_name", form.getString("task_name"));
json.put("point_code1", form.getString("point_code1"));
json.put("point_code2", form.getString("point_code2"));
json.put("material_id", form.getString("material_id"));
json.put("task_group_id", form.getString("task_group_id"));
json.put("sort_seq", form.getString("sort_seq"));
json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
json.put("handle_class", THIS_CLASS);
json.put("create_id", currentUserId);
json.put("create_name", currentUsername);
json.put("create_time", DateUtil.now());
json.put("priority", "1");
json.put("acs_task_type", "5");
WQLObject.getWQLObject("SCH_BASE_Task").insert(json);
return json.getString("task_id");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void forceFinish(String taskdtl_id) {
//任务表
WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject task = wo_Task.query("task_status<>'99' and taskdtl_id='" + taskdtl_id + "'").uniqueResult(0);
if (task == null) {
throw new BadRequestException("查询不到操作的任务记录!");
}
Map whereJson = new HashMap<String, String>();
whereJson.put("task_code", task.getString("task_code"));
RawAssistIStorServiceImpl inbillService = SpringContextHolder.getBean(RawAssistIStorServiceImpl.class);
inbillService.confirmTask(whereJson);
}
@Override
public void cancel(String taskdtl_id) {
}
}

View File

@@ -88,6 +88,11 @@ public interface CheckOutBillService {
* @param whereJson /
*/
void allDiv(JSONObject whereJson);
/**
* 对一条明细自动分配
* @param whereJson /
*/
void allDivOne(JSONObject whereJson);
/**
* 全部取消
* @param whereJson /

View File

@@ -82,6 +82,13 @@ public class CheckOutBillController {
checkOutBillService.allDiv(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/allDivOne")
@Log("出库单全部分2配")
@ApiOperation("出库单全部分配2")
public ResponseEntity<Object> allDivOne(@RequestBody JSONObject whereJson) {
checkOutBillService.allDivOne(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/allCancel")
@Log("出库单全部取消")
@ApiOperation("出库单全部取消")

View File

@@ -65,8 +65,8 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
public Map<String, Object> queryAddDtl(Map whereJson, Pageable page) {
HashMap<String, String> map = new HashMap<>(whereJson);
map.put("flag", "7");
map.put("begin_time", MapUtil.getStr(whereJson,"begin_time"));
map.put("end_time", MapUtil.getStr(whereJson,"end_time"));
map.put("begin_time", MapUtil.getStr(whereJson, "begin_time"));
map.put("end_time", MapUtil.getStr(whereJson, "end_time"));
if (StrUtil.isNotEmpty(map.get("material_code"))) {
map.put("material_code", "%" + map.get("material_code") + "%");
@@ -94,17 +94,17 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
}
String begin_time = map.get("begin_time");
if (StrUtil.isNotEmpty(begin_time)) {
map.put("begin_time", begin_time.substring(0,10));
map.put("begin_time", begin_time.substring(0, 10));
}
String end_time = map.get("end_time");
if (StrUtil.isNotEmpty(end_time)) {
map.put("end_time", end_time.substring(0,10));
map.put("end_time", end_time.substring(0, 10));
}
String source_bill_code = map.get("source_bill_code");
if (StrUtil.isNotEmpty(source_bill_code)) {
StringBuilder sb = new StringBuilder();
String[] strs = source_bill_code.split(",");
for(int i=0;i<strs.length;i++){
for (int i = 0; i < strs.length; i++) {
sb.append(",'" + strs[i] + "'");
}
String str = sb.toString();
@@ -179,6 +179,9 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
@Override
@Transactional(rollbackFor = Exception.class)
public void insertDtl(JSONObject map) {
WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");
//明细另一种写法
//JSONArray jsonArr = JSONArray.fromObject(whereJson.get("tableData"));
JSONArray rows = map.getJSONArray("tableData");
@@ -192,7 +195,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id ='" + MapUtil.getStr(map, "stor_id") + "'").uniqueResult(0);
map.put("iostorinv_id", iostorinv_id);
map.put("bill_code", bill_code);
map.put("biz_date", map.getString("biz_date").substring(0,10));
map.put("biz_date", map.getString("biz_date").substring(0, 10));
String bill_type = (String) map.get("bill_type");
map.put("buss_type", bill_type.substring(0, 4));
map.put("io_type", "1");
@@ -212,6 +215,8 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
map.put("sysdeptid", deptId);
map.put("syscompanyid", deptId);
double qty = 0.0; // 主表重量
int num = rows.size(); // 明细数
for (int i = 0; i < rows.size(); i++) {
JSONObject row = rows.getJSONObject(i);
JSONObject jsonDtl = new JSONObject();
@@ -230,7 +235,49 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
jsonDtl.put("assign_qty", "0");
jsonDtl.put("unassign_qty", row.get("plan_qty"));
WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl);
qty += jsonDtl.getDoubleValue("plan_qty");
// 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细
String pcsn = row.getString("pcsn");
if (ObjectUtil.isNotEmpty(pcsn)) {
JSONObject json = ivtTab.query("pcsn = '" + pcsn + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(json)) continue;
JSONObject jsonMap = new JSONObject();
jsonMap.put("flag", "1");
jsonMap.put("pcsn", pcsn);
jsonMap.put("struct_id", json.getString("struct_id"));
JSONArray ivtArr = WQL.getWO("ST_OUTIVT02").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int j = 0; j < ivtArr.size(); j++) {
JSONObject jsonIvt = ivtArr.getJSONObject(j);
JSONObject jsonDtl2 = new JSONObject();
jsonDtl2.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + "");
jsonDtl2.put("iostorinv_id", iostorinv_id);
jsonDtl2.put("seq_no", i + 2 + j);
jsonDtl2.put("material_id", jsonIvt.getString("material_id"));
jsonDtl2.put("pcsn", jsonIvt.getString("pcsn"));
jsonDtl2.put("box_no", jsonIvt.getString("box_no"));
jsonDtl2.put("quality_scode", "01");
jsonDtl2.put("bill_status", "10");
jsonDtl2.put("qty_unit_id", jsonIvt.get("qty_unit_id"));
jsonDtl2.put("qty_unit_name", jsonIvt.getString("qty_unit_name"));
jsonDtl2.put("plan_qty", jsonIvt.get("canuse_qty"));
jsonDtl2.put("remark", "通过明细创建");
jsonDtl2.put("assign_qty", "0");
jsonDtl2.put("unassign_qty", jsonIvt.get("canuse_qty"));
jsonDtl2.put("source_billdtl_id", jsonDtl.getString("iostorinvdtl_id"));
WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl2);
qty += jsonDtl2.getDoubleValue("plan_qty");
}
num += ivtArr.size();
}
}
map.put("total_qty", qty);
map.put("detail_count", num);
WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map);
}
@@ -356,97 +403,435 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
JSONObject dtl = dtls.getJSONObject(i);
double unassign_qty = dtl.getDoubleValue("unassign_qty");
double plan_qty = dtl.getDoubleValue("plan_qty");
//查询符合条件的库存
JSONArray ivts = WQL.getWO("QST_IVT_CHECKOUTBILL")
.addParam("flag", "3")
.addParam("material_id", dtl.getString("material_id"))
.addParam("quality_scode", dtl.getString("quality_scode"))
.addParam("pcsn", dtl.getString("pcsn"))
.addParam("iostorinv_id", whereJson.getString("iostorinv_id"))
.addParam("stor_id", whereJson.getString("stor_id"))
.addParam("sect_id", whereJson.getString("sect_id"))
.process()
.getResultJSONArray(0);
if (ivts.size() != 0) {
for (int j = 0; j < ivts.size(); j++) {
JSONObject ivt = ivts.getJSONObject(j);
double canuse_qty = ivt.getDoubleValue("canuse_qty");
if (unassign_qty >= canuse_qty) {
unassign_qty = unassign_qty - canuse_qty;
ivt.put("change_qty", canuse_qty + "");
} else {
ivt.put("change_qty", unassign_qty + "");
unassign_qty = 0;
}
//更新库存
ivt.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt.put("inv_id", dtl.getString("iostorinv_id"));
ivt.put("bill_code", jo_mst.getString("bill_code"));
ivt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", ivt.getString("sect_id"));
dtl.put("sect_code", ivt.getString("sect_code"));
dtl.put("sect_name", ivt.getString("sect_name"));
dtl.put("struct_id", ivt.getString("struct_id"));
dtl.put("struct_code", ivt.getString("struct_code"));
dtl.put("struct_name", ivt.getString("struct_name"));
dtl.put("pcsn", ivt.getString("pcsn"));
dtl.put("box_no", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", ivt.getDoubleValue("change_qty"));
dtl.put("real_qty", ivt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
//记录需锁定的仓位
Struct_map.put(ivt.getString("struct_id"), ivt);
if (unassign_qty == 0) {
break;
/*
* 分配规则:
* top1.有销售订单号:用销售订单号、物料去找这批物料最早入库的所在的巷道
* top2.没有销售订单号,有子卷号:固定出某个木箱
* top3.没有销售订单号,没有子卷号:找此物料最早入库的所在巷道
*/
boolean is_top3 = false;
if (ObjectUtil.isEmpty(dtl.getString("source_bill_code")) && ObjectUtil.isEmpty(dtl.getString("pcsn"))) {
is_top3 = true;
}
JSONObject jsonMap = new JSONObject();
if (ObjectUtil.isNotEmpty(dtl.getString("source_bill_code")) || is_top3) {
while (unassign_qty > 0) {
// 1.有销售订单号
jsonMap.put("flag", "1");
jsonMap.put("material_id", dtl.getString("material_id"));
jsonMap.put("sale_order_name", dtl.getString("source_bill_code"));
jsonMap.put("sect_id", whereJson.getString("sect_id"));
JSONObject jsonOneIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0);
if (ObjectUtil.isEmpty(jsonOneIvt)) throw new BadRequestException("库存不足");
// 查询这一巷道所有此物料此库存此销售订单的库存
jsonMap.put("flag", "2");
jsonMap.put("row_num", jsonOneIvt.getString("row_num"));
jsonMap.put("block_num", jsonOneIvt.getString("block_num"));
JSONArray ivtAllArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int j = 0; j < ivtAllArr.size(); j++) {
JSONObject ivt = ivtAllArr.getJSONObject(j);
double canuse_qty = ivt.getDoubleValue("canuse_qty");
if (unassign_qty >= canuse_qty) {
unassign_qty = unassign_qty - canuse_qty;
// ivt.put("change_qty", canuse_qty + "");
} else {
// ivt.put("change_qty", unassign_qty + "");
unassign_qty = 0;
}
// 查询此木箱下的所有子卷
jsonMap.put("flag", "3");
jsonMap.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
JSONArray ivtAllArr2 = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int k = 0; k < ivtAllArr2.size(); k++) {
// 更新库存
JSONObject ivt2 = ivtAllArr2.getJSONObject(k);
ivt2.put("change_qty", ivt2.getDoubleValue("canuse_qty"));
ivt2.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt2.put("inv_id", dtl.getString("iostorinv_id"));
ivt2.put("bill_code", jo_mst.getString("bill_code"));
ivt2.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt2, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", ivt2.getString("sect_id"));
dtl.put("sect_code", ivt2.getString("sect_code"));
dtl.put("sect_name", ivt2.getString("sect_name"));
dtl.put("struct_id", ivt2.getString("struct_id"));
dtl.put("struct_code", ivt2.getString("struct_code"));
dtl.put("struct_name", ivt2.getString("struct_name"));
dtl.put("pcsn", ivt2.getString("pcsn"));
dtl.put("box_no", ivt2.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", ivt2.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", ivt2.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", ivt2.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", ivt2.getDoubleValue("change_qty"));
dtl.put("real_qty", ivt2.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt2.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
}
//记录需锁定的仓位
Struct_map.put(ivt.getString("struct_id"), ivt);
// 为零结束
if (unassign_qty == 0) {
break;
}
}
}
HashMap<String, String> map_dtl = new HashMap<String, String>();
//更新明细
map_dtl.put("unassign_qty", unassign_qty + "");
map_dtl.put("assign_qty", (plan_qty - unassign_qty) + "");
if (unassign_qty == 0) {
map_dtl.put("bill_status", "40");
} else {
map_dtl.put("bill_status", "30");
}
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'");
//更新主表状态
this.updateMststatus(iostorinv_id);
//锁定起点点位、仓位
Collection<JSONObject> c = Struct_map.values();
Iterator<JSONObject> it = c.iterator();
JSONObject from_start = new JSONObject();
from_start.put("lock_type", "2");
for (; it.hasNext(); ) {
JSONObject Struct = it.next();
from_start.put("struct_id", Struct.getString("struct_id"));
from_start.put("inv_type", jo_mst.getString("bill_type"));
from_start.put("inv_id", jo_mst.getString("iostorinv_id"));
from_start.put("inv_code", jo_mst.getString("bill_code"));
storPublicService.updateStructAndPoint(from_start);
}
} else {
//对一条明细分配时,需要提示错误
if (dtls.size() == 1) {
throw new BadRequestException("当前明细无可分配库存");
// 确定子卷: 根据子卷找到库存出掉
jsonMap.put("flag", "1");
jsonMap.put("material_id", dtl.getString("material_id"));
jsonMap.put("pcsn", dtl.getString("pcsn"));
JSONObject jsonIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0);
if (ObjectUtil.isEmpty(jsonIvt)) throw new BadRequestException("此物料批次库存不存在");
double canuse_qty = jsonIvt.getDoubleValue("canuse_qty");
jsonIvt.put("change_qty", canuse_qty + "");
unassign_qty = 0;
//更新库存
jsonIvt.put("bill_type_scode", jo_mst.getString("bill_type"));
jsonIvt.put("inv_id", dtl.getString("iostorinv_id"));
jsonIvt.put("bill_code", jo_mst.getString("bill_code"));
jsonIvt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(jsonIvt, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", jsonIvt.getString("sect_id"));
dtl.put("sect_code", jsonIvt.getString("sect_code"));
dtl.put("sect_name", jsonIvt.getString("sect_name"));
dtl.put("struct_id", jsonIvt.getString("struct_id"));
dtl.put("struct_code", jsonIvt.getString("struct_code"));
dtl.put("struct_name", jsonIvt.getString("struct_name"));
dtl.put("pcsn", jsonIvt.getString("pcsn"));
dtl.put("box_no", jsonIvt.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", jsonIvt.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", jsonIvt.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", jsonIvt.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", jsonIvt.getDoubleValue("change_qty"));
dtl.put("real_qty", jsonIvt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(jsonIvt.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
//记录需锁定的仓位 (如果此明细有相同物料的且子卷号不能为空的则在最后一个明细分配完成后锁定仓位)
JSONObject map = new JSONObject();
map.put("flag", "5");
map.put("material_id", dtl.getString("material_id"));
map.put("iostorinv_id", iostorinv_id);
map.put("iostorinvdtl_id", dtl.getString("iostorinvdtl_id"));
JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(map).process().getResultJSONArray(0);
if (dtlArr.size() == 0) {
Struct_map.put(jsonIvt.getString("struct_id"), jsonIvt);
}
}
HashMap<String, String> map_dtl = new HashMap<String, String>();
//更新明细
map_dtl.put("unassign_qty", unassign_qty + "");
map_dtl.put("assign_qty", (plan_qty - unassign_qty) + "");
if (unassign_qty == 0) {
map_dtl.put("bill_status", "40");
} else {
map_dtl.put("bill_status", "30");
}
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'");
//更新主表状态
this.updateMststatus(iostorinv_id);
//锁定起点点位、仓位
Collection<JSONObject> c = Struct_map.values();
Iterator<JSONObject> it = c.iterator();
JSONObject from_start = new JSONObject();
from_start.put("lock_type", "2");
for (; it.hasNext(); ) {
JSONObject Struct = it.next();
from_start.put("struct_id", Struct.getString("struct_id"));
from_start.put("inv_type", jo_mst.getString("bill_type"));
from_start.put("inv_id", jo_mst.getString("iostorinv_id"));
from_start.put("inv_code", jo_mst.getString("bill_code"));
storPublicService.updateStructAndPoint(from_start);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void allDivOne(JSONObject whereJson) {
//出库分配表
WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis");
//出库明细表
WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl");
//出库主表
WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv");
//定义需要更新的仓位集合
HashMap<String, JSONObject> Struct_map = new HashMap<String, JSONObject>();
String iostorinv_id = whereJson.getString("iostorinv_id");
//查询主表信息
JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jo_mst)) {
throw new BadRequestException("查不到出库单信息");
}
//查询生成和未分配完的明细
JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL")
.addParam("flag", "2")
.addParam("bill_status", "30")
.addParam("unassign_flag", "1")
.addParam("iostorinv_id", iostorinv_id)
.addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id"))
.process()
.getResultJSONArray(0);
if (ObjectUtil.isEmpty(dtls)) {
throw new BadRequestException("当前订单无可分配出库明细");
}
for (int i = 0; i < dtls.size(); i++) {
JSONObject dtl = dtls.getJSONObject(i);
double unassign_qty = dtl.getDoubleValue("unassign_qty");
double plan_qty = dtl.getDoubleValue("plan_qty");
/*
* 分配规则:
* top1.有销售订单号:用销售订单号、物料去找这批物料最早入库的所在的巷道
* top2.没有销售订单号,有子卷号:固定出某个木箱
* top3.没有销售订单号,没有子卷号:找此物料最早入库的所在巷道
*/
boolean is_top3 = false;
if (ObjectUtil.isEmpty(dtl.getString("source_bill_code")) && ObjectUtil.isEmpty(dtl.getString("pcsn"))) {
is_top3 = true;
}
JSONObject jsonMap = new JSONObject();
if (ObjectUtil.isNotEmpty(dtl.getString("source_bill_code")) || is_top3) {
while (unassign_qty > 0) {
// 1.有销售订单号
jsonMap.put("flag", "1");
jsonMap.put("material_id", dtl.getString("material_id"));
jsonMap.put("sale_order_name", dtl.getString("source_bill_code"));
jsonMap.put("sect_id", whereJson.getString("sect_id"));
JSONObject jsonOneIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0);
if (ObjectUtil.isEmpty(jsonOneIvt)) throw new BadRequestException("库存不足");
// 查询这一巷道所有此物料此库存此销售订单的库存
jsonMap.put("flag", "2");
jsonMap.put("row_num", jsonOneIvt.getString("row_num"));
jsonMap.put("block_num", jsonOneIvt.getString("block_num"));
JSONArray ivtAllArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int j = 0; j < ivtAllArr.size(); j++) {
JSONObject ivt = ivtAllArr.getJSONObject(j);
double canuse_qty = ivt.getDoubleValue("canuse_qty");
if (unassign_qty >= canuse_qty) {
unassign_qty = unassign_qty - canuse_qty;
// ivt.put("change_qty", canuse_qty + "");
} else {
// ivt.put("change_qty", unassign_qty + "");
unassign_qty = 0;
}
// 查询此木箱下的所有子卷
jsonMap.put("flag", "3");
jsonMap.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
JSONArray ivtAllArr2 = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int k = 0; k < ivtAllArr2.size(); k++) {
// 更新库存
JSONObject ivt2 = ivtAllArr2.getJSONObject(k);
ivt2.put("change_qty", ivt2.getDoubleValue("canuse_qty"));
ivt2.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt2.put("inv_id", dtl.getString("iostorinv_id"));
ivt2.put("bill_code", jo_mst.getString("bill_code"));
ivt2.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt2, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", ivt2.getString("sect_id"));
dtl.put("sect_code", ivt2.getString("sect_code"));
dtl.put("sect_name", ivt2.getString("sect_name"));
dtl.put("struct_id", ivt2.getString("struct_id"));
dtl.put("struct_code", ivt2.getString("struct_code"));
dtl.put("struct_name", ivt2.getString("struct_name"));
dtl.put("pcsn", ivt2.getString("pcsn"));
dtl.put("box_no", ivt2.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", ivt2.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", ivt2.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", ivt2.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", ivt2.getDoubleValue("change_qty"));
dtl.put("real_qty", ivt2.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt2.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
}
//记录需锁定的仓位
Struct_map.put(ivt.getString("struct_id"), ivt);
// 为零结束
if (unassign_qty == 0) {
break;
}
}
}
} else {
// 确定子卷: 根据子卷找到库存出掉
jsonMap.put("flag", "1");
jsonMap.put("material_id", dtl.getString("material_id"));
jsonMap.put("pcsn", dtl.getString("pcsn"));
JSONObject jsonIvt = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().uniqueResult(0);
if (ObjectUtil.isEmpty(jsonIvt)) throw new BadRequestException("此物料批次库存不存在");
double canuse_qty = jsonIvt.getDoubleValue("canuse_qty");
jsonIvt.put("change_qty", canuse_qty + "");
unassign_qty = 0;
//更新库存
jsonIvt.put("bill_type_scode", jo_mst.getString("bill_type"));
jsonIvt.put("inv_id", dtl.getString("iostorinv_id"));
jsonIvt.put("bill_code", jo_mst.getString("bill_code"));
jsonIvt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(jsonIvt, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", jsonIvt.getString("sect_id"));
dtl.put("sect_code", jsonIvt.getString("sect_code"));
dtl.put("sect_name", jsonIvt.getString("sect_name"));
dtl.put("struct_id", jsonIvt.getString("struct_id"));
dtl.put("struct_code", jsonIvt.getString("struct_code"));
dtl.put("struct_name", jsonIvt.getString("struct_name"));
dtl.put("pcsn", jsonIvt.getString("pcsn"));
dtl.put("box_no", jsonIvt.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", jsonIvt.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", jsonIvt.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", jsonIvt.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", jsonIvt.getDoubleValue("change_qty"));
dtl.put("real_qty", jsonIvt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(jsonIvt.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
//记录需锁定的仓位
Struct_map.put(jsonIvt.getString("struct_id"), jsonIvt);
}
HashMap<String, String> map_dtl = new HashMap<String, String>();
//更新明细
map_dtl.put("unassign_qty", unassign_qty + "");
map_dtl.put("assign_qty", (plan_qty - unassign_qty) + "");
if (unassign_qty == 0) {
map_dtl.put("bill_status", "40");
} else {
map_dtl.put("bill_status", "30");
}
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'");
// 判断是否还有相同物料相同仓位的明细
JSONObject map = new JSONObject();
map.put("flag", "4");
map.put("material_id", dtl.getString("material_id"));
map.put("iostorinv_id", iostorinv_id);
map.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id"));
JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(map).process().getResultJSONArray(0);
for (int h = 0; h < dtlArr.size(); h++) {
JSONObject json = dtlArr.getJSONObject(h);
JSONObject ivt = WQL.getWO("ST_OUTIVT01")
.addParam("flag", "1")
.addParam("material_id", json.getString("material_id"))
.addParam("pcsn", json.getString("pcsn"))
.process().uniqueResult(0);
//更新库存
ivt.put("change_qty", ivt.getDoubleValue("canuse_qty"));
ivt.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt.put("inv_id", json.getString("iostorinv_id"));
ivt.put("bill_code", jo_mst.getString("bill_code"));
ivt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt, "11");
//生成分配明细
json.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("sect_id", ivt.getString("sect_id"));
json.put("sect_code", ivt.getString("sect_code"));
json.put("sect_name", ivt.getString("sect_name"));
json.put("struct_id", ivt.getString("struct_id"));
json.put("struct_code", ivt.getString("struct_code"));
json.put("struct_name", ivt.getString("struct_name"));
json.put("pcsn", ivt.getString("pcsn"));
json.put("box_no", ivt.getString("storagevehicle_code"));
json.put("storagevehicle_id", ivt.getString("storagevehicle_id"));
json.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
json.put("storagevehicle_type", ivt.getString("storagevehicle_type"));
json.put("is_issued", "0");
json.put("plan_qty", ivt.getDoubleValue("change_qty"));
json.put("real_qty", ivt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt.getString("sect_code"), "XN01")) {
json.put("work_status", "01");
} else {
json.put("work_status", "00");
}
wo_dis.insert(json);
// 更新明细
HashMap<String, String> map_dtl2 = new HashMap<String, String>();
map_dtl2.put("unassign_qty", "0");
map_dtl2.put("assign_qty", ivt.getString("change_qty"));
map_dtl2.put("bill_status", "40");
wo_dtl.update(map_dtl2, "iostorinvdtl_id='" + json.getString("iostorinvdtl_id") + "'");
}
//更新主表状态
this.updateMststatus(iostorinv_id);
//锁定起点点位、仓位
Collection<JSONObject> c = Struct_map.values();
Iterator<JSONObject> it = c.iterator();
JSONObject from_start = new JSONObject();
from_start.put("lock_type", "2");
for (; it.hasNext(); ) {
JSONObject Struct = it.next();
from_start.put("struct_id", Struct.getString("struct_id"));
from_start.put("inv_type", jo_mst.getString("bill_type"));
from_start.put("inv_id", jo_mst.getString("iostorinv_id"));
from_start.put("inv_code", jo_mst.getString("bill_code"));
storPublicService.updateStructAndPoint(from_start);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void allCancel(JSONObject whereJson) {
@@ -507,6 +892,14 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
jo_dtl.put("assign_qty", jo_dtl.getDoubleValue("assign_qty") - plan_qty);
jo_dtl.put("unassign_qty", jo_dtl.getDoubleValue("unassign_qty") + plan_qty);
if (jo_dtl.getDoubleValue("assign_qty") < 0) {
jo_dtl.put("assign_qty", 0);
}
if (jo_dtl.getDoubleValue("unassign_qty") > jo_dtl.getDoubleValue("plan_qty")) {
jo_dtl.put("unassign_qty", jo_dtl.getDoubleValue("plan_qty"));
}
if (jo_dtl.getDoubleValue("unassign_qty") == jo_dtl.getDoubleValue("plan_qty")) {
jo_dtl.put("bill_status", "10");
} else {
@@ -568,23 +961,26 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv");
String struct_id = whereJson.getString("struct_id");
String point_code = whereJson.getString("point_code");
String point_code = whereJson.getString("point_code"); // 终点
String iostorinv_id = whereJson.getString("iostorinv_id");
Long currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String nowtime = DateUtil.now();
//查询主表信息
JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(jo_mst)) {
throw new BadRequestException("未查到相关出库单");
}
JSONObject point = wo_Point.query("lock_type='1' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + point_code + "'").uniqueResult(0);
//如果终点站点被锁定或者有载具号,则不允许设置点位
if (ObjectUtil.isEmpty(point)) {
throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!");
}
//查询未生成和生成未下发的分配记录
JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL")
// 查询未生成和生成未下发的分配记录
JSONObject dis = WQL.getWO("QST_IVT_CHECKOUTBILL")
.addParam("flag", "5")
.addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id"))
.addParam("struct_id", struct_id)
@@ -592,82 +988,52 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
.addParam("bill_status", "01")
.addParam("is_issued", "0")
.process()
.getResultJSONArray(0);
if (ObjectUtil.isEmpty(diss)) {
throw new BadRequestException("不存在可以设置站点的分配明细!");
.uniqueResult(0);
if (ObjectUtil.isEmpty(dis)) {
throw new BadRequestException("分配明细不存在或已执行、完成、");
}
for (int i = 0; i < diss.size(); i++) {
JSONObject dis = diss.getJSONObject(i);
JSONObject disnow = wo_dis.query("work_status='00' and iostorinvdis_id='" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0);
if (disnow == null) {
continue;
}
HashMap<String, String> map = new HashMap<String, String>();
String work_status = dis.getString("work_status");
String storagevehicle_code = dis.getString("storagevehicle_code");
String task_status = dis.getString("task_status");
String task_id = dis.getString("task_id");
if ("02,99".contains(work_status) || (StrUtil.isNotEmpty(task_status) && "02,03,99".contains(task_status))) {
throw new BadRequestException("该载具任务已执行,不可重新设置站点!");
}
JSONObject task = new JSONObject();
if (!task_id.equals("")) {//若任务不为空,则为变更出库目的站点
task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0);
//更新任务
task.put("next_point_code", point.getString("point_code"));
wo_Task.update(task);
//解锁原终点
JSONObject from_end = new JSONObject();
from_end.put("point_code", dis.getString("point_code"));
from_end.put("lock_type", "1");
storPublicService.updateStructAndPoint(from_end);
} else {//生成任务
task = new JSONObject();
task_id = IdUtil.getSnowflake(1, 1).nextId() + "";
String task_code = CodeUtil.getNewCode("TASK_CODE");
task.put("task_id", task_id);
task.put("task_code", task_code);
task.put("task_type", "02");
//根据可用数是否为0设置拣选还是全出
boolean flag = this.canuse_is_zero(dis.getString("struct_code"));
if (flag) {
task.put("task_type", "02");
}
task.put("task_status", "01");
task.put("point_code1", dis.getString("struct_code"));
task.put("point_code2", point.getString("point_code"));
// task.put("vehicle_code", dis.getString("storagevehicle_code"));
task.put("handle_class", CheckOutBillServiceImpl.class.getName());
task.put("finished_type", "");
task.put("is_delete", "0");
task.put("create_id", currentUserId);
task.put("create_name", nickName);
task.put("create_time", nowtime);
task.put("update_optid", currentUserId);
task.put("update_optname", nickName);
task.put("update_time", nowtime);
task.put("priority", "1");
wo_Task.insert(task);
}
//更新分配表状态、任务号
map.put("work_status", "01");
map.put("task_id", task_id);
map.put("point_id", point.getString("point_id"));
HashMap<String, String> map = new HashMap<String, String>();
String storagevehicle_code = dis.getString("storagevehicle_code");
String task_status = dis.getString("task_status");
String task_id = dis.getString("task_id");
if (StrUtil.isNotEmpty(task_status) && "05,06,07".contains(task_status)) {
throw new BadRequestException("该任务已执行,不可重新设置站点!");
}
if (ObjectUtil.isNotEmpty(task_id)) {
//若任务不为空,则为变更出库目的站点
JSONObject task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0);
//更新任务
task.put("point_code2", point.getString("point_code"));
wo_Task.update(task);
} else {
/*
* 生成任务:
* 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’
* a.如果有:有则只生成一条任务
* b.没有:则生成生成
* 2.判断此货位是否被挡住
* a.挡住:判断哪边的货位比较少 生成移库单
* b.没挡住:正常生成
*/
JSONObject jsonMap = new JSONObject();
jsonMap.put("flag", "2");
jsonMap.put("struct_id", dis.getString("struct_id"));
}
//更新分配表状态、任务号
map.put("work_status", "01");
map.put("task_id", task_id);
map.put("point_id", point.getString("point_id"));
// map.put("point_code", point.getString("point_code"));
// map.put("point_name", point.getString("point_name"));
wo_dis.update(map, "iostorinv_id='" + iostorinv_id + "' and storagevehicle_code='" + storagevehicle_code + "'");
//锁定点位仓位
/* JSONObject from_end = new JSONObject();
from_end.put("point_code", point.getString("point_code"));
from_end.put("lock_type", "01");
from_end.put("inv_type", jo_mst.getString("bill_type"));
from_end.put("inv_id", jo_mst.getString("iostorinv_id"));
from_end.put("inv_code", jo_mst.getString("bill_code"));
from_end.put("taskdtl_type", task.getString("task_type"));
from_end.put("taskdtl_id", task.getString("task_id"));
from_end.put("task_code", task.getString("task_code"));
storPublicService.updateStructAndPoint(from_end);*/
}
wo_dis.update(map, "iostorinv_id='" + iostorinv_id + "' and storagevehicle_code='" + storagevehicle_code + "'");
}
@Override
@@ -711,86 +1077,136 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
}
//查询生成和未分配完的明细
JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL")
JSONObject dtl = WQL.getWO("QST_IVT_CHECKOUTBILL")
.addParam("flag", "2")
.addParam("bill_status", "30")
.addParam("unassign_flag", "1")
.addParam("iostorinv_id", iostorinv_id)
.addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id"))
.process()
.getResultJSONArray(0);
if (ObjectUtil.isEmpty(dtls)) {
.uniqueResult(0);
if (ObjectUtil.isEmpty(dtl)) {
throw new BadRequestException("当前订单无可分配出库明细");
}
for (int i = 0; i < dtls.size(); i++) {
JSONObject dtl = dtls.getJSONObject(i);
double unassign_qty = dtl.getDoubleValue("unassign_qty");
double plan_qty = dtl.getDoubleValue("plan_qty");
if (rows.size() != 0) {
for (int j = 0; j < rows.size(); j++) {
JSONObject ivt = rows.getJSONObject(j);
double canuse_qty = ivt.getDoubleValue("plan_qty");
if (unassign_qty >= canuse_qty) {
unassign_qty = unassign_qty - canuse_qty;
ivt.put("change_qty", canuse_qty + "");
} else {
ivt.put("change_qty", unassign_qty + "");
unassign_qty = 0;
}
//更新库存
ivt.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt.put("inv_id", dtl.getString("iostorinv_id"));
ivt.put("bill_code", jo_mst.getString("bill_code"));
ivt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", ivt.getString("sect_id"));
dtl.put("sect_code", ivt.getString("sect_code"));
dtl.put("sect_name", ivt.getString("sect_name"));
dtl.put("struct_id", ivt.getString("struct_id"));
dtl.put("struct_code", ivt.getString("struct_code"));
dtl.put("struct_name", ivt.getString("struct_name"));
dtl.put("pcsn", ivt.getString("pcsn"));
dtl.put("box_no", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", ivt.getDoubleValue("change_qty"));
dtl.put("real_qty", ivt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
//记录需锁定的仓位
Struct_map.put(ivt.getString("struct_id"), ivt);
if (unassign_qty == 0) {
break;
}
}
HashMap<String, String> map_dtl = new HashMap<String, String>();
//更新明细
map_dtl.put("unassign_qty", unassign_qty + "");
map_dtl.put("assign_qty", (plan_qty - unassign_qty) + "");
if (unassign_qty == 0) {
map_dtl.put("bill_status", "40");
double unassign_qty = dtl.getDoubleValue("unassign_qty");
double plan_qty = dtl.getDoubleValue("plan_qty");
if (rows.size() != 0) {
for (int j = 0; j < rows.size(); j++) {
JSONObject ivt = rows.getJSONObject(j);
double canuse_qty = ivt.getDoubleValue("plan_qty");
if (unassign_qty >= canuse_qty) {
unassign_qty = unassign_qty - canuse_qty;
ivt.put("change_qty", canuse_qty + "");
} else {
map_dtl.put("bill_status", "30");
ivt.put("change_qty", unassign_qty + "");
unassign_qty = 0;
}
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'");
} else {
//对一条明细分配时,需要提示错误
if (dtls.size() == 1) {
throw new BadRequestException("当前明细无可分配库存");
//更新库存
ivt.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt.put("inv_id", dtl.getString("iostorinv_id"));
ivt.put("bill_code", jo_mst.getString("bill_code"));
ivt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt, "11");
//生成分配明细
dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
dtl.put("sect_id", ivt.getString("sect_id"));
dtl.put("sect_code", ivt.getString("sect_code"));
dtl.put("sect_name", ivt.getString("sect_name"));
dtl.put("struct_id", ivt.getString("struct_id"));
dtl.put("struct_code", ivt.getString("struct_code"));
dtl.put("struct_name", ivt.getString("struct_name"));
dtl.put("pcsn", ivt.getString("pcsn"));
dtl.put("box_no", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id"));
dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type"));
dtl.put("is_issued", "0");
dtl.put("plan_qty", ivt.getDoubleValue("change_qty"));
dtl.put("real_qty", ivt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt.getString("sect_code"), "XN01")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
wo_dis.insert(dtl);
//记录需锁定的仓位
Struct_map.put(ivt.getString("struct_id"), ivt);
if (unassign_qty == 0) {
break;
}
}
HashMap<String, String> map_dtl = new HashMap<String, String>();
//更新明细
map_dtl.put("unassign_qty", unassign_qty + "");
map_dtl.put("assign_qty", (plan_qty - unassign_qty) + "");
if (unassign_qty == 0) {
map_dtl.put("bill_status", "40");
} else {
map_dtl.put("bill_status", "30");
}
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'");
}
// 判断是否还有相同物料相同仓位的明细
JSONObject jsonMap = new JSONObject();
jsonMap.put("flag", "4");
jsonMap.put("material_id", dtl.getString("material_id"));
jsonMap.put("iostorinv_id", iostorinv_id);
jsonMap.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id"));
JSONArray dtlArr = WQL.getWO("ST_OUTIVT01").addParamMap(jsonMap).process().getResultJSONArray(0);
for (int i = 0; i < dtlArr.size(); i++) {
JSONObject json = dtlArr.getJSONObject(i);
JSONObject ivt = WQL.getWO("ST_OUTIVT01")
.addParam("flag", "1")
.addParam("material_id", json.getString("material_id"))
.addParam("pcsn", json.getString("pcsn"))
.process().uniqueResult(0);
//更新库存
ivt.put("change_qty", ivt.getDoubleValue("canuse_qty"));
ivt.put("bill_type_scode", jo_mst.getString("bill_type"));
ivt.put("inv_id", json.getString("iostorinv_id"));
ivt.put("bill_code", jo_mst.getString("bill_code"));
ivt.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(ivt, "11");
//生成分配明细
json.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("sect_id", ivt.getString("sect_id"));
json.put("sect_code", ivt.getString("sect_code"));
json.put("sect_name", ivt.getString("sect_name"));
json.put("struct_id", ivt.getString("struct_id"));
json.put("struct_code", ivt.getString("struct_code"));
json.put("struct_name", ivt.getString("struct_name"));
json.put("pcsn", ivt.getString("pcsn"));
json.put("box_no", ivt.getString("storagevehicle_code"));
json.put("storagevehicle_id", ivt.getString("storagevehicle_id"));
json.put("storagevehicle_code", ivt.getString("storagevehicle_code"));
json.put("storagevehicle_type", ivt.getString("storagevehicle_type"));
json.put("is_issued", "0");
json.put("plan_qty", ivt.getDoubleValue("change_qty"));
json.put("real_qty", ivt.getDoubleValue("change_qty"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
if (StrUtil.equals(ivt.getString("sect_code"), "XN01")) {
json.put("work_status", "01");
} else {
json.put("work_status", "00");
}
wo_dis.insert(json);
// 更新明细
HashMap<String, String> map_dtl = new HashMap<String, String>();
map_dtl.put("unassign_qty", "0");
map_dtl.put("assign_qty", ivt.getString("change_qty"));
map_dtl.put("bill_status", "40");
wo_dtl.update(map_dtl, "iostorinvdtl_id='" + json.getString("iostorinvdtl_id") + "'");
}
//更新主表状态
this.updateMststatus(iostorinv_id);
//锁定点位、仓位

View File

@@ -0,0 +1,217 @@
[交易说明]
交易名: 出库分配规则
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.material_id TYPEAS s_string
输入.sale_order_name TYPEAS s_string
输入.sect_id TYPEAS s_string
输入.row_num TYPEAS s_string
输入.block_num TYPEAS s_string
输入.storagevehicle_code TYPEAS s_string
输入.pcsn TYPEAS s_string
输入.iostorinv_id TYPEAS s_string
输入.iostorinvdtl_id TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
ivt.*,
attr.row_num,
attr.block_num,
attr.storagevehicle_code,
attr.storagevehicle_id,
attr.sect_id,
attr.sect_code,
attr.sect_name,
attr.struct_name,
attr.struct_code
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON attr.struct_id = ivt.struct_id
LEFT JOIN PDM_BI_SubPackageRelation sub ON attr.storagevehicle_code = sub.package_box_SN
WHERE
ivt.quality_scode = '01'
AND attr.lock_type = '1'
AND ivt.canuse_qty <> '0'
OPTION 输入.material_id <> ""
ivt.material_id = 输入.material_id
ENDOPTION
OPTION 输入.sale_order_name <> ""
sub.sale_order_name = 输入.sale_order_name
ENDOPTION
OPTION 输入.sect_id <> ""
attr.sect_id = 输入.sect_id
ENDOPTION
OPTION 输入.pcsn <> ""
ivt.pcsn = 输入.pcsn
ENDOPTION
order by ivt.instorage_time ASC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "2"
QUERY
SELECT
attr.storagevehicle_code,
attr.struct_id,
sum(ivt.canuse_qty) AS canuse_qty,
ivt.material_id
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON attr.struct_id = ivt.struct_id
LEFT JOIN PDM_BI_SubPackageRelation sub ON attr.storagevehicle_code = sub.package_box_SN
WHERE
ivt.quality_scode = '01'
AND attr.lock_type = '1'
AND ivt.canuse_qty <> '0'
OPTION 输入.material_id <> ""
ivt.material_id = 输入.material_id
ENDOPTION
OPTION 输入.sale_order_name <> ""
sub.sale_order_name = 输入.sale_order_name
ENDOPTION
OPTION 输入.sect_id <> ""
attr.sect_id = 输入.sect_id
ENDOPTION
OPTION 输入.row_num <> ""
attr.row_num = 输入.row_num
ENDOPTION
OPTION 输入.block_num <> ""
attr.block_num = 输入.block_num
ENDOPTION
group by attr.storagevehicle_code
order by ivt.instorage_time ASC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "3"
QUERY
SELECT
ivt.*,
attr.storagevehicle_code,
attr.storagevehicle_id,
attr.sect_id,
attr.sect_code,
attr.sect_name,
attr.struct_name,
attr.struct_code
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON attr.struct_id = ivt.struct_id
LEFT JOIN PDM_BI_SubPackageRelation sub ON attr.storagevehicle_code = sub.package_box_SN
WHERE
ivt.quality_scode = '01'
AND attr.lock_type = '1'
AND ivt.canuse_qty <> '0'
OPTION 输入.storagevehicle_code <> ""
attr.storagevehicle_code = 输入.storagevehicle_code
ENDOPTION
order by ivt.instorage_time ASC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "4"
QUERY
SELECT
dtl.*,
ivt.struct_id
FROM
ST_IVT_IOStorInvDtl dtl
INNER JOIN ST_IVT_StructIvt ivt ON dtl.pcsn = ivt.pcsn
WHERE
dtl.bill_status <= '30'
and dtl.iostorinvdtl_id <> 输入.iostorinvdtl_id
OPTION 输入.material_id <> ""
dtl.material_id = 输入.material_id
ENDOPTION
OPTION 输入.iostorinv_id <> ""
dtl.iostorinv_id = 输入.iostorinv_id
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "5"
QUERY
SELECT
dtl.*,
ivt.struct_id
FROM
ST_IVT_IOStorInvDtl dtl
INNER JOIN ST_IVT_StructIvt ivt ON dtl.pcsn = ivt.pcsn
WHERE
dtl.bill_status <'30'
and IFNULL(dtl.pcsn,"") <> ""
OPTION 输入.material_id <> ""
dtl.material_id = 输入.material_id
ENDOPTION
OPTION 输入.iostorinv_id <> ""
dtl.iostorinv_id = 输入.iostorinv_id
ENDOPTION
OPTION 输入.iostorinvdtl_id <> ""
dtl.iostorinvdtl_id <> 输入.iostorinvdtl_id
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -0,0 +1,86 @@
[交易说明]
交易名: 出库单
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.pcsn TYPEAS s_string
输入.struct_id TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
ivt.*,
attr.storagevehicle_code AS box_no,
mater.base_unit_id AS qty_unit_id,
unit.unit_name AS qty_unit_name
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON ivt.struct_id = attr.struct_id
LEFT JOIN md_me_materialbase mater ON ivt.material_id = mater.material_id
LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mater.base_unit_id
WHERE
ivt.pcsn <> 输入.pcsn
OPTION 输入.struct_id <> ""
ivt.struct_id = 输入.struct_id
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "2"
QUERY
SELECT
ivt.*,
attr.storagevehicle_code AS box_no,
mater.base_unit_id AS qty_unit_id,
unit.unit_name AS qty_unit_name
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON ivt.struct_id = attr.struct_id
LEFT JOIN md_me_materialbase mater ON ivt.material_id = mater.material_id
LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mater.base_unit_id
WHERE
ivt.pcsn <> 输入.pcsn
OPTION 输入.struct_id <> ""
ivt.struct_id = 输入.struct_id
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF