This commit is contained in:
2024-05-06 14:27:03 +08:00
126 changed files with 5633 additions and 1068 deletions

View File

@@ -60,6 +60,7 @@ public class StructattrServiceImpl implements StructattrService {
map.put("lock_type", (String) whereJson.get("lock_type"));
map.put("layer_num", (String) whereJson.get("layer_num"));
map.put("is_used", (String) whereJson.get("is_used"));
map.put("is_have", (String) whereJson.get("is_have"));
//获取人员对应的仓库
UserStorServiceImpl userStorService = new UserStorServiceImpl();

View File

@@ -24,6 +24,7 @@
输入.have_vehicle TYPEAS s_string
输入.layer_num TYPEAS s_string
输入.in_stor_id TYPEAS f_string
输入.is_have TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
@@ -78,8 +79,11 @@
OPTION 输入.is_used <> ""
struct.is_used = 输入.is_used
ENDOPTION
OPTION 输入.lock_type = "1"
(struct.storagevehicle_code is null or struct.storagevehicle_code = '')
OPTION 输入.is_have = "1"
IFNULL(struct.storagevehicle_code, '') = ''
ENDOPTION
OPTION 输入.is_have = "2"
IFNULL(struct.storagevehicle_code, '') <> ''
ENDOPTION
ENDSELECT

View File

@@ -22,6 +22,7 @@ import org.nl.system.service.notice.ISysNoticeService;
import org.nl.system.service.notice.NoticeTypeEnum;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.ext.acs.service.AcsToWmsService;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.pda.mps.service.CasingService;
import org.nl.wms.pda.mps.service.ShippingService;
import org.nl.wms.pda.mps.service.impl.BakingServiceImpl;
@@ -33,6 +34,7 @@ import org.nl.wms.sch.tasks.PaperTrussTask;
import org.nl.wms.sch.tasks.SendOutTask;
import org.nl.wms.st.inbill.service.RawAssistIStorService;
import org.nl.wms.st.inbill.service.StorPublicService;
import org.nl.wms.st.instor.service.impl.HandMoveStorServiceImpl;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.http.HttpStatus;
@@ -42,8 +44,10 @@ import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -303,6 +307,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
b、没有则优先找空的巷道按空位置顺序分配
3、任务下发判断巷道的任务类型只能为空盘入库或者无任务类型
* */
// 判断是否需要扩容
isExpansion();
vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_KTP");
JSONArray emptyArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "21").process().getResultJSONArray(0);
@@ -1673,4 +1680,122 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
}
}
/**
* 判断是否需要扩容
*/
@Transactional
public void isExpansion() {
WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr");
WQLObject point = WQLObject.getWQLObject("sch_base_point");
// 查询空托盘中的空排还剩下多少
List<JSONObject> empList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "1")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
if (empList.size() >= 3) {
return;
}
// 进行扩容:找未锁定、空的一排主存区
String block_num = "";
String row_num = "";
// 是否需要移库
boolean is_move = false;
List<JSONObject> zcList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "2")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
if (ObjectUtil.isNotEmpty(zcList)) {
block_num = zcList.get(0).getString("block_num");
row_num = zcList.get(0).getString("row_num");
} else {
// 需要进行移库:找木箱数量较少的那一排移库
List<JSONObject> moveList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "3")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
if (ObjectUtil.isNotEmpty(moveList)) {
// 判断是否有锁
String block_num_in = moveList.stream()
.map(row -> row.getString("block_num"))
.collect(Collectors.joining("','"));
String row_num_in = moveList.stream()
.map(row -> row.getString("row_num"))
.collect(Collectors.joining("','"));
List<JSONObject> rowList = attr.query("block_num in ('" + block_num_in + "') AND row_num in ('" + row_num_in + "') and layer_num = '1' and sect_code = 'ZC01'")
.getResultJSONArray(0).toJavaList(JSONObject.class);
for (int i = 0; i < moveList.size(); i++) {
JSONObject json = moveList.get(i);
List<JSONObject> collect = rowList.stream()
.filter(row -> row.getString("block_num").equals(json.getString("block_num")) &&
row.getString("row_num").equals(json.getString("row_num"))
)
.collect(Collectors.toList());
// 判断是否全部都为未锁定
boolean isLock = collect.stream()
.allMatch(row -> row.getString("lock_type").equals("1"));
if (isLock) {
block_num = json.getString("block_num");
row_num = json.getString("row_num");
is_move = true;
break;
}
}
}
}
// 判断块、排是否为空
if (ObjectUtil.isEmpty(block_num) && ObjectUtil.isEmpty(row_num)) {
log.info("1层空托盘区扩容失败没有匹配到有空位的主存区");
return;
}
try {
// 判断是否需要移库
if (is_move) {
// 查询出这排需要移库的木箱 -- 默认右通(双通)
List<JSONObject> needMoveList = attr.query("sect_code = 'ZC01' and block_num = '" + block_num + "' and row_num = '" + row_num + "' and layer_num = '1' and IFNULL(storagevehicle_code,'') <> '' order by out_order_seq ASC")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 判断左通、右通
if (needMoveList.get(0).getString("placement_type").equals("02")) {
// 左通 -- 根据出库顺序进行排序
needMoveList = attr.query("sect_code = 'ZC01' and block_num = '" + block_num + "' and row_num = '" + row_num + "' and layer_num = '1' and IFNULL(storagevehicle_code,'') <> '' order by out_order_seq DESC")
.getResultJSONArray(0).toJavaList(JSONObject.class);
}
// 调用移库方法
JSONObject moveParam = new JSONObject();
moveParam.put("needMoveList", needMoveList);
moveParam.put("task_group_id", IdUtil.getSnowflake(1, 1).nextId());
HandMoveStorServiceImpl bean = SpringContextHolder.getBean(HandMoveStorServiceImpl.class);
bean.createMoveExpansion(moveParam);
}
} catch (Exception e) {
log.info("1层空托盘区扩容失败"+e.getMessage());
return;
}
// 更新仓位为空托盘区
JSONObject jsonParam = new JSONObject();
jsonParam.put("sect_id", RegionTypeEnum.KTP01.getId());
jsonParam.put("sect_code", "KTP01");
jsonParam.put("sect_name", RegionTypeEnum.KTP01.getName());
attr.update(jsonParam,"sect_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '1'");
// 更新点位为主存区域
jsonParam.put("region_id", RegionTypeEnum.KTP01.getId());
jsonParam.put("region_code", "KTP01");
jsonParam.put("region_name", RegionTypeEnum.KTP01.getName());
point.update(jsonParam,"region_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '1'");
}
}

View File

