add:出库一键设置

This commit is contained in:
2024-02-21 18:35:27 +08:00
parent b6baccc8a9
commit 64e3d286cc
10 changed files with 608 additions and 59 deletions

View File

@@ -0,0 +1,198 @@
package org.nl.b_lms.sch.tasks;
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.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 二期出库异常任务类
* Created by Lxy on 2024/1/19.
*/
public class TwoOutExceptionalTask extends AbstractAcsTask {
/**
* 处理类
*/
private final String THIS_CLASS = TwoOutExceptionalTask.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);
char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1);
AcsTaskDto dto = AcsTaskDto.builder()
.ext_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"))
.priority(json.getString("priority"))
.class_type(json.getString("task_type"))
.dtl_type(String.valueOf(dtl_type))
.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");
// 出入库分配明细表
WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis");
// 点位表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
JSONObject jsonTask = taskTab.query("task_id = '" + taskObj.getString("task_id") + "'").uniqueResult(0);
// 更新任务的参数
JSONObject map = new JSONObject();
/*
* 1-执行中, 2-完成 ,0-acs取消
*/
// 执行中
if (status.equals(TaskStatusEnum.EXECUTING.getCode())) {
map.put("task_status", TaskStatusEnum.EXECUTING.getCode());
}
// 完成
if (status.equals(TaskStatusEnum.FINISHED.getCode())) {
map.put("task_status", TaskStatusEnum.FINISHED.getCode());
// 判断任务是否被标记
if (jsonTask.getString("is_auto_issue").equals(IOSEnum.IS_SEND.code(""))) {
// 创建出库任务
JSONObject jsonDis = disTab.query("iostorinv_id = '" + jsonTask.getString("table_fk") + "' and struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0);
JSONObject jsonPoint = pointTab.query("region_id = '" + RegionTypeEnum.TWO_OUT01.getId() + "' and is_delete = '0' and is_used = '1'").uniqueResult(0);
JSONObject jsonTaskParam = new JSONObject();
jsonTaskParam.put("task_type", "010504");
jsonTaskParam.put("point_code1", jsonTask.getString("point_code2"));
jsonTaskParam.put("point_code2", jsonPoint.getString("point_code"));
jsonTaskParam.put("vehicle_code", jsonTask.getString("vehicle_code"));
jsonTaskParam.put("task_group_id", jsonDis.getString("task_id"));
jsonTaskParam.put("is_auto_issue", IOSEnum.IS_SEND.code(""));
jsonTaskParam.put("table_fk", jsonTask.getString("table_fk"));
jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("")));
TwoOutTask twoOutTask = new TwoOutTask();
String task_id = twoOutTask.createTask(jsonTaskParam);
// 更新分配明细
JSONObject param = new JSONObject();
param.put("task_id",task_id);
param.put("point_id",jsonPoint.getString("point_id"));
disTab.update(param,"iostorinv_id = '"+jsonTask.getString("table_fk")+"' and struct_code = '"+jsonTask.getString("point_code1")+"'");
}
}
// 取消
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
if (taskObj.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务已执行不能取消");
}
// 更新任务表删除字段
map.put("is_delete", IOSEnum.IS_NOTANDYES.code(""));
}
map.put("update_optid", SecurityUtils.getCurrentUserId());
map.put("update_optname", SecurityUtils.getCurrentNickName());
map.put("update_time", DateUtil.now());
WQLObject.getWQLObject("SCH_BASE_Task").update(map, "task_id = '" + taskObj.getString("task_id") + "'");
}
@Override
public void findStartPoint() {
}
@Override
public void findNextPoint() {
}
@Override
@Transactional(rollbackFor = Exception.class)
public String createTask(JSONObject form) {
if (StrUtil.isBlank(form.getString("task_type"))) {
throw new BadRequestException("业务类型不能为空!");
}
if (StrUtil.isBlank(form.getString("start_device_code"))) {
throw new BadRequestException("起点不能为空!");
}
if (StrUtil.isBlank(form.getString("next_device_code"))) {
throw new BadRequestException("终点不能为空!");
}
if (StrUtil.isBlank(form.getString("vehicle_code"))) {
throw new BadRequestException("托盘号不能为空!");
}
JSONObject json = new JSONObject();
json.put("task_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_code", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_type", form.getString("task_type"));
json.put("vehicle_code", form.getString("vehicle_code"));
json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
json.put("point_code1", form.getString("start_device_code"));
json.put("point_code2", form.getString("next_device_code"));
json.put("handle_class", this.getClass().getName());
json.put("table_fk", form.getString("table_fk"));
json.put("create_id", SecurityUtils.getCurrentUserId());
json.put("create_name", SecurityUtils.getCurrentUsername());
json.put("create_time", DateUtil.now());
json.put("priority", "1");
json.put("acs_task_type", "7");
WQLObject.getWQLObject("SCH_BASE_Task").insert(json);
return json.getString("task_id");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void forceFinish(String task_id) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode());
}
@Override
public void cancel(String task_id) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
this.updateTaskStatus(taskObj, IOSEnum.ACS_RESULT.code("取消"));
}
}

