Merge branch 'master_merge' of http://121.40.234.130:8899/root/lanzhouhailiang_one into master_merge

This commit is contained in:
DESKTOP-5DIJMF9\admin
2025-02-07 16:12:51 +08:00
8 changed files with 234 additions and 175 deletions

View File

@@ -95,7 +95,6 @@ public class AutoCallAirShaftTask {
* 套拔轴缓存位满了、没有分切计划,则触发自动创建套拔轴任务 * 套拔轴缓存位满了、没有分切计划,则触发自动创建套拔轴任务
* update: 24/04/28 内包间只是区分气胀轴大小(即代数),不需要区分锂电/标箔 * update: 24/04/28 内包间只是区分气胀轴大小(即代数),不需要区分锂电/标箔
*/ */
@Transactional(rollbackFor = Exception.class)
public void run() { public void run() {
log.info("自动呼叫套轴开始执行..."); log.info("自动呼叫套轴开始执行...");
// 判断配置参数是否只做拔轴 // 判断配置参数是否只做拔轴
@@ -105,163 +104,166 @@ public class AutoCallAirShaftTask {
// 1、获取空的插拔轴位(无任务) // 1、获取空的插拔轴位(无任务)
List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2", List<BstIvtShafttubeivt> emptyPoints = bstIvtShafttubeivtService.getAllShaftPointsByConditions("2",
"0", "0"); "0", "0");
emptyPoints.forEach(empty -> { emptyPoints.forEach(empty -> doCallShaft(empty, isOnlyPulling, tzDay, paramObj));
// 标箔1锂电2 改大小4代5代 }
String specification = empty.getQzz_generation();
String location = empty.getPoint_location(); @Transactional(rollbackFor = Exception.class)
if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) { public void doCallShaft(BstIvtShafttubeivt empty, Param isOnlyPulling, Param tzDay, Param paramObj) {
// 只做拔轴 // 标箔1锂电2 改大小4代5代
makePullShaft(empty, specification); String specification = empty.getQzz_generation();
return; String location = empty.getPoint_location();
} if (ObjectUtil.isNotEmpty(isOnlyPulling) && SlitterConstant.SLITTER_YES.equals(isOnlyPulling.getValue())) {
Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue()); // 只做拔轴
// 2、获取分切计划数据 校验代数 todo 顺序可能需要考虑 makePullShaft(empty, specification);
List<SlitterPlanDistinctDto> planAll = slittingproductionplanService.getAllCutPlan(integer); return;
String value = paramObj.getValue(); }
List<String> prefixList = Arrays.asList(value.split("[,]")); Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue());
List<SlitterPlanDistinctDto> plans = planAll.stream() // 2、获取分切计划数据 校验代数 todo 顺序可能需要考虑
.filter(p -> prefixList.stream() List<SlitterPlanDistinctDto> planAll = slittingproductionplanService.getAllCutPlan(integer);
.anyMatch(prefix -> p.getResource_name().startsWith(prefix)) && String value = paramObj.getValue();
checkComputationPoint(p, empty) && checkHasTask(p)) List<String> prefixList = Arrays.asList(value.split("[,]"));
List<SlitterPlanDistinctDto> plans = planAll.stream()
.filter(p -> prefixList.stream()
.anyMatch(prefix -> p.getResource_name().startsWith(prefix)) &&
checkComputationPoint(p, empty) && checkHasTask(p))
.collect(Collectors.toList());
if (plans.size() == 0) {
// 如果不需要套轴,就只做拔轴
makePullShaft(empty, specification);
return;
}
log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans));
// 查看套轴对接位是否满了
// todo: 这里需要注意不要去校验071的任务不然提前释放货位没意义。
List<BstIvtCutpointivt> emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1",
"1", location, "0");
// 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满
if (emptyShaftPoint.size() == 0) {
log.info("暂存位没有空位!正在检测是否存在半个点位!");
// 校验是否存在半个位置,且有分切计划
// 获取只有一个位置的点位
List<BstIvtCutpointivt> halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1",
"1", location);
List<String> qzzs = halfPlacePoint.stream()
.map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2())
.collect(Collectors.toList()); .collect(Collectors.toList());
if (plans.size() == 0) { if (qzzs.size() == 0) {
log.info("没有半个点位,或者对应的另一半分切计划没有找到!");
// 如果不需要套轴,就只做拔轴 // 如果不需要套轴,就只做拔轴
makePullShaft(empty, specification); makePullShaft(empty, specification);
return; return;
} }
log.info("获取过滤后的分切计划数据:{}", JSON.toJSONString(plans)); // 从寻查找分切计划并放在plans, 没有考虑区域问题, 里面会考虑代数
// 查看套轴对接位是否满了 plans = slittingproductionplanService.getAllHalfPlan(qzzs);
// todo: 这里需要注意不要去校验071的任务不然提前释放货位没意义。 if (plans.size() == 0) {
List<BstIvtCutpointivt> emptyShaftPoint = bcutpointivtService.getAreaNotTaskPointByStatus("1", log.info("没有找到对应的另一半分切计划没有找到");
"1", location, "0"); // 如果不需要套轴,就只做拔轴
// 如果满了就只做拔轴 预留一个货位?,防止套轴直接站满 makePullShaft(empty, specification);
if (emptyShaftPoint.size() == 0) {
log.info("暂存位没有空位!正在检测是否存在半个点位!");
// 校验是否存在半个位置,且有分切计划
// 获取只有一个位置的点位
List<BstIvtCutpointivt> halfPlacePoint = bcutpointivtService.getAllHalfPlacePoints("1",
"1", location);
List<String> qzzs = halfPlacePoint.stream()
.map(p -> ObjectUtil.isNotEmpty(p.getQzz_no1()) ? p.getQzz_no1() : p.getQzz_no2())
.collect(Collectors.toList());
if (qzzs.size() == 0) {
log.info("没有半个点位,或者对应的另一半分切计划没有找到!");
// 如果不需要套轴,就只做拔轴
makePullShaft(empty, specification);
return;
}
// 从寻查找分切计划并放在plans, 没有考虑区域问题, 里面会考虑代数
plans = slittingproductionplanService.getAllHalfPlan(qzzs);
if (plans.size() == 0) {
log.info("没有找到对应的另一半分切计划没有找到");
// 如果不需要套轴,就只做拔轴
makePullShaft(empty, specification);
return;
}
log.info("找到对应的另一半的计划 - {}", plans);
}
// 获取一个分切计划的Dto。如果是6寸可以直接使用、如果是3寸需要判断当前位置是否满足
// todo: 需要校验分切设备是在对应的区域中
SlitterPlanDistinctDto planDto = plans.stream()
.filter(planD -> "6".equals(planD.getQzz_size()) ||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation())))
.findFirst()
.orElse(null);
if (planDto == null) {
log.warn("过滤3/6寸和代数输出结果为空跳过此次套轴。此时点位对应代数{}", specification);
return; return;
} }
log.info("此时获取的分切计划dto: {}", planDto); log.info("找到对应的另一半的计划 - {}", plans);
// 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划 }
List<PdmBiSlittingproductionplan> needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>() // 获取一个分切计划的Dto。如果是6寸可以直接使用、如果是3寸需要判断当前位置是否满足
// todo: 需要校验分切设备是在对应的区域中
SlitterPlanDistinctDto planDto = plans.stream()
.filter(planD -> "6".equals(planD.getQzz_size()) ||
("3".equals(planD.getQzz_size()) && specification.equals(planD.getQzz_generation())))
.findFirst()
.orElse(null);
if (planDto == null) {
log.warn("过滤3/6寸和代数输出结果为空跳过此次套轴。此时点位对应代数{}", specification);
return;
}
log.info("此时获取的分切计划dto: {}", planDto);
// 获取分切计划dto中对应的需要套轴的分切计划 最多两个计划
List<PdmBiSlittingproductionplan> needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name())
.eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name())
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down())
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group())
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES));
if (needPlans.size() == 0) {
// 可能是改切所以换成restruct_container_name来使用
needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>()
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name()) .eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name())
.eq(PdmBiSlittingproductionplan::getParent_container_name, planDto.getParent_container_name()) .eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name())
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down()) .eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down())
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group()) .eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group())
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO) .eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO)
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES)); .eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES));
if (needPlans.size() == 0) { }
// 可能是改切所以换成restruct_container_name来使用 log.info("通过dto获取的分切计划{}", needPlans);
needPlans = slittingproductionplanService.list(new LambdaQueryWrapper<PdmBiSlittingproductionplan>() // 获取其中一条
.eq(PdmBiSlittingproductionplan::getResource_name, planDto.getResource_name()) PdmBiSlittingproductionplan needPlan = needPlans.get(0);
.eq(PdmBiSlittingproductionplan::getRestruct_container_name, planDto.getParent_container_name()) String qzzSize = needPlan.getQzz_size();
.eq(PdmBiSlittingproductionplan::getUp_or_down, planDto.getUp_or_down()) // 从套轴对接位获取相同气涨轴大小
.eq(PdmBiSlittingproductionplan::getSplit_group, planDto.getSplit_group()) // update: 不需要(同标箔或者锂电分开)
.eq(PdmBiSlittingproductionplan::getIs_delete, SlitterConstant.SLITTER_NO) // todo: 需要校验区域0/1
.eq(PdmBiSlittingproductionplan::getIs_paper_ok, SlitterConstant.SLITTER_YES)); List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification);
} if (qzzPoint.size() == 0) {
log.info("通过dto获取的分切计划{}", needPlans);
// 获取其中一条
PdmBiSlittingproductionplan needPlan = needPlans.get(0);
String qzzSize = needPlan.getQzz_size();
// 从套轴对接位获取相同气涨轴大小
// update: 不需要(同标箔或者锂电分开)
// todo: 需要校验区域0/1
List<BstIvtCutpointivt> qzzPoint = bcutpointivtService.getPointByTypeAndShaftSize("1", qzzSize, specification);
if (qzzPoint.size() == 0) {
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
// 调用ACS滚条气涨轴下来
toAcsOutShaft(qzzSize, location, empty);
toCallAgvMovePaperTube(needPlans, location, empty);
return;
}
// 查找一条没任务的点位
BstIvtCutpointivt startPoint = qzzPoint.get(0);
if (ObjectUtil.isEmpty(startPoint)) {
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
// 如果不存在,则发起信号滚气涨轴
// 调用ACS滚条气涨轴下来
toAcsOutShaft(qzzSize, location, empty);
toCallAgvMovePaperTube(needPlans, location, empty);
return;
}
// 创建任务
JSONObject param = new JSONObject();
param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2());
param.put("point_code2", empty.getPoint_code());
param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
// 气胀轴号
param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
param.put("needPlan", planDto);
// 是否拔轴
param.put("is_pulling", SlitterConstant.SLITTER_YES);
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("qzz_size", needPlan.getQzz_size());
// 所需的纸管规格
SlitterTaskUtil.putNeedPaperSpec(param, needPlans);
// 当前纸管的规格信息
String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2();
if (oldQzzNo == null) {
throw new BadRequestException("当前气胀轴的编码为空!");
}
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize); saveCutPlanMessage(empty, needPlans, qzzSize);
// 设置是否套轴1正常套轴2待定到后面还会申请套轴 // 调用ACS滚条气涨轴下来
setIsSleeveShaft(param); toAcsOutShaft(qzzSize, location, empty);
// 最多两条
List<PdmBiSlittingproductionplan> oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo);
SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans);
// 套管数量
param.put("casingCount", needPlans.size());
// 拔管数量
param.put("pullCount", oldPlans.size());
param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()));
trussCallAirShaftTask.createTask(param);
toCallAgvMovePaperTube(needPlans, location, empty); toCallAgvMovePaperTube(needPlans, location, empty);
// 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴) return;
needPlans.forEach(p -> { }
p.setIs_paper_ok("2"); // 查找一条没任务的点位
TaskUtils.updateOptMessageBySlitterPlan(p); BstIvtCutpointivt startPoint = qzzPoint.get(0);
}); if (ObjectUtil.isEmpty(startPoint)) {
slittingproductionplanService.updateBatchById(needPlans); // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
// 如果不存在,则发起信号滚气涨轴
// 调用ACS滚条气涨轴下来
toAcsOutShaft(qzzSize, location, empty);
toCallAgvMovePaperTube(needPlans, location, empty);
return;
}
// 创建任务
JSONObject param = new JSONObject();
param.put("point_code1", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getTruss_point_code1() : startPoint.getTruss_point_code2());
param.put("point_code2", empty.getPoint_code());
param.put("vehicle_code", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
// 气胀轴号
param.put("qzz_no", ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2());
param.put("needPlan", planDto);
// 是否拔轴
param.put("is_pulling", SlitterConstant.SLITTER_YES);
param.put("task_type", SlitterEnum.TASK_TYPE.code("穿拔轴缓存<>穿拔轴位"));
param.put("product_area", SlitterConstant.SLITTER_TASK_AREA);
param.put("qzz_size", needPlan.getQzz_size());
// 所需的纸管规格
SlitterTaskUtil.putNeedPaperSpec(param, needPlans);
// 当前纸管的规格信息
String oldQzzNo = ObjectUtil.isNotEmpty(startPoint.getQzz_no1())
? startPoint.getQzz_no1() : startPoint.getQzz_no2();
if (oldQzzNo == null) {
throw new BadRequestException("当前气胀轴的编码为空!");
}
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
saveCutPlanMessage(empty, needPlans, qzzSize);
// 设置是否套轴1正常套轴2待定到后面还会申请套轴
setIsSleeveShaft(param);
// 最多两条
List<PdmBiSlittingproductionplan> oldPlans = slittingproductionplanService.getByQzzNo(oldQzzNo);
SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans);
// 套管数量
param.put("casingCount", needPlans.size());
// 拔管数量
param.put("pullCount", oldPlans.size());
param.put("containers", oldPlans.stream().map(PdmBiSlittingproductionplan::getContainer_name).collect(Collectors.toList()));
trussCallAirShaftTask.createTask(param);
toCallAgvMovePaperTube(needPlans, location, empty);
// 将分切计划is_paper_ok 1(纸管已经准备好) -> 2(已经套轴)
needPlans.forEach(p -> {
p.setIs_paper_ok("2");
TaskUtils.updateOptMessageBySlitterPlan(p);
}); });
slittingproductionplanService.updateBatchById(needPlans);
} }
/** /**

View File

@@ -409,8 +409,6 @@ public class SlitterServiceImpl implements SlitterService {
if (shafttubeivts.size() == 0) { if (shafttubeivts.size() == 0) {
throw new BadRequestException("未找到可存放气涨轴规格「" + qzzSize + "」的空暂存位"); throw new BadRequestException("未找到可存放气涨轴规格「" + qzzSize + "」的空暂存位");
} }
// todo: 过滤空位后面是否有轴的位置
BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0);
RLock lockPoint = redissonClient.getLock(shafttubeivt.getPoint_code()); RLock lockPoint = redissonClient.getLock(shafttubeivt.getPoint_code());
boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS); boolean tryLockPoint = lockPoint.tryLock(0, TimeUnit.SECONDS);
@@ -1975,6 +1973,7 @@ public class SlitterServiceImpl implements SlitterService {
plan.setIs_parent_ok("0"); plan.setIs_parent_ok("0");
plan.setIs_child_tz_ok("0"); plan.setIs_child_tz_ok("0");
plan.setIs_child_ps_ok("0"); plan.setIs_child_ps_ok("0");
plan.setPaper_weight("0");
plan.setQzzno(""); plan.setQzzno("");
plan.setIs_delete("0"); plan.setIs_delete("0");
plan.setSale_order_name("-"); plan.setSale_order_name("-");

View File

@@ -127,6 +127,11 @@ public enum IOSEnum {
"子卷下线行架任务", "16","退货入库行架任务", "14","RGV输送任务", "15", "子卷下线行架任务", "16","退货入库行架任务", "14","RGV输送任务", "15",
"木箱堆叠行架任务", "17" "木箱堆叠行架任务", "17"
)), )),
// acs反馈异常出库
ACS_EXCEPTIONAL_TYPE(MapOf.of("入库满入", "1","浅货位有货(入库)", "4",
"出库空出", "2","浅货位有货(出库)", "3"
)),
; ;
private Map<String, String> code; private Map<String, String> code;

View File

@@ -138,4 +138,11 @@ public interface IStIvtIostorinvOutService extends IService<StIvtIostorinv> {
* @param whereJson: 任务对象 * @param whereJson: 任务对象
*/ */
void finishTask(JSONObject whereJson); void finishTask(JSONObject whereJson);
/**
* 出库浅货位有货阻挡异常处理
* @param whereJson /
* @return String 任务标识
*/
String taskExceptionalOut(JSONObject whereJson);
} }