@@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
@@ -220,6 +221,44 @@ public class ProductInstorServiceImpl implements ProductInstorService {
throw new BadRequestException("无法入立体库,木箱超高;当前木箱高度为:" + box_high);
}
/*
* 判断木箱高度能入第几层:
* 判断仓位是否够用
* 1.低于650mm 三层都可以入
* 2.650mm > 木箱 <= 800mm, 只能入二、三层
* 3.第三层要根据实际高度分配货位
*/
String layer_num;
// 入库木箱下限
String in_download_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_download_box_high").getValue();
// 入库木箱上线
String in_up_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_up_box_high").getValue();
if (Double.parseDouble(in_download_box_high) < box_high && box_high <= Double.parseDouble(in_up_box_high)) {
// 只能入到 2/3层
layer_num = "('2','3')";
} else {
// 三层都可入
layer_num = "('1','2','3')";
}
// 查询对应的仓位个数
List<JSONObject> attrList = WQL.getWO("PDA_ST_01").addParam("flag", "10")
.addParam("layer_num", layer_num).process()
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 获取系统参数 - 最低仓位数
String download_attr_num = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("download_attr_num").getValue();
// 校验仓位数是否满足
JSONObject jsonAttr = attrList.stream()
.filter(row -> row.getDoubleValue("num") <= Double.parseDouble(download_attr_num))
.findFirst().orElse(null);
if (ObjectUtil.isNotEmpty(jsonAttr)) {
throw new BadRequestException(jsonAttr.getString("layer_num") + "层主存区仓位数不足" + download_attr_num +"个,不允许入库!");
}
JSONObject point_jo = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + point_code + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(point_jo)) {
throw new BadRequestException("未查询到对应的点位!");

View File

@@ -0,0 +1,83 @@
package org.nl.wms.pda.st.service.impl;
import cn.hutool.core.util.NumberUtil;
import org.nl.modules.common.exception.BadRequestException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
// 任务数据
List<Integer> arr = createArr();
// 1个线程分配10个数据
int ceil = (int) Math.ceil(NumberUtil.div(arr.size(), 10));
ExecutorService executorService = Executors.newFixedThreadPool(ceil);
for (int i = 0; i < ceil; i++) {
List<Integer> integers ;
// 分割集合
if (i + 1 == ceil) {
integers = arr.subList( i * 10, arr.size());
} else {
integers = arr.subList( i * 10, (i + 1) * 10);
}
// 提交任务
executorService.submit(new Task1(integers));
}
// 关闭线程 - 但不会立刻关闭
executorService.shutdown();
/* // 等待任务完成
boolean terminated = executorService.awaitTermination(2, TimeUnit.MINUTES);
if (!terminated) {
throw new BadRequestException("时间过长!");
}*/
}
private static List<Integer> createArr() {
List<Integer> objects = new ArrayList<>();
for (int i = 1; i <= 109; i++) {
objects.add(i);
}
return objects;
}
}
class Task1 implements Runnable {
List<Integer> b ;
public Task1(List<Integer> a) {
b = a;
}
@Override
public void run() {
for (int i = 0; i < b.size(); i++) {
Integer integer = b.get(i);
// 任务逻辑
System.out.println("我是任务==="+ integer +"==="+ Thread.currentThread().getName());
}
}
}

View File

@@ -19,6 +19,7 @@
输入.stor_id TYPEAS s_string
输入.sect_id TYPEAS s_string
输入.in_stor_id TYPEAS f_string
输入.layer_num TYPEAS f_string
@@ -248,6 +249,32 @@
order by update_time DESC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "10"
QUERY
SELECT
layer_num,
count(layer_num) AS num
FROM
st_ivt_structattr
WHERE
is_used = '1'
AND is_delete = '0'
AND lock_type = '1'
AND sect_code = 'ZC01'
AND IFNULL(storagevehicle_code,'') = ''
OPTION 输入.layer_num <> ""
layer_num IN 输入.layer_num
ENDOPTION
group by layer_num
order by num ASC
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -0,0 +1,107 @@
package org.nl.wms.sch.manage;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.utils.IdUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.system.service.notice.dao.SysNotice;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 自动查询立库每层的可用仓位
*/
@Slf4j
@Service
public class AutoQueryStructattrNum {
@Autowired
private RedissonClient redissonClient;
@Autowired
private ISysNoticeService iSysNoticeService;
@SneakyThrows
public void run() {
RLock lock = redissonClient.getLock(this.getClass().getName());
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock){
// 查询各个层的可用主存区空位情况
List<JSONObject> empList = WQL.getWO("AUTO002").addParam("flag", "1")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
// 查询各个层的可用主存区有货情况
List<JSONObject> haveList = WQL.getWO("AUTO002").addParam("flag", "2")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
// 获取系统参数
String download_attr_num = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("download_attr_num").getValue();
// 需要插入的集合
List<SysNotice> daoList = new ArrayList<>();
for (int i = 0; i < empList.size(); i++) {
JSONObject json = empList.get(i);
if (json.getDoubleValue("num") <= Double.parseDouble(download_attr_num)) {
// 已用仓位
double aDouble = haveList.stream()
.filter(row -> row.getString("layer_num").equals(json.getString("layer_num")))
.map(row -> row.getDoubleValue("num"))
.reduce(Double::sum).orElse(0.00);
// 计算主存区和
double add = NumberUtil.add(json.getDoubleValue("num"), aDouble);
// 空位占比
double emp_pro = NumberUtil.round(NumberUtil.div(json.getDoubleValue("num"), add) * 100, 2).doubleValue();
// 有货占比
double have_pro = NumberUtil.round(NumberUtil.div(aDouble, add) * 100, 2).doubleValue();
// 内容
String notice_title = "立库"+json.getString("layer_num")+ "层主存区仓位不足"+download_attr_num+"个!可用仓位:"
+json.getString("num")+ "个 占比:"+emp_pro+"% ,已用仓位:"+NumberUtil.round(aDouble, 0) +"个 占比:"+have_pro+"%";
SysNotice dao = SysNotice.builder()
.notice_id(IdUtil.getStringId())
.notice_title(notice_title)
.notice_content(notice_title)
.notice_type("2")
.have_read("1")
.deal_status("1")
.create_time(DateUtil.now())
.build();
daoList.add(dao);
}
}
// 插入
iSysNoticeService.saveBatch(daoList);
}
}finally {
if (tryLock) {
lock.unlock();
}
}
}
}

View File