View File

@@ -2,12 +2,12 @@ package org.nl.b_lms.sch.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
@@ -15,18 +15,16 @@ import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.st.inbill.service.CheckOutBillService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by Lxy on 2021/12/22.
*/
@Component
@RequiredArgsConstructor
public class TwoOutTask extends AbstractAcsTask {
private final String THIS_CLASS = TwoOutTask.class.getName();
@@ -41,10 +39,24 @@ public class TwoOutTask extends AbstractAcsTask {
JSONObject map = new JSONObject();
map.put("flag", "1");
map.put("handle_class", THIS_CLASS);
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);
List<JSONObject> arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0' order by sort_seq")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 根据任务组分组
Map<String, List<JSONObject>> groupMap = arr.stream()
.collect(Collectors.groupingBy(row -> row.getString("task_group_id")));
List<JSONObject> taskArr = new ArrayList<>();
for(String task_group_id : groupMap.keySet()) {
taskArr = groupMap.get(task_group_id);
continue;
}
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject json = taskArr.get(i);
char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1);
AcsTaskDto dto = AcsTaskDto.builder()
@@ -79,7 +91,7 @@ public class TwoOutTask extends AbstractAcsTask {
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonTask)) {
if (StrUtil.equals(status, "0")) {
if (status.equals(IOSEnum.IS_NOTANDYES.code(""))) {
// 任务为执行之后就不允许取消
if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消");
@@ -92,11 +104,11 @@ public class TwoOutTask extends AbstractAcsTask {
// 更新分配明细为:未生成
JSONObject map = new JSONObject();
map.put("work_status", "00");
map.put("work_status", IOSEnum.WORK_STATUS.code("未生成"));
map.put("point_id", "");
map.put("task_id", "");
disTab.update(map, "task_id = '" + task_id + "'");
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
@@ -108,26 +120,16 @@ public class TwoOutTask extends AbstractAcsTask {
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
String currentUserId = SecurityUtils.getCurrentUserId();
String currentUsername = SecurityUtils.getCurrentUsername();
// 判断此任务是否有任务组
String task_group_id = jsonTask.getString("task_group_id");
if (ObjectUtil.isNotEmpty(task_group_id)) {
// 上一个任务组顺序号
String sort_seq_last = NumberUtil.sub(jsonTask.getString("sort_seq"), "1").toString();
}
// 调用标识完成
CheckOutBillService checkOutBillService = SpringContextHolder.getBean(CheckOutBillService.class);
checkOutBillService.finishTask(jsonTask);
StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class);
bean.finishTask(jsonTask);
// 判断此任务组是否全部完成
JSONArray resultJSONArray = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'")
.getResultJSONArray(0);
// 更改任务状态为完成
jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode());
jsonTask.put("update_optid", currentUserId);
jsonTask.put("update_optname", currentUsername);
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
if (ObjectUtil.isEmpty(resultJSONArray)) {
this.immediateNotifyAcs(null);
}
}
}
@@ -159,7 +161,9 @@ public class TwoOutTask extends AbstractAcsTask {
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("is_auto_issue", form.getString("is_auto_issue"));
json.put("table_fk", form.getString("table_fk"));
json.put("sort_seq", form.getIntValue("sort_seq"));
json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
json.put("handle_class", THIS_CLASS);
@@ -182,6 +186,6 @@ public class TwoOutTask extends AbstractAcsTask {
@Override
public void cancel(String task_id) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
this.updateTaskStatus(taskObj, "0");
this.updateTaskStatus(taskObj, IOSEnum.IS_NOTANDYES.code(""));
}
}

View File

@@ -60,7 +60,8 @@ public enum IOSEnum {
//仓位锁定类型
LOCK_TYPE(MapOf.of("未锁定", "1", "入库锁", "2", "出库锁", "3", "空托盘出库锁", "4",
"空托盘入库锁", "5", "移出锁", "6", "移入锁", "7","木箱入库锁","8","木箱出库锁","9", "其它", "99"
"空托盘入库锁", "5", "移出锁", "6", "移入锁", "7","木箱入库锁","8","木箱出库锁","9",
"出库异常锁","10","其它", "99"
)),
//仓库id
@@ -81,6 +82,9 @@ public enum IOSEnum {
//仓位伸位
ZDEPTH_STRUCT(MapOf.of("", "1","","2","","3")),
//是否自动下发
IS_SEND(MapOf.of("", "1","","2")),
//外部系统
EXT_SYSTEM(MapOf.of("mes", "mes","sap","sap","crm","crm")),
;

View File

@@ -119,4 +119,11 @@ public interface IStIvtIostorinvOutService extends IService<StIvtIostorinv> {
* }
*/
void confirm(JSONObject whereJson);
/**
* 标识完成
* @param whereJson: 任务对象
*/
void finishTask(JSONObject whereJson);
}

View File

@@ -2,6 +2,7 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -21,6 +22,7 @@ import java.math.BigDecimal;
@EqualsAndHashCode(callSuper = false)
@TableName("st_ivt_iostorinvdis")
@Builder
@AllArgsConstructor
public class StIvtIostorinvdis implements Serializable {
private static final long serialVersionUID = 1L;

View File

@@ -113,7 +113,7 @@
ST_IVT_IOStorInvDis dis
LEFT JOIN pdm_bi_subpackagerelation sub ON sub.container_name = dis.pcsn
WHERE
1 = 1
dis.work_status = '00'
<if test="iostorinvdtl_id != null and iostorinvdtl_id != ''">
AND dis.iostorinvdtl_id= #{iostorinvdtl_id}
</if>

View File

@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.b_lms.pdm_manage.enums.SUBEnum;
import org.nl.b_lms.sch.tasks.TwoOutExceptionalTask;
import org.nl.b_lms.sch.tasks.TwoOutTask;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService;
@@ -21,6 +23,7 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvOutMapper;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBussManageService;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
@@ -30,6 +33,7 @@ import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.basedata.st.service.StorattrService;
import org.nl.wms.basedata.st.service.dto.StorattrDto;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -87,6 +91,12 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
@Autowired
private IStIvtIostorinvService iStIvtIostorinvService;
/**
* 入库业务处理服务
*/
@Autowired
private InBussManageService inBussManageService;
@Override
@Transactional
public String insertMst(JSONObject whereJson) {
@@ -520,9 +530,19 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
@Override
@Transactional
public void allSetPoint(JSONObject whereJson) {
// 任务表
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
StIvtIostorinv mstDao = this.getById(whereJson.getLongValue("iostorinv_id"));
// 判断是否有正在执行中的任务
List<JSONObject> arr = taskTab.query("handle_class = '" + TwoOutTask.class.getName() + "' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "' and is_delete ='0'")
.getResultJSONArray(0).toJavaList(JSONObject.class);
if (ObjectUtil.isNotEmpty(arr)) {
throw new BadRequestException("当前有出库任务正在执行,请稍后在试!");
}
// 查询此明细所有未生成的分配明细
List<JSONObject> disDaoList = stIvtIostorinvdisMapper.getNotCreateDis(whereJson);
@@ -548,6 +568,18 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
for (List<JSONObject> disLikeList : groupingDisMap.values()) {
// 调用任务生成处理
List<JSONObject> taskMangeList = createTaskMange(disLikeList,mstDao.getIostorinv_id().toString());
// 创建任务并下发一组任务
createTask(taskMangeList,disLikeList,whereJson.getString("point_code"));
}
// 下发任务:判断当前单据是否有正在执行的的任务
JSONArray disArr = taskTab.query("table_fk = '" + mstDao.getIostorinv_id().toString() + "' and is_delete = '0' and task_status = '" + TaskStatusEnum.EXECUTING.getCode() + "'")
.getResultJSONArray(0);
if (ObjectUtil.isEmpty(disArr)) {
TwoOutTask twoOutTask = new TwoOutTask();
twoOutTask.immediateNotifyAcs(null);
}
}
@@ -625,11 +657,13 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
needUpdateIvtList.add(jsonIvt);
if (disDao.getTask_id() != null) {
needUpdateTaskList.add(disDao.getTask_id().toString());
}
}
// 处理异常货位
UpdateExceptional(disDaoList);
// 更新库存
outBussManageService.upateIvt(needUpdateIvtList,mstDao,IOSEnum.IVT_CHANGE.code("减库存"));
@@ -766,6 +800,86 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
}
}
@Override
@Transactional
public void finishTask(JSONObject whereJson) {
//任务表
WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task");
// 查询任务
JSONObject jsonTask = wo_Task.query("task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "' and task_id = '" + whereJson.getString("task_id") + "'")
.uniqueResult(0);
if (jsonTask == null) {
throw new BadRequestException("查询不到操作的任务记录!"+whereJson.getString("task_id"));
}
// 查询分配明细
List<StIvtIostorinvdis> disDaoList = iStIvtIostorinvdisService.list(
new QueryWrapper<StIvtIostorinvdis>().lambda()
.eq(StIvtIostorinvdis::getTask_id, whereJson.getString("task_id"))
);
StIvtIostorinvdis disDao = disDaoList.get(0);
// 查询主表
StIvtIostorinv mstDao = this.getById(disDao.getIostorinv_id());
if (ObjectUtil.isEmpty(mstDao)) {
throw new BadRequestException("未查询到对应的出库单据!");
}
if (IOSEnum.OUT_TYPE.code("改切出库").equals(mstDao.getBill_type()) || IOSEnum.OUT_TYPE.code("返检出库").equals(mstDao.getBill_type())) {
HashMap<String, String> map = new HashMap<>();
map.put("need_delete", IOSEnum.IS_NOTANDYES.code(""));
WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map, "package_box_sn = '" + jsonTask.getString("vehicle_code") + "'");
JSONArray rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + jsonTask.getString("vehicle_code") + "'").getResultJSONArray(0);
for (int i = 0; i < rows.size(); i++) {
JSONObject row = rows.getJSONObject(i);
//插入包装关系出入库记录表
row.put("bill_code", mstDao.getBill_code());
row.put("bill_id", mstDao.getIostorinv_id());
row.put("bill_type", mstDao.getBill_type());
row.put("io_type", IOSEnum.IO_TYPE.code("出库"));
row.put("insert_time", DateUtil.now());
row.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId());
WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord").insert(row);
}
}
//更新任务为完成
HashMap<String, String> map = new HashMap<>();
map.put("task_status", TaskStatusEnum.FINISHED.getCode());
map.put("update_optid", SecurityUtils.getCurrentUserId());
map.put("update_optname", SecurityUtils.getCurrentNickName());
map.put("update_time", DateUtil.now());
wo_Task.update(map, "task_id='" + whereJson.getString("task_id") + "'");
// 查询此任务下所有的分配明细
disDaoList.forEach(row -> {
row.setWork_status(IOSEnum.WORK_STATUS.code("完成"));
});
iStIvtIostorinvdisService.updateBatchById(disDaoList);
// 更新明细状态
iStIvtIostorinvdtlService.updateStatus(disDao.getIostorinvdtl_id());
//判断是否还有未完成的明细
List<StIvtIostorinvdtl> dtlDaoList = iStIvtIostorinvdtlService.list(
new QueryWrapper<StIvtIostorinvdtl>().lambda()
.eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id())
.ne(StIvtIostorinvdtl::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
);
if (ObjectUtil.isEmpty(dtlDaoList)) {
this.confirm(JSONObject.parseObject(JSON.toJSONString(mstDao)));
}
}
/**
* 创建调拨入库单
* @param disDaoList出库分配明细集合
@@ -882,10 +996,10 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
List<JSONObject> attrRowList = attrTab.query("stor_id = '" + IOSEnum.STOR_ID.code("二期") + "' AND row_num IN ('" + rowIn + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 需生成出库任务的仓位集合
// 需移库仓位集合
List<JSONObject> needMoveAttrList = new ArrayList<>();
// 需移库仓位集合
// 需生成出库任务的仓位集合
List<JSONObject> needCreateAttrList = new ArrayList<>();
// 循环准备任务参数
@@ -894,19 +1008,22 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
// 判断是深位还是浅位
if (jsonAttr.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code(""))) {
// 深位判断对应浅位是否阻挡
// 深位判断对应浅位是否阻挡
JSONObject jsonBoxStop = ifBoxStop(jsonAttr,attrRowList,iostorinv_id);
if (ObjectUtil.isNotEmpty(jsonBoxStop)) {
// 加入需要移库的集合
needMoveAttrList.add(jsonBoxStop);
}
// 加入需生成任务的集合
needCreateAttrList.add(jsonAttr);
}
// 加入需要出库的集合
needCreateAttrList.add(jsonAttr);
}
return needMoveAttrList;
// 创建移库单下发移库任务
outBussManageService.createMove(needMoveAttrList);
return needCreateAttrList;
}
/**
@@ -917,6 +1034,12 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
* @return JSONObject 需要移库的仓位
*/
private JSONObject ifBoxStop(JSONObject jsonAttr, List<JSONObject> attrRowList, String iostorinv_id) {
// 仓位表
WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
// 子卷包装关系表
WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
// 任务表
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
JSONObject result = new JSONObject();
@@ -941,15 +1064,225 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
// 未锁定说明可以移库
if (jsonLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
result = jsonLow;
} else {
// 锁定
// TODO 判断是否是此单据下的木箱 || 不同单据下的(在分配时做限制只允许一个单据的任务做完才能分配)
} else if (jsonLow.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库锁"))) {
boolean flag = true;
// 判断是否是此单据下相同订单、长宽高、物料的木箱
List<StIvtIostorinvdis> disDaoList = iStIvtIostorinvdisService.list(
new QueryWrapper<StIvtIostorinvdis>().lambda()
.eq(StIvtIostorinvdis::getIostorinv_id, iostorinv_id)
.eq(StIvtIostorinvdis::getBox_no, jsonLow.getString("storagevehicle_code"))
);
if (ObjectUtil.isNotEmpty(disDaoList)) {
// 相同
JSONObject jsonSub1 = subTab.query("package_box_sn = '" + jsonAttr.getString("storagevehicle_code") + "'").uniqueResult(0);
JSONObject jsonSub2 = subTab.query("package_box_sn = '" + jsonLow.getString("storagevehicle_code") + "'").uniqueResult(0);
if (jsonSub1.getString("sale_order_name").equals(jsonSub2.getString("sale_order_name")) &&
jsonSub1.getString("box_length").equals(jsonSub2.getString("box_length")) &&
jsonSub1.getString("box_width").equals(jsonSub2.getString("box_width")) &&
jsonSub1.getString("box_high").equals(jsonSub2.getString("box_high")) &&
jsonSub1.getString("product_name").equals(jsonSub2.getString("product_name"))) {
flag = false;
} else {
// 不相同:判断是否有此木箱的任务
JSONObject jsonTask = taskTab.query("table_fk = '" + iostorinv_id + "' and vehicle_code = '" + jsonLow.getString("storagevehicle_code") + "' and is_delete = '0'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonTask)) {
flag = false;
}
}
}
if (flag) {
// 查询移入货位
JSONObject moveParam = new JSONObject();
moveParam.put("stor_id", IOSEnum.STOR_ID.code("二期"));
moveParam.put("sect_id", RegionTypeEnum.TWO_ZZ01.getId());
moveParam.put("box_no", jsonLow.getString("storagevehicle_code"));
// moveParam.put("material_id", jsonMater.getString("material_id"));
JSONObject jsonMove = inBussManageService.getOneStruct(moveParam);
// 生成任务
JSONObject jsonTaskParam = new JSONObject();
jsonTaskParam.put("task_type", "010504");
jsonTaskParam.put("start_device_code", jsonLow.getString("struct_code"));
jsonTaskParam.put("next_device_code", jsonMove.getString("struct_code"));
jsonTaskParam.put("vehicle_code", jsonLow.getString("storagevehicle_code"));
jsonTaskParam.put("table_fk", iostorinv_id);
TwoOutExceptionalTask taskBean = new TwoOutExceptionalTask();
String task_id = taskBean.createTask(jsonTaskParam);
taskBean.immediateNotifyAcs(task_id);
// 锁定:标记货位为异常并生成异常移库任务
jsonLow.put("lock_type", IOSEnum.LOCK_TYPE.code("出库异常锁"));
jsonLow.put("task_code", task_id);
attrTab.update(jsonLow);
// 更新移入货位为出库异常货位
jsonMove.put("lock_type",IOSEnum.LOCK_TYPE.code("出库异常锁"));
jsonLow.put("task_code", task_id);
attrTab.update(jsonMove);
}
}
}
return result;
}
/**
* 创建任务
* @param taskMangeList仓位集合
* @param disLikeList分配明细集合
* @param point_code 终点
*/
private void createTask(List<JSONObject> taskMangeList,List<JSONObject> disLikeList, String point_code) {
// 任务表
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
// 点位表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
// 查询异常货位任务集合
String TaskCodeIn = taskMangeList.stream()
.filter(row -> row.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁")))
.map(row -> row.getString("task_code"))
.distinct().collect(Collectors.joining("','"));
List<JSONObject> taskList = taskTab.query("task_id IN ('" + TaskCodeIn + "') and is_delete = '0'")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 任务组标识
String task_group_id = IdUtil.getStringId();
// 起点
String start_device_code = "";
// 是否自动下发
String is_auto_issue = IOSEnum.IS_SEND.code("");
for (int i = 0; i < taskMangeList.size(); i++) {
JSONObject json = taskMangeList.get(i);
start_device_code = json.getString("struct_code");
// 过滤此仓位的分配明细
List<StIvtIostorinvdis> disDaoList = disLikeList.stream()
.filter(row -> row.getString("struct_code").equals(json.getString("struct_code")))
.map(row -> JSONObject.parseObject(JSONObject.toJSONString(row), StIvtIostorinvdis.class))
.collect(Collectors.toList());
// 判断是否是异常货位
if (json.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("出库异常锁"))) {
/*
* 判断异常货位上的任务是否完成
* 完成生成完成任务的point_code2 当做起点的任务
* 未完成:只更新分配明细状态为生成
*/
JSONObject jsonTask = taskList.stream()
.filter(row -> row.getString("task_id").equals(json.getString("task_code")))
.collect(Collectors.toList()).get(0);
// 完成
if (jsonTask.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) {
start_device_code = jsonTask.getString("point_code2");
is_auto_issue = IOSEnum.IS_SEND.code("");
} else {
// 未完成只更新分配明细状态不更新任务id
disDaoList.forEach(row -> {
row.setWork_status(IOSEnum.WORK_STATUS.code("生成"));
row.setTask_id(Long.parseLong(task_group_id));
});
iStIvtIostorinvdisService.updateBatchById(disDaoList);
// 标记任务
jsonTask.put("is_auto_issue",IOSEnum.IS_SEND.code(""));
taskTab.update(jsonTask);
continue;
}
}
// 生成任务
JSONObject jsonTaskParam = new JSONObject();
jsonTaskParam.put("task_type", "010504");
jsonTaskParam.put("point_code1", start_device_code);
jsonTaskParam.put("point_code2", point_code);
jsonTaskParam.put("vehicle_code", json.getString("storagevehicle_code"));
jsonTaskParam.put("task_group_id", task_group_id);
jsonTaskParam.put("is_auto_issue", is_auto_issue);
jsonTaskParam.put("table_fk", disDaoList.get(0).getIostorinv_id().toString());
if (json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("")) ||
json.getString("zdepth").equals(IOSEnum.ZDEPTH_STRUCT.code("")))
{
jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("")));
} else {
jsonTaskParam.put("sort_seq", Integer.parseInt(IOSEnum.ZDEPTH_STRUCT.code("")));
}
TwoOutTask twoOutTask = new TwoOutTask();
String task_id = twoOutTask.createTask(jsonTaskParam);
// 更新分配明细
JSONObject jsonPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0);
disDaoList.forEach(row -> {
row.setWork_status(IOSEnum.WORK_STATUS.code("生成"));
row.setTask_id(Long.parseLong(task_id));
row.setPoint_id(jsonPoint.getLongValue("point_id"));
});
iStIvtIostorinvdisService.updateBatchById(disDaoList);
}
}
/**
* 更新异常货位
* @param disDaoList所有分配明细集合
*/
private void UpdateExceptional(List<StIvtIostorinvdis> disDaoList) {
// 仓位表
WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr");
// 任务表
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
// 获取仓位集合
String structCodeIn = disDaoList.stream()
.map(StIvtIostorinvdis::getStruct_code)
.distinct().collect(Collectors.joining("','"));
List<JSONObject> attrList = attrTab.query("struct_code IN ('" + structCodeIn + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 过滤异常货位
List<JSONObject> attrExcepList = attrList.stream()
.filter(row -> ObjectUtil.isNotEmpty(row.getString("task_code")))
.collect(Collectors.toList());
// 找所有异常任务
String taskCodeIn = attrExcepList.stream()
.map(row -> row.getString("task_code"))
.distinct().collect(Collectors.joining("','"));
List<JSONObject> taskList = taskTab.query("task_id IN ('" + taskCodeIn + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 更新异常货位
List<String> structCodeInList = new ArrayList<>();
for (int i = 0; i < taskList.size(); i++) {
JSONObject json = taskList.get(0);
structCodeInList.add(json.getString("point_code1"));
structCodeInList.add(json.getString("point_code2"));
}
JSONObject jsonUpdate = new JSONObject();
jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定"));
jsonUpdate.put("task_code", "");
attrTab.update(jsonUpdate,"struct_code IN ('"+String.join("','",structCodeInList)+"')");
}
/**
* 更新主表状态

View File

@@ -5,7 +5,6 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.b_lms.sch.tasks.TwoOutTask;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService;

View File

@@ -21,6 +21,7 @@ public class Init implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// initTwoAttr(4,30,3,2, "2");
// createAttr();
}
/**
@@ -152,27 +153,27 @@ public class Init implements ApplicationRunner {
String now = DateUtil.now();
for (int i = 1; i <= 2000; i++) {
for (int i = 1; i <= 3000; i++) {
JSONObject json = new JSONObject();
json.put("struct_id", IdUtil.getSnowflake(1,1).nextId());
if (i < 10) {
json.put("struct_code", "B01-"+"000"+i+"-01");
json.put("struct_name", "B01排"+"000"+i+"列-01层");
json.put("struct_code", "81-"+"000"+i+"-01");
json.put("struct_name", "81排"+"000"+i+"列-01层");
}else if (i >= 10 && i < 100) {
json.put("struct_code", "B01-"+"00"+i+"-01");
json.put("struct_name", "B01排"+"00"+i+"列-01层");
json.put("struct_code", "81-"+"00"+i+"-01");
json.put("struct_name", "81排"+"00"+i+"列-01层");
}else if (i >= 100 && i < 1000) {
json.put("struct_code", "B01-"+"0"+i+"-01");
json.put("struct_name", "B01排"+"0"+i+"列-01层");
json.put("struct_code", "81-"+"0"+i+"-01");
json.put("struct_name", "81排"+"0"+i+"列-01层");
} else {
json.put("struct_code", "B01-"+i+"-01");
json.put("struct_name", "B01排"+i+"列-01层");
json.put("struct_code", "81-"+i+"-01");
json.put("struct_name", "81排"+i+"列-01层");
}
JSONObject jsonObject = tab2.query("stor_id = '1582991156504039455'").uniqueResult(0);
JSONObject jsonObjec2 = tab3.query("stor_id = '1582991156504039455' and sect_code = 'BXN01'").uniqueResult(0);
JSONObject jsonObject = tab2.query("stor_id = '1597073830499717137'").uniqueResult(0);
JSONObject jsonObjec2 = tab3.query("stor_id = '1597073830499717137' and sect_code = 'XN81'").uniqueResult(0);
// 新增仓位
json.put("simple_name", json.getString("struct_name"));

View File

@@ -20,11 +20,12 @@ public enum RegionTypeEnum {
LKCK("17", "密集库出库输送线", "1585167595403874304"),
XN01("18", "虚拟区", "1586913215886004224"),
PD01("19", "盘点区", "1645705331612979200"),
TWO_ZZ01("20", "二期暂存区", ""),
TWO_ZZ01("20", "二期暂存区", "1760183596628447232"),
TWO_TTP01("21", "二期空托盘区", "1750471797729529856"),
TWO_MX01("22", "二期木箱区", "1752254266938101760"),
TWO_KZ01("23", "二期捆扎区", "1754774130626007040"),
TWO_FH01("24", "二期发货区", "1759453285649092608");
TWO_FH01("24", "二期发货区", "1759453285649092608"),
TWO_OUT01("25", "二期出库区", "1760141408548818944");
private String name;
private String code;