View File

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.b_lms.pdm_manage.enums.SUBEnum; import org.nl.b_lms.pdm_manage.enums.SUBEnum;
import org.nl.b_lms.sch.tasks.TwoExcepionalMoveTask;
import org.nl.b_lms.sch.tasks.TwoOutExceptionalTask; import org.nl.b_lms.sch.tasks.TwoOutExceptionalTask;
import org.nl.b_lms.sch.tasks.TwoOutTask; import org.nl.b_lms.sch.tasks.TwoOutTask;
import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService;
@@ -1051,6 +1052,45 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
} }
} }
@Override
@Transactional
public String taskExceptionalOut(JSONObject jsonObject) {
// 任务表
WQLObject taskService = WQLObject.getWQLObject("sch_base_task");
// 仓位表
WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr");
JSONObject jsonTask = taskService.query("task_code = '" + jsonObject.getString("task_code") + "'").uniqueResult(0);
// 找出对应的浅货位
JSONObject jsonAttrOrder = attrTab.query("struct_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0);
JSONObject jsonAttrNow = attrTab.query("row_num = '" + jsonAttrOrder.getString("row_num") + "' AND layer_num = '" + jsonAttrOrder.getString("layer_num") + "' AND col_num = '" + jsonAttrOrder.getString("col_num") + "' and zdepth = '" + IOSEnum.ZDEPTH_STRUCT.code("") + "' and stor_id = '" + jsonAttrOrder.getString("stor_id") + "' and is_delete = '0' and is_used = '1'")
.uniqueResult(0);
if (ObjectUtil.isEmpty(jsonAttrNow)) {
throw new BadRequestException("对应浅货位不存在或未启用!" + jsonTask.getString("point_code1"));
}
// 锁住仓位
jsonAttrNow.put("lock_type", IOSEnum.LOCK_TYPE.code("货位异常出库锁"));
attrTab.update(jsonAttrNow);
// 生成任务
JSONObject taskParam = new JSONObject();
taskParam.put("start_device_code", jsonAttrNow.getString("struct_code"));
taskParam.put("next_device_code", IOSEnum.OUT_POINT.code(jsonAttrNow.getString("row_num")));
taskParam.put("task_type", "010712");
taskParam.put("car_no", "此货位LMS系统未有库存请待出至【CK2001】点位后确认实物并重新手工入回库!");
taskParam.put("vehicle_code",IOSEnum.IS_NOTANDYES.code(""));
TwoExcepionalMoveTask taskBean = new TwoExcepionalMoveTask();
String task_id = taskBean.createTask(taskParam);
taskBean.immediateNotifyAcs(null);
return task_id;
}
/** /**
* 创建调拨入库单 * 创建调拨入库单
* @param disDaoList出库分配明细集合 * @param disDaoList出库分配明细集合

View File

@@ -339,6 +339,9 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
jsonAttr = attrTab.query("sect_id = '" + jsonObject.getString("sect_id") + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0); jsonAttr = attrTab.query("sect_id = '" + jsonObject.getString("sect_id") + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0);
} else { } else {
//TODO jsonAttr = inBussManageService.getOneStruct(attrParam); //TODO jsonAttr = inBussManageService.getOneStruct(attrParam);
if (ObjectUtil.isNotEmpty(whereJson.get("in_buss"))) {
attrParam.put("move_block_num", MapUtil.getStr(whereJson, "move_block_num"));
}
jsonAttr = twoInBussManageService.getOneStruct(attrParam); jsonAttr = twoInBussManageService.getOneStruct(attrParam);
} }
} else { } else {

View File

@@ -379,6 +379,9 @@ public class InBussManageServiceImpl implements InBussManageService {
.eq(StIvtIostorinvdtl::getIostorinvdtl_id, disList.get(0).get("iostorinvdtl_id")) .eq(StIvtIostorinvdtl::getIostorinvdtl_id, disList.get(0).get("iostorinvdtl_id"))
).get(0); ).get(0);
// 获取当前巷道
JSONObject jsonAttr = attrTab.query("struct_code = '" + taskDao.getPoint_code2() + "'").uniqueResult(0);
JSONObject jsonDiv = new JSONObject(); JSONObject jsonDiv = new JSONObject();
jsonDiv.put("dtl_row", JSONObject.parseObject(JSON.toJSONString(dtlDao))); jsonDiv.put("dtl_row", JSONObject.parseObject(JSON.toJSONString(dtlDao)));
jsonDiv.put("tableMater", disList); jsonDiv.put("tableMater", disList);
@@ -386,6 +389,8 @@ public class InBussManageServiceImpl implements InBussManageService {
jsonDiv.put("is_send", IOSEnum.IS_SEND.code("")); jsonDiv.put("is_send", IOSEnum.IS_SEND.code(""));
jsonDiv.put("sect_id", IOSEnum.SECT_ID.code("二期主存区")); jsonDiv.put("sect_id", IOSEnum.SECT_ID.code("二期主存区"));
jsonDiv.put("stor_id", IOSEnum.STOR_ID.code("二期")); jsonDiv.put("stor_id", IOSEnum.STOR_ID.code("二期"));
jsonDiv.put("move_block_num", jsonAttr.getString("block_num"));
jsonDiv.put("in_buss", IOSEnum.IS_NOTANDYES.code(""));
iStIvtIostorinvService.divStruct(jsonDiv); iStIvtIostorinvService.divStruct(jsonDiv);

View File

@@ -35,6 +35,7 @@ import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService;
import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.enums.TASKEnum; import org.nl.b_lms.storage_manage.ios.enums.TASKEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.*; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.*;
import org.nl.common.enums.NoticeTypeEnum; import org.nl.common.enums.NoticeTypeEnum;
import org.nl.common.enums.PackageInfoIvtEnum; import org.nl.common.enums.PackageInfoIvtEnum;
@@ -83,7 +84,7 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class AcsToWmsServiceImpl implements AcsToWmsService { public class AcsToWmsServiceImpl implements AcsToWmsService {
private static Interner<String> Heap_Lock = Interners.newWeakInterner(); private static Map<String,String> Task_Status_Convers = MapOf.of("1",TaskStatusEnum.EXECUTING.getCode(),"2",TaskStatusEnum.FINISHED.getCode(),"3","0");
private final RawAssistIStorService rawAssistIStorService; private final RawAssistIStorService rawAssistIStorService;
@@ -162,6 +163,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
@Autowired @Autowired
private ProductOutTwoService productOutTwoService; private ProductOutTwoService productOutTwoService;
@Autowired
private IStIvtIostorinvOutService iStIvtIostorinvOutService;
/** /**
* task_id任务标识 * task_id任务标识
@@ -185,38 +189,27 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try { try {
if (tryLock) { if (tryLock) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); JSONObject task = WQLObject.getWQLObject("SCH_BASE_Task")
.query("task_id = '" + task_id + "'")
.uniqueResult(0);
if (StrUtil.isNotEmpty(row.getString("car_no"))) { if (StrUtil.isNotEmpty(row.getString("car_no"))) {
taskObj.put("car_no", row.getString("car_no")); WQLObject.getWQLObject("SCH_BASE_Task")
WQLObject.getWQLObject("SCH_BASE_Task").update(taskObj); .update(MapOf.of("car_no",row.getString("car_no")),"task_id = '" + task_id + "'");
} }
// 任务处理类 AbstractAcsTask abstractTask = (AbstractAcsTask)SpringContextHolder.getBean(Class.forName(task.getString("handle_class")));
String processing_class = taskObj.getString("handle_class"); abstractTask.updateTaskStatus(task,Task_Status_Convers.get(row.getString("task_status")));
AbstractAcsTask abstractTask = (AbstractAcsTask)SpringContextHolder.getBean(Class.forName(processing_class));
String status = "";
if ("1".equals(row.getString("task_status"))) {
status = TaskStatusEnum.EXECUTING.getCode();
}
if ("2".equals(row.getString("task_status"))) {
status = TaskStatusEnum.FINISHED.getCode();
}
if ("3".equals(row.getString("task_status"))) {
status = "0";
}
abstractTask.updateTaskStatus(taskObj,status);
} else { } else {
throw new BadRequestException("任务标识为:" + task_id + "的任务正在操作中!"); throw new BadRequestException("任务标识为:" + task_id + "的任务正在操作中!");
} }
}catch (Exception ex){ }catch (Exception ex){
WQLObject.getWQLObject("SCH_BASE_Task").update(MapOf.of("remark",DateUtil.now()+"更新"+row.getString("task_status")+"失败:"+ex.getMessage()),"task_id = '" + task_id + "'"); WQLObject.getWQLObject("SCH_BASE_Task").update(MapOf.of("remark",DateUtil.now()+"更新"+row.getString("task_status")+"失败:"+ex.getMessage()),"task_id = '" + task_id + "'");
log.error(task_id+"acs更新任务失败:{}", ex); log.error(task_id+"acs更新任务失败:{}", ex);
throw new BadRequestException(ex.getMessage()); throw ex;
}finally { }finally {
if (lock.isLocked() && lock.isHeldByCurrentThread()) { if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock(); lock.unlock();
} }
} }
} }
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value()); result.put("status", HttpStatus.OK.value());
@@ -2260,40 +2253,40 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
// 判断任务类型 // 判断任务类型
if (taskDao.getTask_type().equals(TASKEnum.BOX_TYPE.code("木箱入库"))) { if (taskDao.getTask_type().equals(TASKEnum.BOX_TYPE.code("木箱入库"))) {
// 木箱入库:满入、浅货位有货-放货时 // 木箱入库:满入、浅货位有货-放货时
if (type.equals("1") || type.equals("4")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("入库满入")) || type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(入库)"))) {
point_code = inBoxManageService.taskExceptional(whereJson); point_code = inBoxManageService.taskExceptional(whereJson);
} }
} else if (taskDao.getTask_type().equals(TASKEnum.BOX_TYPE.code("木箱出库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.BOX_TYPE.code("木箱出库"))) {
// 木箱出库:空出、浅货位有货-取货时 // 木箱出库:空出、浅货位有货-取货时
if (type.equals("2")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("出库空出"))) {
point_code = outBoxManageService.taskExceptional(whereJson); point_code = outBoxManageService.taskExceptional(whereJson);
} }
if (type.equals("3")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(出库)"))) {
String task_id = outBoxManageService.taskExceptionalOut(whereJson); String task_id = outBoxManageService.taskExceptionalOut(whereJson);
result.put("task_id", task_id); result.put("task_id", task_id);
} }
} else if (taskDao.getTask_type().equals(TASKEnum.VEHICLE_TYPE.code("托盘入库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.VEHICLE_TYPE.code("托盘入库"))) {
// 托盘入库:满入、浅货位有货-放货时 // 托盘入库:满入、浅货位有货-放货时
if (type.equals("1") || type.equals("4")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("入库满入")) || type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(入库)"))) {
point_code = inVehicleManageService.taskExceptional(whereJson); point_code = inVehicleManageService.taskExceptional(whereJson);
} }
} else if (taskDao.getTask_type().equals(TASKEnum.VEHICLE_TYPE.code("托盘出库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.VEHICLE_TYPE.code("托盘出库"))) {
// 托盘出库:空出、浅货位有货-取货时 // 托盘出库:空出、浅货位有货-取货时
if (type.equals("2")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("出库空出"))) {
point_code = outVehicleManageService.taskExceptional(whereJson); point_code = outVehicleManageService.taskExceptional(whereJson);
} }
if (type.equals("3")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(出库)"))) {
String task_id = outVehicleManageService.taskExceptionalOut(whereJson); String task_id = outVehicleManageService.taskExceptionalOut(whereJson);
result.put("task_id", task_id); result.put("task_id", task_id);
} }
} else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("成品入库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("成品入库"))) {
// 成品入库:满入、浅货位有货-放货时 // 成品入库:满入、浅货位有货-放货时
if (type.equals("1") || type.equals("4")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("入库满入")) || type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(入库)"))) {
point_code = inBussManageService.taskExceptional(whereJson); point_code = inBussManageService.taskExceptional(whereJson);
} }
} else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("成品出库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("成品出库"))) {
// 成品出库:空出 // 成品出库:空出
if (type.equals("2")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("出库空出"))) {
taskDao.setRemark("【空出】请检查货位库存!"); taskDao.setRemark("【空出】请检查货位库存!");
taskDao.setCar_no("【空出】请检查货位库存!"); taskDao.setCar_no("【空出】请检查货位库存!");
taskService.updateById(taskDao); taskService.updateById(taskDao);
@@ -2304,11 +2297,16 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
log.info("deviceApplyExceptional返回参数---------------------------------------------" + result.toString()); log.info("deviceApplyExceptional返回参数---------------------------------------------" + result.toString());
return result; return result;
} }
if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(出库)"))) {
// 浅货位阻挡-取货时
String task_id = iStIvtIostorinvOutService.taskExceptionalOut(whereJson);
result.put("task_id", task_id);
}
} else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("立库转库"))) { } else if (taskDao.getTask_type().equals(TASKEnum.PROUD_TYPE.code("立库转库"))) {
// 立库转库:满入、浅货位有货-放货时 // 立库转库:满入、浅货位有货-放货时
if (type.equals("1") || type.equals("4")) { if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("入库满入")) || type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(入库)"))) {
point_code = outBussManageService.taskExceptional(whereJson); point_code = outBussManageService.taskExceptional(whereJson);
} else if (type.equals("2")) { } else if (type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("出库空出"))) {
// 立库转库空出 // 立库转库空出
taskDao.setRemark("【空出】请检查货位库存!"); taskDao.setRemark("【空出】请检查货位库存!");
taskDao.setCar_no("【空出】请检查货位库存!"); taskDao.setCar_no("【空出】请检查货位库存!");
@@ -2322,7 +2320,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
} }
} }
if (!type.equals("3") && ObjectUtil.isEmpty(point_code)) { if (!type.equals(IOSEnum.ACS_EXCEPTIONAL_TYPE.code("浅货位有货(出库)")) && ObjectUtil.isEmpty(point_code)) {
throw new BadRequestException("立库异常任务处理失败,仓位为空!"); throw new BadRequestException("立库异常任务处理失败,仓位为空!");
} }