@@ -0,0 +1,93 @@
[交易说明]
交易名: 查询仓库空位情况
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
layer_num,
count(struct_code) AS num
FROM
st_ivt_structattr
WHERE
is_delete = '0'
AND is_used = '1'
AND IFNULL(storagevehicle_code,'') = ''
AND lock_type = '1'
AND sect_code = 'ZC01'
group by layer_num
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "2"
QUERY
SELECT
layer_num,
count(struct_code) AS num
FROM
st_ivt_structattr
WHERE
is_delete = '0'
AND is_used = '1'
AND IFNULL(storagevehicle_code,'') <> ''
AND sect_code = 'ZC01'
group by layer_num
UNION
SELECT
layer_num,
count(struct_code) AS num
FROM
st_ivt_structattr
WHERE
is_delete = '0'
AND is_used = '1'
AND IFNULL(storagevehicle_code,'') = ''
AND lock_type <> '1'
AND sect_code = 'ZC01'
group by layer_num
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -118,6 +118,13 @@ public interface CheckOutBillService {
*/
void allDiv(JSONObject whereJson);
/**
* 全部分配,对同一出库单明细进行分配(多线程)
*
* @param whereJson /
*/
void allDiv2(JSONObject whereJson);
/**
* 对一条明细自动分配
*

View File

@@ -24,7 +24,9 @@ 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;
import org.nl.wms.basedata.st.service.dto.StructattrDto;
import org.nl.wms.basedata.st.service.impl.StructattrServiceImpl;
import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.service.PointService;
@@ -37,10 +39,12 @@ import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* PC端出入库新增
@@ -64,7 +68,6 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
private final RedissonClient redissonClient;
@Override
public Map<String, Object> pageQuery(Map whereJson, Pageable page) {
HashMap<String, String> map = new HashMap<>();
@@ -551,6 +554,18 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
//判断是否为主存区,主存区调用自动分配,虚拟区调用普通查询
if (StrUtil.isNotEmpty(need_sect) && !"00".equals(need_sect_jo.getString("sect_type_attr"))) {
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);
// 如果为空则扩容
if (ObjectUtil.isEmpty(struct_jo)) {
JSONObject jsonParam = new JSONObject();
jsonParam.put("sect_id", whereJson.get("sect_id"));
jsonParam.put("stor_id", whereJson.get("stor_id"));
jsonParam.put("num", 50);
StructattrServiceImpl bean = SpringContextHolder.getBean(StructattrServiceImpl.class);
bean.oneCreate(jsonParam);
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);
@@ -959,13 +974,13 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
/*
* 判断木箱高度能入第几层:
* 1.低于650mm 三层都可以入
* 1.低于650mm 优先入1层 没位置在入 2/3层
* 2.650mm > 木箱 <= 800mm, 只能入二、三层
* 3.第三层要根据实际高度分配货位
*/
// 入库木箱下限
String in_download_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_download_box_high").getValue();
// 入库木箱上线
// 入库木箱上
String in_up_box_high = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("in_up_box_high").getValue();
double box_high = sub_jo.getDoubleValue("box_high");
@@ -984,7 +999,37 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
row_map.put("in_layer_num", in_layer_num);
//查询到当前可用的巷道
JSONArray rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0);
JSONArray rowArr2 = new JSONArray();
if (box_high <= Double.parseDouble(in_download_box_high)) {
// 优先入1层
row_map.put("layer_num", "1");
rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0);
if (ObjectUtil.isEmpty(rowArr2)) {
// 如果1层没有相同物料订单号的则找有空位的一排
row_map.put("flag", "1111");
rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0);
// 如果为空则进行扩容
if (ObjectUtil.isEmpty(rowArr2)) {
boolean is_expansion = updateStructSectOne();
if (is_expansion) {
// 如果为true则在进行查询一次
rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0);
}
}
}
}
if (ObjectUtil.isEmpty(rowArr2)) {
row_map.put("layer_num", "");
row_map.put("flag", "111");
rowArr2 = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(row_map).process().getResultJSONArray(0);
}
JSONArray rowArr = new JSONArray();
for (int i = 0; i < rowArr2.size(); i++) {
JSONObject jo = rowArr2.getJSONObject(i);
@@ -1038,6 +1083,29 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
break;
} else {
// 双通
// 判断这一排全部是否是空位
List<JSONObject> attrList = WQLObject.getWQLObject("st_ivt_structattr")
.query("block_num = '" + block_num + "' and placement_type = '" + placement_type + "' and row_num = '" + row_num + "' and is_used = '1' and is_delete = '0' order by out_order_seq DESC")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 如果这排全部是空位 并且没有被锁定则返回一个货位
boolean is_all = attrList.stream()
.allMatch(row -> ObjectUtil.isEmpty(row.getString("storagevehicle_code"))
&& row.getString("lock_type").equals("1")
);
if (is_all) {
struct_jo = attrList.get(0);
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
break;
}
// 先倒序找到第一个木箱、判断上一个是否有货位
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);
@@ -1359,14 +1427,14 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
* */
JSONObject struct_jo = new JSONObject();
String box_no = whereJson.getString("box_no");
String sect_id = whereJson.getString("sect_id");
String col_num = whereJson.getString("layer_num"); // 转库时用
JSONObject struct_jo = new JSONObject();
JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0);
if (ObjectUtil.isEmpty(sub_jo)) {
throw new BadRequestException("子卷包装关系不存在或已出库,请检查!");
@@ -1728,7 +1796,390 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
}
if (ObjectUtil.isEmpty(struct_jo)) {
throw new BadRequestException("未查询到可用的仓位!");
// 主存区类型更改成中转区类型:找一排主存区的更改中转区、把一排中转区的更改成主存区(只允许调用一次)
SpringContextHolder.getBean(RawAssistIStorServiceImpl.class).updateStructSect(col_num);
struct_jo = autoDisMove2(whereJson);
}
return struct_jo;
}
public JSONObject autoDisMove2(JSONObject whereJson) {
/*
* 分配逻辑:
* 1、先查找该木箱内属于什么物料、订单定位到具体的块、排查看是否存在空位
* a、存在的话优先放在这一块这一排中(遍历)
* b、不存在则根据该订单物料大概数量、选择数量相近的一个空巷道
* 1存在空巷道
* 2不存在则找一个双通有空位置、数量相近的巷道
* */
String box_no = whereJson.getString("box_no");
String sect_id = whereJson.getString("sect_id");
String col_num = whereJson.getString("layer_num"); // 转库时用
JSONObject struct_jo = new JSONObject();
JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + box_no + "' AND status < 3").uniqueResult(0);
if (ObjectUtil.isEmpty(sub_jo)) {
throw new BadRequestException("子卷包装关系不存在或已出库,请检查!");
}
String material_code = sub_jo.getString("product_name");
String sale_order_name = sub_jo.getString("sale_order_name");
double box_high = sub_jo.getDoubleValue("box_high");
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("col_num", col_num);
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 ("02".equals(placement_type)) {
// 左通
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);
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
break;
} else if ("03".equals(placement_type)) {
// 右通
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 (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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("col_num", col_num).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 ("02".equals(placement_type)) {
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);
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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);
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
break;
}
} else {
//如果查询不到空的一排,则查询有空位双通的一排
JSONArray haveArr = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("col_num", col_num).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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
break;
}
}
} else {
continue;
}
}
}
}
}
}
} 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("col_num", col_num)
.addParam("sect_id", sect_id)
.addParam("box_height", String.valueOf(box_high))
.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 ("02".equals(placement_type)) {
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("col_num", col_num).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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
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;
// 判断是否是第三层 且高度是否超过仓位高度
if (StrUtil.equals(struct_jo.getString("layer_num"), "3")) {
if (box_high > struct_jo.getDoubleValue("height")) {
struct_jo = null;
continue;
}
}
break;
}
}
} else {
continue;
}
}
}
}
return struct_jo;
}
@@ -2115,4 +2566,157 @@ public class RawAssistIStorServiceImpl implements RawAssistIStorService {
map.put("bill_status", "99");
dtl_wql.update(map, "iostorinv_id = '" + mst_row.get("iostorinv_id") + "'");
}
/**
* 新开事务,把当前事务挂起,(新开事务不回滚)
*/
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateStructSect(String layer_num) {
WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr");
WQLObject point = WQLObject.getWQLObject("sch_base_point");
/*
* 1.将主存区的一排更改为中转区
* 2.将中转区的一排更改为主存区
*/
String block_num = "";
String row_num = "";
// 1.找主存区数量小的一排转为中转区
// 根据块、排进行分组,优先空排 -> 有货数量少的
List<JSONObject> attrListAllEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "1")
.addParam("layer_num", layer_num).process().getResultJSONArray(0)
.toJavaList(JSONObject.class);
if (ObjectUtil.isEmpty(attrListAllEmp)) {
// 如果为空则查找有空位的排
List<JSONObject> attrListEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "2")
.addParam("layer_num", layer_num).process().getResultJSONArray(0)
.toJavaList(JSONObject.class);
if (ObjectUtil.isEmpty(attrListEmp)) {
throw new BadRequestException("自动扩容失败,主存区没有空位可扩容!");
}
// 判断是这排是否被锁住
String block_num_in = attrListEmp.stream()
.map(row -> row.getString("block_num"))
.collect(Collectors.joining("','"));
String row_num_in = attrListEmp.stream()
.map(row -> row.getString("row_num"))
.collect(Collectors.joining("','"));
List<JSONObject> rowList = attr.query("block_num in ('" + block_num_in + "') AND row_num in ('" + row_num_in + "') and layer_num = '" + layer_num + "' and sect_code = 'ZC01'")
.getResultJSONArray(0).toJavaList(JSONObject.class);
for (int i = 0; i < attrListEmp.size(); i++) {
JSONObject json = attrListEmp.get(i);
List<JSONObject> collect = rowList.stream()
.filter(row -> row.getString("block_num").equals(json.getString("block_num")) &&
row.getString("row_num").equals(json.getString("row_num"))
)
.collect(Collectors.toList());
// 判断是否全部都为未锁定
boolean isLock = collect.stream()
.allMatch(row -> row.getString("lock_type").equals("1"));
if (!isLock) {
continue;
}
block_num = json.getString("block_num");
row_num = json.getString("row_num");
break;
}
} else {
JSONObject json = attrListAllEmp.get(0);
block_num = json.getString("block_num");
row_num = json.getString("row_num");
}
if (ObjectUtil.isEmpty(block_num) && ObjectUtil.isEmpty(row_num)) {
throw new BadRequestException(layer_num + "层没有仓位可分配为中转区!");
}
// 2.将中转区的一排更改为主存区
// 查询中转区满的一排
List<JSONObject> attrListAllNoEmp = WQL.getWO("ST_UPDATESTRUCTSECT_01").addParam("flag", "3")
.addParam("layer_num", layer_num).process().getResultJSONArray(0)
.toJavaList(JSONObject.class);
if (ObjectUtil.isNotEmpty(attrListAllNoEmp)) {
// 更新仓位为主存区
JSONObject jsonParam2 = new JSONObject();
jsonParam2.put("sect_id", RegionTypeEnum.ZC01.getId());
jsonParam2.put("sect_code", "ZC01");
jsonParam2.put("sect_name", RegionTypeEnum.ZC01.getName());
JSONObject json = attrListAllNoEmp.get(0);
// 更新仓位
attr.update(jsonParam2,"sect_code = 'ZZ01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '"+layer_num+"'");
// 更新点位
jsonParam2.put("region_id", RegionTypeEnum.ZC01.getId());
jsonParam2.put("region_code", "ZC01");
jsonParam2.put("region_name", RegionTypeEnum.ZC01.getName());
point.update(jsonParam2,"region_code = 'ZZ01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '"+layer_num+"'");
}
// 更新仓位为中转区
JSONObject jsonParam = new JSONObject();
jsonParam.put("sect_id", RegionTypeEnum.ZZ01.getId());
jsonParam.put("sect_code", "ZZ01");
jsonParam.put("sect_name", RegionTypeEnum.ZZ01.getName());
attr.update(jsonParam,"sect_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '"+layer_num+"'");
// 更新点位
jsonParam.put("region_id", RegionTypeEnum.ZZ01.getId());
jsonParam.put("region_code", "ZZ01");
jsonParam.put("region_name", RegionTypeEnum.ZZ01.getName());
point.update(jsonParam,"region_code = 'ZC01' AND block_num = '"+block_num+"' AND row_num = '"+row_num+"' AND layer_num = '"+layer_num+"'");
}
/**
* 1层主存区扩容空托盘区 ==> 主存区
*/
public boolean updateStructSectOne() {
WQLObject attr = WQLObject.getWQLObject("st_ivt_structattr");
WQLObject point = WQLObject.getWQLObject("sch_base_point");
/*
* 1.找空托盘区空的一排进行扩容
*
*/
// 找空托盘区空的一排
List<JSONObject> rowList = WQL.getWO("ST_UPDATESTRUCTSECTONE_01").addParam("flag", "1")
.process().getResultJSONArray(0).toJavaList(JSONObject.class);
// 如果没有空排或者空排低于2排则不允许扩容
if (ObjectUtil.isEmpty(rowList) || rowList.size() <= 2) {
log.info("空托盘区需预留2排空位不容许扩容");
return false;
}
try {
JSONObject json = rowList.get(0);
// 更新仓位为主存区
JSONObject jsonParam = new JSONObject();
jsonParam.put("sect_id", RegionTypeEnum.ZC01.getId());
jsonParam.put("sect_code", "ZC01");
jsonParam.put("sect_name", RegionTypeEnum.ZC01.getName());
attr.update(jsonParam,"sect_code = 'KTP01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '1'");
// 更新点位为主存区域
jsonParam.put("region_id", RegionTypeEnum.ZC01.getId());
jsonParam.put("region_code", "ZC01");
jsonParam.put("region_name", RegionTypeEnum.ZC01.getName());
point.update(jsonParam,"region_code = 'KTP01' AND block_num = '"+json.getString("block_num")+"' AND row_num = '"+json.getString("row_num")+"' AND layer_num = '1'");
} catch (Exception e) {
System.out.println("1层主存区扩容失败"+e.getMessage());
return false;
}
return true;
}
}

View File

@@ -484,6 +484,12 @@ public class StorPublicServiceImpl implements StorPublicService {
map.put("storagevehicle_code", storagevehicle_code);
}
if (ObjectUtil.isNotEmpty(from.getString("bill_type"))) {
if (from.getString("bill_type").equals("1011")){
map.put("storagevehicle_code", storagevehicle_code);
}
}
wo_Struct.update(map, "struct_id = '" + jo.getString("struct_id") + "'");
wo_Point.update(map, "point_id = '" + jo.getString("point_id") + "'");
} else {//锁定

View File

@@ -46,7 +46,7 @@
输入.sap_pcsn_in TYPEAS f_string
输入.vbeln_in TYPEAS f_string
输入.box_no_in TYPEAS f_string
输入.layer_num TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
@@ -474,12 +474,49 @@
LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt.material_id
WHERE
sa.sect_id = 输入.sect_id
AND IFNULL(sa.storagevehicle_code,"") = ''
AND sa.is_used = '1'
AND sa.is_delete = '0'
AND sa.lock_type = '1'
OPTION 输入.material_code <> ""
mb.material_code = 输入.material_code
ENDOPTION
OPTION 输入.sale_order_name <> ""
sub.sale_order_name = 输入.sale_order_name
ENDOPTION
OPTION 输入.layer_num <> ""
sa.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa.block_num,sa.row_num,sa.placement_type
ORDER BY
sa.placement_type desc,num
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "1111"
QUERY
SELECT
count(sa.struct_code) AS num,
sa.block_num,
sa.row_num,
sa.placement_type
FROM
st_ivt_structattr sa
WHERE
sa.sect_id = 输入.sect_id
and sa.is_used = '1'
and sa.is_delete = '0'
and ifnull(sa.storagevehicle_code,'') = ''
and sa.lock_type = '1'
OPTION 输入.layer_num <> ""
sa.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa.block_num,sa.row_num,sa.placement_type
ORDER BY

View File

@@ -0,0 +1,199 @@
[交易说明]
交易名: 更新仓位属性查询
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.sect_code = 'KTP01'
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'KTP01'
AND IFNULL( sa2.storagevehicle_code, '' ) = ''
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
AND a.struct_num = b.struct_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "2"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.layer_num = '1'
AND sa.sect_code = 'ZC01'
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'ZC01'
AND sa2.layer_num = '1'
AND IFNULL( sa2.storagevehicle_code, '' ) = ''
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
AND a.struct_num = b.struct_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "3"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.layer_num = '1'
AND sa.sect_code = 'ZC01'
AND IFNULL( sa.storagevehicle_code, '' ) = ''
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'ZC01'
AND sa2.layer_num = '1'
AND IFNULL( sa2.storagevehicle_code, '' ) <> ''
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -0,0 +1,218 @@
[交易说明]
交易名: 更新仓位属性查询
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.layer_num TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.sect_code = 'ZC01'
AND sa.placement_type = '01'
OPTION 输入.layer_num <> ""
sa.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'ZC01'
AND IFNULL( sa2.storagevehicle_code, '' ) = ''
AND sa2.placement_type = '01'
OPTION 输入.layer_num <> ""
sa2.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
AND a.struct_num = b.struct_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "2"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.lock_type = '1'
AND sa.sect_code = 'ZC01'
AND sa.placement_type = '01'
OPTION 输入.layer_num <> ""
sa.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'ZC01'
AND sa2.placement_type = '01'
AND IFNULL( sa2.storagevehicle_code, '' ) = ''
OPTION 输入.layer_num <> ""
sa2.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF
IF 输入.flag = "3"
QUERY
SELECT
*
FROM
(
SELECT
sa.block_num,
sa.row_num,
COUNT( sa.struct_code ) AS struct_num
FROM
st_ivt_structattr sa
WHERE
sa.is_delete = '0'
AND sa.is_used = '1'
AND sa.lock_type = '1'
AND sa.sect_code = 'ZZ01'
OPTION 输入.layer_num <> ""
sa.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa.block_num,
sa.row_num
) a
WHERE
EXISTS (
SELECT
*
FROM
(
SELECT
block_num,
row_num,
COUNT( sa2.struct_code ) AS struct_num
FROM
st_ivt_structattr sa2
WHERE
sa2.lock_type = '1'
AND sa2.is_used = '1'
AND sa2.is_delete = '0'
AND sa2.sect_code = 'ZZ01'
AND IFNULL( sa2.storagevehicle_code, '' ) <> ''
OPTION 输入.layer_num <> ""
sa2.layer_num = 输入.layer_num
ENDOPTION
GROUP BY
sa2.block_num,
sa2.row_num
) b
WHERE
b.block_num = a.block_num
AND b.row_num = a.row_num
AND a.struct_num = b.struct_num
) ORDER BY struct_num DESC
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -20,6 +20,7 @@ import org.nl.modules.wql.util.WqlUtil;
import org.nl.wms.basedata.st.service.impl.UserStorServiceImpl;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.OutTask;
import org.nl.wms.st.inbill.service.RawAssistIStorService;
import org.nl.wms.st.inbill.service.StorPublicService;
import org.nl.wms.st.instor.service.HandMoveStorService;
@@ -31,6 +32,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@@ -43,6 +45,8 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
private final StorPublicService storPublicService;
private final HandMoveStorAcsTask handMoveStorAcsTask;
private final EmpMoveTask empMoveTask;
private final OutTask outTask;
private final RawAssistIStorService rawAssistIStorService;
@Override
public Map<String, Object> pageQuery(Map whereJson, Pageable page) {
@@ -1401,7 +1405,8 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -1428,7 +1433,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -1454,7 +1459,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -1484,7 +1489,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -1515,7 +1520,7 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -1594,4 +1599,98 @@ public class HandMoveStorServiceImpl implements HandMoveStorService {
}
wo_mst.update(jo_mst);
}
/**
* 扩容移库
* @param whereJson /
*/
public void createMoveExpansion(JSONObject whereJson) {
//任务表
WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
JSONArray needMoveList = whereJson.getJSONArray("needMoveList");
for (int i = 0; i < needMoveList.size(); i++) {
JSONObject json = needMoveList.getJSONObject(i);
JSONObject jsonAttr = attrTab.query("struct_code = '" + json.getString("struct_code") + "'").uniqueResult(0);
JSONObject mapParam = new JSONObject();// 生成移库单传入参数
JSONArray table = new JSONArray(); // 明细参数
mapParam.put("bill_type", "22");
mapParam.put("buss_type", "22");
mapParam.put("bill_status", "10");
mapParam.put("biz_date", DateUtil.today());
mapParam.put("stor_code", "CP01");
mapParam.put("stor_id", "1582991156504039424");
mapParam.put("stor_name", "成品仓库");
mapParam.put("is_task", "1");
// 查询移入货位
JSONObject moveParam = new JSONObject();
moveParam.put("box_no", json.getString("storagevehicle_code"));
moveParam.put("sect_id", RegionTypeEnum.ZZ01.getId());
moveParam.put("layer_num", jsonAttr.getString("layer_num"));
JSONObject jsonMove = rawAssistIStorService.autoDisMove(moveParam);
// 查询移出货位的库存物料
JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03")
.addParam("flag", "6")
.addParam("struct_id", json.getString("struct_id"))
.process().uniqueResult(0);
// 移库单明细
JSONObject jsonMoveDtl = new JSONObject();
jsonMoveDtl.put("is_task", "2");
jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id"));
jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code"));
jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name"));
jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id"));
jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code"));
jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name"));
jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id"));
jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn"));
jsonMoveDtl.put("quality_scode", "01");
jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id"));
jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name"));
jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty"));
jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code"));
jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id"));
jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code"));
jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name"));
jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id"));
jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code"));
jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name"));
// 生成任务
JSONObject param2 = new JSONObject();
param2.put("task_type", "010503");
param2.put("vehicle_code", json.getString("storagevehicle_code"));
param2.put("point_code1", json.getString("struct_code"));
param2.put("point_code2", jsonMove.getString("struct_code"));
param2.put("task_group_id", whereJson.getLongValue("task_group_id")); // 任务组
param2.put("sort_seq", i + 1); // 任务组顺序号
String move_task_id = outTask.createTask(param2);
// 回显移库明细任务id
jsonMoveDtl.put("task_id", move_task_id);
table.add(jsonMoveDtl);
// 更新任务处理类
JSONObject jsonTaskMove = wo_Task.query("task_id = '" + move_task_id + "'").uniqueResult(0);
jsonTaskMove.put("task_type", "010505");
jsonTaskMove.put("handle_class", HandMoveStorAcsTask.class.getName());
jsonTaskMove.put("remark", "1层空托盘扩容移库");
wo_Task.update(jsonTaskMove);
mapParam.put("tableData", table);
// 调用移库单新增方法
if (ObjectUtil.isNotEmpty(needMoveList)) {
insertDtl2(mapParam);
}
handMoveStorAcsTask.immediateNotifyAcs(null);
}
}
}

View File

@@ -35,6 +35,7 @@ import org.nl.wms.st.inbill.service.StorPublicService;
import org.nl.wms.st.instor.service.HandMoveStorService;
import org.nl.wms.st.instor.service.impl.HandMoveStorServiceImpl;
import org.nl.wms.st.instor.task.HandMoveStorAcsTask;
import org.nl.wms.st.outbill.util.ThreadManage;
import org.nl.wms.st.returns.service.InAndOutReturnService;
import org.nl.wms.st.returns.service.impl.InAndOutRetrunServiceImpl;
import org.nl.wms.util.TranUtil;
@@ -397,6 +398,11 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
@Override
@Transactional(rollbackFor = Exception.class)
public String insertDtl(JSONObject map) {
if(MapUtil.getStr(map,"bill_type").equals("1011")) {
String iostorinv_id = inserdtlPic(map);
return iostorinv_id ;
}
WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");
//明细另一种写法
JSONArray array = map.getJSONArray("tableData");
@@ -554,6 +560,116 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
return iostorinv_id;
}
/**
* 拣选出库新增
* @param map 、
* @return 单据标识
*/
private String inserdtlPic(JSONObject map) {
WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");
//明细另一种写法
JSONArray rows = map.getJSONArray("tableData");
map.remove("tableData");
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String user = map.getString("user");
if (ObjectUtil.isNotEmpty(user)) {
if ("mes".equals(user)) {
currentUserId = "2";
nickName = "mes用户";
}
if ("sap".equals(user)) {
currentUserId = "3";
nickName = "sap用户";
}
}
String now = DateUtil.now();
String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + "";
String bill_code = CodeUtil.getNewCode("IO_CODE");
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));
String bill_type = (String) map.get("bill_type");
map.put("buss_type", bill_type.substring(0, 4));
map.put("io_type", "1");
map.put("detail_count", rows.size() + "");
map.put("create_mode", "01");
map.put("stor_code", jsonStor.getString("stor_code"));
map.put("stor_name", jsonStor.getString("stor_name"));
map.put("input_optid", currentUserId + "");
map.put("input_optname", nickName);
map.put("input_time", now);
map.put("update_optid", currentUserId + "");
map.put("update_optname", nickName);
map.put("update_time", now);
map.put("is_delete", "0");
map.put("is_upload", "0");
map.put("out_stor_id", map.getString("out_stor_id"));
if (ObjectUtil.isNotEmpty(user)) {
if (!"mes".equals(user) || "sap".equals(user)) {
Long deptId = SecurityUtils.getDeptId();
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);
// 校验计划数量不能为零
double plan_qty = row.getDoubleValue("plan_qty");
if (Double.compare(plan_qty, 0.0) == 0) {
throw new BadRequestException("数量不能为0");
}
JSONObject jsonDtl = new JSONObject();
jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + "");
jsonDtl.put("iostorinv_id", iostorinv_id);
jsonDtl.put("seq_no", (i + 1) + "");
jsonDtl.put("material_id", row.getString("material_id"));
jsonDtl.put("pcsn", row.getString("pcsn"));
jsonDtl.put("box_no", row.getString("box_no"));
jsonDtl.put("quality_scode", "01");
jsonDtl.put("bill_status", "10");
jsonDtl.put("qty_unit_id", row.get("qty_unit_id"));
jsonDtl.put("qty_unit_name", row.getString("qty_unit_name"));
jsonDtl.put("plan_qty", row.get("plan_qty"));
jsonDtl.put("remark", row.getString("remark"));
jsonDtl.put("source_bill_code", row.getString("source_bill_code"));
jsonDtl.put("assign_qty", "0");
jsonDtl.put("unassign_qty", row.get("plan_qty"));
jsonDtl.put("vbeln", row.getString("vbeln"));
jsonDtl.put("posnr", row.getString("posnr"));
WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl);
qty += jsonDtl.getDoubleValue("plan_qty");
// 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细
String pcsn = row.getString("pcsn");
String box_no = row.getString("box_no");
//查询该箱子所在货位
JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(pcsn)) {
if (ObjectUtil.isEmpty(struct_jo)) {
throw new BadRequestException("未查询到该批次所在货位!");
}
String struct_code = struct_jo.getString("struct_code");
JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(json)) {
continue;
}
}
}
map.put("total_qty", qty);
map.put("detail_count", num);
WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map);
return iostorinv_id;
}
@Override
@Transactional(rollbackFor = Exception.class)
public String insertDtl2(JSONObject map) {
@@ -1128,6 +1244,11 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
@Override
@Transactional(rollbackFor = Exception.class)
public void update(JSONObject whereJson) {
if (whereJson.getString("bill_type").equals("1011")) {
updatePic(whereJson);
return;
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
@@ -1253,6 +1374,82 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
}
}
/**
* 分拣出库修改
* @param whereJson、
*/
private void updatePic(JSONObject whereJson) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
whereJson.put("update_optid", currentUserId + "");
whereJson.put("update_optname", nickName);
whereJson.put("update_time", now);
WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv");
WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl");
WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");
wo.update(whereJson);
//先删除该单据下的所有明细
String iostorinv_id = (String) whereJson.get("iostorinv_id");
wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'");
JSONArray rows = whereJson.getJSONArray("tableData");
double qty = 0.0; // 主表重量
int num = rows.size(); // 明细数
for (int i = 0; i < rows.size(); i++) {
JSONObject row = rows.getJSONObject(i);
// 校验计划数量不能为零
double plan_qty = row.getDoubleValue("plan_qty");
if (Double.compare(plan_qty, 0) == 0) {
throw new BadRequestException("数量不能为0");
}
JSONObject jsonDtl = new JSONObject();
jsonDtl.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + "");
jsonDtl.put("iostorinv_id", iostorinv_id);
jsonDtl.put("seq_no", (i + 1) + "");
jsonDtl.put("material_id", row.getString("material_id"));
jsonDtl.put("pcsn", row.getString("pcsn"));
jsonDtl.put("box_no", row.getString("box_no"));
jsonDtl.put("quality_scode", "01");
jsonDtl.put("bill_status", "10");
jsonDtl.put("qty_unit_id", row.get("qty_unit_id"));
jsonDtl.put("qty_unit_name", row.getString("qty_unit_name"));
jsonDtl.put("plan_qty", row.get("plan_qty"));
jsonDtl.put("remark", row.getString("remark"));
jsonDtl.put("source_bill_code", row.getString("source_bill_code"));
jsonDtl.put("assign_qty", "0");
jsonDtl.put("unassign_qty", row.get("plan_qty"));
jsonDtl.put("vbeln", row.getString("vbeln"));
jsonDtl.put("posnr", row.getString("posnr"));
WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(jsonDtl);
qty += jsonDtl.getDoubleValue("plan_qty");
// 判断此明细子卷是否存在,存在则将此木箱下的子卷全部生成明细
String pcsn = row.getString("pcsn");
String box_no = row.getString("box_no");
//查询该箱子所在货位
JSONObject struct_jo = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + box_no + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(pcsn)) {
if (ObjectUtil.isEmpty(struct_jo)) {
throw new BadRequestException("未查询到该批次所在货位!");
}
String struct_code = struct_jo.getString("struct_code");
JSONObject json = ivtTab.query("pcsn = '" + pcsn + "' AND struct_code = '" + struct_code + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(json)) {
continue;
}
}
whereJson.put("total_qty", qty);
whereJson.put("detail_count", num);
wo.update(whereJson);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void allDiv(JSONObject whereJson) {
@@ -1424,7 +1621,13 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
throw new BadRequestException("库存不足");
}
double canuse_qty = jsonIvt.getDoubleValue("canuse_qty");
double canuse_qty ;
if (StrUtil.equals(bill_type, "1011")) {
canuse_qty = dtl.getDoubleValue("plan_qty");
} else {
canuse_qty = jsonIvt.getDoubleValue("canuse_qty");
}
jsonIvt.put("change_qty", canuse_qty + "");
unassign_qty = 0;
assign_qty = NumberUtil.add(assign_qty, canuse_qty);
@@ -1513,6 +1716,289 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void allDiv2(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");
//库区表
WQLObject wo_sect = WQLObject.getWQLObject("st_ivt_sectattr");
//定义需要更新的仓位集合
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("查不到出库单信息");
}
// 如果是发货出库则判断运费和物流公司不能为空
String bill_type = jo_mst.getString("bill_type");
if (StrUtil.equals(bill_type, "1001")) {
String trans_code = jo_mst.getString("trans_code");
String estimated_freight = jo_mst.getString("estimated_freight");
if (ObjectUtil.isEmpty(trans_code)) {
throw new BadRequestException("物流公司不能为空");
}
if (ObjectUtil.isEmpty(estimated_freight)) {
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");
/*
* 分配规则:
* 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();
// 已分配重量
double assign_qty = dtl.getDoubleValue("assign_qty");
// 需要更新库存的集合
List<JSONObject> updateIvtList = new ArrayList<>();
// 需要插入分配明细的集合
List<JSONObject> instDisList = new ArrayList<>();
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"));
jsonMap.put("stor_id", whereJson.getString("stor_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");
assign_qty = NumberUtil.add(assign_qty, canuse_qty);
if (unassign_qty >= canuse_qty) {
unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty);
} else {
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");
// 放在更新库存的集合当中
updateIvtList.add(ivt2);
// 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"));
dtl.put("is_overdue", ivt2.getString("is_overdue"));
dtl.put("instorage_time", ivt2.getString("instorage_time"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
JSONObject jsonSect = wo_sect.query("sect_id = '" + ivt2.getString("sect_id") + "'").uniqueResult(0);
if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
if (jo_mst.getString("is_overdue").equals("1")) {
// 判断是否超期
if (ivt2.getString("is_overdue").equals("1")) {
dtl.put("work_status", "01");
}
}
// 放在插入分配明细的集合当中
instDisList.add(dtl);
// 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"));
jsonMap.put("box_no", dtl.getString("box_no"));
jsonMap.put("sect_id", whereJson.getString("sect_id"));
jsonMap.put("stor_id", whereJson.getString("stor_id"));
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;
assign_qty = NumberUtil.add(assign_qty, canuse_qty);
//更新库存
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");
// 放入需要更新库存的集合当中
updateIvtList.add(jsonIvt);
// 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"));
dtl.put("is_overdue", jsonIvt.getString("is_overdue"));
dtl.put("instorage_time", jsonIvt.getString("instorage_time"));
// 如果所属仓位是虚拟区 则将分配明细状态变为生成
JSONObject jsonSect = wo_sect.query("sect_id = '" + jsonIvt.getString("sect_id") + "'").uniqueResult(0);
if (StrUtil.equals(jsonSect.getString("sect_type_attr"), "09")) {
dtl.put("work_status", "01");
} else {
dtl.put("work_status", "00");
}
// 判断是否超期
if (jo_mst.getString("is_overdue").equals("1")) {
if (jsonIvt.getString("is_overdue").equals("1")) {
dtl.put("work_status", "01");
}
}
// 放入需要插入分配明细的集合当中
instDisList.add(dtl);
// wo_dis.insert(dtl);
//记录需锁定的仓位 (如果此明细有相同物料的且子卷号不能为空的则在最后一个明细分配完成后锁定仓位)
JSONObject map = new JSONObject();
map.put("flag", "5");
map.put("material_id", dtl.getString("material_id"));
map.put("box_no", dtl.getString("box_no"));
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", assign_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);
// 开启线程池
JSONObject param = new JSONObject();
param.put("updateIvtList", updateIvtList);
param.put("instDisList", instDisList);
param.put("struct_map", Struct_map);
ThreadManage bean = SpringContextHolder.getBean(ThreadManage.class);
bean.startThread(param);
/* //锁定起点点位、仓位
Collection<JSONObject> c = Struct_map.values();
Iterator<JSONObject> it = c.iterator();
JSONObject from_start = new JSONObject();
from_start.put("lock_type", "3");
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) {
@@ -2671,7 +3157,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -2705,7 +3191,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -2739,7 +3225,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -2776,7 +3262,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成");
@@ -2810,7 +3296,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成");
@@ -3131,7 +3617,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -3163,7 +3649,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -3195,7 +3681,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!");
@@ -3229,7 +3715,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成");
@@ -3260,7 +3746,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
for (int k = 0; k < numArr.size(); k++) {
JSONObject json = numArr.getJSONObject(k);
error += json.getString("struct_code") + ",";
error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code");
}
throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成!");
@@ -4118,23 +4604,6 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
storPublicService.IOStor(dis, "21");
}
}
//解锁起点
JSONObject from_start = new JSONObject();
from_start.put("struct_id", dis.getString("struct_id"));
from_start.put("lock_type", "1");
from_start.put("is_overdue", dis.getString("is_overdue"));
if (jo_mst.getString("is_overdue").equals("1")) {
if (dis.getString("is_overdue").equals("1")) {
from_start.put("storagevehicle_code", dis.getString("box_no"));
} else {
from_start.put("storagevehicle_code", "");
}
} else {
from_start.put("storagevehicle_code", "");
}
storPublicService.updateStructAndPoint(from_start);
// 更新分配明细执行状态为 - 99
JSONObject jsonDis = wo_dis.query("iostorinvdis_id = '" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0);
@@ -4166,8 +4635,55 @@ public class CheckOutBillServiceImpl implements CheckOutBillService {
} else {
jsonSub.put("status", "3");
}
if (jo_mst.getString("bill_type").equals("1011")) {
// 更新子卷包装净重
double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty);
jsonSub.put("net_weight",net_weight);
if (net_weight <= 0) {
jsonSub.put("status","3");
} else {
jsonSub.put("status","2");
}
}
subTab.update(jsonSub);
// 解锁起点
JSONObject from_start = new JSONObject();
from_start.put("struct_id", dis.getString("struct_id"));
from_start.put("lock_type", "1");
from_start.put("is_overdue", dis.getString("is_overdue"));
if (jo_mst.getString("is_overdue").equals("1")) {
if (dis.getString("is_overdue").equals("1")) {
from_start.put("storagevehicle_code", dis.getString("box_no"));
} else {
from_start.put("storagevehicle_code", "");
}
} else {
from_start.put("storagevehicle_code", "");
}
if (jo_mst.getString("bill_type").equals("1011")) {
// 判断此木箱下的所有子卷净重是否为0如果为0则清空载具
List<JSONObject> packageList = subTab.query("package_box_sn = '" + jsonSub.getString("package_box_sn") + "'")
.getResultJSONArray(0).toJavaList(JSONObject.class);
boolean is_zero = packageList.stream()
.allMatch(row -> row.getDoubleValue("net_weight") <= 0);
if (is_zero) {
from_start.put("storagevehicle_code", "");
} else {
from_start.put("bill_type","1011");
from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn"));
}
}
storPublicService.updateStructAndPoint(from_start);
//插入包装关系出入库记录表
jsonSub.put("bill_code", jo_mst.getString("bill_code"));
jsonSub.put("bill_id", jo_mst.getString("iostorinv_id"));

View File

@@ -0,0 +1,34 @@
package org.nl.wms.st.outbill.util;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.st.inbill.service.StorPublicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class TaskInsertDisManage implements Runnable {
List<JSONObject> disList ;
public TaskInsertDisManage(List<JSONObject> a) {
disList = a;
}
@Override
public void run() {
WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis");
// 业务处理: 更新库存
for (int i = 0; i < disList.size(); i++) {
JSONObject json = disList.get(i);
disTab.insert(json);
}
}
}

View File

@@ -0,0 +1,33 @@
package org.nl.wms.st.outbill.util;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.st.inbill.service.impl.StorPublicServiceImpl;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class TaskUpdateIvtManage implements Runnable {
List<JSONObject> ivtList ;
public TaskUpdateIvtManage(List<JSONObject> a) {
ivtList = a;
}
@Override
public void run() {
StorPublicServiceImpl bean = SpringContextHolder.getBean(StorPublicServiceImpl.class);
// 业务处理: 更新库存
for (int i = 0; i < ivtList.size(); i++) {
JSONObject json = ivtList.get(i);
bean.IOStor(json,"11");
}
}
}

View File

@@ -0,0 +1,147 @@
package org.nl.wms.st.outbill.util;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.st.inbill.service.impl.StorPublicServiceImpl;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Component
public class ThreadManage {
/**
* 开启线程池
* @param whereJson{
* updateIvtList : 需更新的库存集合
* instDisList : 需插入的分配明细集合
* struct_map : 需更新的仓位map
* }
*/
@Transactional
public void startThread(JSONObject whereJson) {
// 需要更新的库存集合
List<JSONObject> updateIvtList = whereJson.getJSONArray("updateIvtList").toJavaList(JSONObject.class);
// 需要插入的分配明细集合
List<JSONObject> instDisList = whereJson.getJSONArray("instDisList").toJavaList(JSONObject.class);
// 需更新的仓位map
JSONObject struct_map = whereJson.getJSONObject("struct_map");
// 调用库存处理
updateIvtManage(updateIvtList);
// 调用插入分配明细处理
insertDisManage(instDisList);
// 调用更新仓位处理
updateAttrManage(struct_map);
}
/**
* 更新库存
* @param updateIvtList库存集合
*/
private void updateIvtManage(List<JSONObject> updateIvtList) {
// 1个线程分配10个数据
int ceil = (int) Math.ceil(NumberUtil.div(updateIvtList.size(), 10));
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(ceil);
for (int i = 0; i < ceil; i++) {
List<JSONObject> list ;
// 分割集合
if (i + 1 == ceil) {
list = updateIvtList.subList( i * 10, updateIvtList.size());
} else {
list = updateIvtList.subList( i * 10, (i + 1) * 10);
}
// 提交任务
executorService.submit(new TaskUpdateIvtManage(list));
}
// 关闭线程 - 但不会立刻关闭
executorService.shutdown();
}
/**
* 插入分配明细
* @param instDisList分配明细集合
*/
private void insertDisManage(List<JSONObject> instDisList) {
// 1个线程分配10个数据
int ceil = (int) Math.ceil(NumberUtil.div(instDisList.size(), 10));
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(ceil);
for (int i = 0; i < ceil; i++) {
List<JSONObject> list ;
// 分割集合
if (i + 1 == ceil) {
list = instDisList.subList( i * 10, instDisList.size());
} else {
list = instDisList.subList( i * 10, (i + 1) * 10);
}
// 提交任务
executorService.submit(new TaskInsertDisManage(list));
}
// 关闭线程 - 但不会立刻关闭
executorService.shutdown();
}
/**
* 更新仓位
* @param Struct_map
*/
private void updateAttrManage(JSONObject Struct_map) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 业务处理
StorPublicServiceImpl bean = SpringContextHolder.getBean(StorPublicServiceImpl.class);
executorService.submit(() -> {
Collection<Object> c = Struct_map.values();
Iterator<Object> it = c.iterator();
JSONObject from_start = new JSONObject();
from_start.put("lock_type", "3");
for (; it.hasNext(); ) {
JSONObject Struct = (JSONObject) it.next();
from_start.put("struct_id", Struct.getString("struct_id"));
from_start.put("inv_type", "1111");
from_start.put("inv_id", "2222");
from_start.put("inv_code", "3333");
bean.updateStructAndPoint(from_start);
}
});
// 关闭线程 - 但不会立刻关闭
executorService.shutdown();
}
}

View File

@@ -1196,7 +1196,7 @@
AND task_status IN ('07')
AND is_delete = '0'
AND task_type = '010503'
AND DATEDIFF( NOW(), LEFT(update_time,10) ) <= 2
AND TIMESTAMPDIFF(HOUR,update_time,NOW()) <= 3
ENDSELECT
ENDQUERY