opt:现场问题的一些处理与优化。

This commit is contained in:
2025-09-02 14:22:20 +08:00
parent 9c6cb85e50
commit 4781928cf2
27 changed files with 312 additions and 155 deletions

View File

@@ -52,7 +52,7 @@ public class StartDecisionChainer extends DecisionerChain<List> {
list = iStIvtStructattrService.list(query);
}else {
//出库流程由于有货货位较多会生成多个对象容易内存益出在fifo中直接通过materilal过滤目标
// list = iStIvtStructattrService.structVehicle(MapOf.of("stor_code",startParam.getString("stor_code")));
//list = iStIvtStructattrService.structVehicle(MapOf.of("stor_code",startParam.getString("stor_code")));
}
return list;
}

View File

@@ -49,7 +49,8 @@ public class AlleyAveRuleHandler extends Decisioner<StIvtStructattr, JSONObject>
public List<StIvtStructattr> handler(List<StIvtStructattr> list, JSONObject param) {
// 判断仓位是否为空
if (CollectionUtils.isEmpty(list)) {
throw new BadRequestException("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位");
log.error("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位");
return Collections.emptyList();
}
long startTime1 = System.currentTimeMillis();
if (ObjectUtils.isNotEmpty(list)) {
@@ -95,7 +96,7 @@ public class AlleyAveRuleHandler extends Decisioner<StIvtStructattr, JSONObject>
log.info("均衡策略:载具号:" + param.getString("vehicle_code") + "获取仓位耗时:{}", System.currentTimeMillis() - startTime1);
if (subList.size() == 0) {
log.error("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略货位数量为0");
throw new BadRequestException("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略货位数量为0");
return Collections.emptyList();
}
return subList;
}

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
@@ -13,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -45,14 +45,19 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
*/
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, JSONObject param) {
// 判断仓位是否为空
if (CollectionUtils.isEmpty(list)) {
log.error("限位策略:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位");
return Collections.emptyList();
}
long startTime1 = System.currentTimeMillis();
// 判断仓位是否为空
// 判断策略类型
String vehicleCode = param.getString("vehicle_code");
BmVehicleInfo vehileInfo = bmVehicleInfoService.vehileInfo(vehicleCode);
if (vehileInfo == null) {
throw new BadRequestException("限位策略,当前载具信息不存在:" + vehicleCode + "!");
}
// if (vehileInfo == null) {
// throw new BadRequestException("限位策略,当前载具信息不存在:" + vehicleCode + "!");
// }
//限位策略特殊处理
String start_point = param.getString("start_point");
String errorTask = param.getString("errorTask");
@@ -66,10 +71,10 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
log.info("限位策略:任务类型为入满或出阻挡任务,载具号:" + vehicleCode + "排除小于3排的仓位成功");
}
}
List<StIvtStructattr> result = inHandler(list, vehileInfo);
List<StIvtStructattr> result = inHandler(list, vehileInfo, param.getString("height"));
if (CollectionUtils.isEmpty(result)) {
log.error("限位策略:载具号:" + vehicleCode + "获取仓位失败该高度等级对应库位数量为0");
throw new BadRequestException("限位策略:载具号:" + vehicleCode + "获取仓位失败该高度等级对应库位数量为0");
return Collections.emptyList();
}
log.info("限位策略:起点为" + start_point + ",载具号:" + vehicleCode + "执行策略后仓位位数为:" + result.size() + ",第一个仓位为:" + result.get(0).getStruct_code());
log.info("限位策略:载具号:" + vehicleCode + "获取仓位耗时:{}", System.currentTimeMillis() - startTime1);
@@ -78,26 +83,36 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
/**
* 入库策略:判断货位的长宽高
*
* @param attrList :仓位集合
* @param vehicle 物料标识、width: 宽度、 height高度、zdepth深度
* @param vehicle 物料标识、width: 宽度、 height高度、zdepth深度
* @return List<StIvtStructattr> :仓位集合
*/
private List<StIvtStructattr> inHandler(List<StIvtStructattr> attrList, BmVehicleInfo vehicle) {
private List<StIvtStructattr> inHandler(List<StIvtStructattr> attrList, BmVehicleInfo vehicle, String height) {
//限制条件:限制哪些
List<String> limits = JSONArray.parseArray(strategyConfig.getParam(), String.class);
Predicate<StIvtStructattr> eqLimt= stIvtStructattr -> {
if (vehicle == null) {
height = StringUtils.isBlank(height) ? "3" : height;
vehicle = new BmVehicleInfo();
vehicle.setH(Integer.parseInt(height));
vehicle.setW(0);
vehicle.setL(0);
vehicle.setWeight(0);
}
BmVehicleInfo finalVehicle = vehicle;
Predicate<StIvtStructattr> eqLimt = stIvtStructattr -> {
Boolean result = Boolean.TRUE;
if (limits.contains("h")){
result = result && stIvtStructattr.getH()==vehicle.getH();
if (limits.contains("h")) {
result = result && stIvtStructattr.getH() == finalVehicle.getH();
}
if (limits.contains("w")){
result = result && stIvtStructattr.getW()==vehicle.getW();
if (limits.contains("w")) {
result = result && stIvtStructattr.getW() == finalVehicle.getW();
}
if (limits.contains("l")){
result = result && stIvtStructattr.getL()==vehicle.getL();
if (limits.contains("l")) {
result = result && stIvtStructattr.getL() == finalVehicle.getL();
}
if (limits.contains("weight")){
result = result && stIvtStructattr.getWeight()==vehicle.getWeight();
if (limits.contains("weight")) {
result = result && stIvtStructattr.getWeight() == finalVehicle.getWeight();
}
return result;
};
@@ -111,16 +126,16 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
Predicate<StIvtStructattr> ltLimt = stIvtStructattr -> {
Boolean result = Boolean.TRUE;
if (limits.contains("h")){
result = result && stIvtStructattr.getH()>vehicle.getH();
result = result && stIvtStructattr.getH()>finalVehicle.getH();
}
if (limits.contains("w")){
result = result && stIvtStructattr.getW()>vehicle.getW();
result = result && stIvtStructattr.getW()>finalVehicle.getW();
}
if (limits.contains("l")){
result = result && stIvtStructattr.getL()>vehicle.getL();
result = result && stIvtStructattr.getL()>finalVehicle.getL();
}
if (limits.contains("weight")){
result = result && stIvtStructattr.getWeight()>vehicle.getWeight();
result = result && stIvtStructattr.getWeight()>finalVehicle.getWeight();
}
return result;
};

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
@@ -12,10 +11,7 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/*
@@ -32,11 +28,13 @@ public class DepthPriorityHandler extends Decisioner<StIvtStructattr, JSONObject
//现场1/4排深位
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, JSONObject param) {
if (CollectionUtils.isNotEmpty(list)) {
//托盘库和扩展库不需要深位判断
if (list.get(0).getStor_code().equals(StatusEnum.STOCK_INFO.code("托盘库")) || "LXBCP02".equals(list.get(0).getSect_code())) {
return list;
}
if (CollectionUtils.isEmpty(list)) {
log.error("深位优先策略:载具号:" + param.getString("vehicle_code") + "无可用仓位进行分配!");
return Collections.emptyList();
}
//托盘库和扩展库不需要深位判断
if (list.get(0).getStor_code().equals(StatusEnum.STOCK_INFO.code("托盘库")) || "LXBCP02".equals(list.get(0).getSect_code())) {
return list;
}
long startTime1 = System.currentTimeMillis();
List<StIvtStructattr> returnResult = new ArrayList<>();
@@ -123,7 +121,7 @@ public class DepthPriorityHandler extends Decisioner<StIvtStructattr, JSONObject
}
if (CollectionUtils.isEmpty(combinedResult)) {
log.error("深位优先策略:获取深货位有货且浅货位无货仓位:载具号:" + param.getString("vehicle_code") + "获取仓位失败该策略对应库位数量为0");
throw new BadRequestException("深位优先策略:获取深货位有货且浅货位无货仓位:载具号:" + param.getString("vehicle_code") + "获取仓位失败该策略对应库位数量为0");
return Collections.emptyList();
}
log.info("深位优先策略:载具号:" + param.getString("vehicle_code") + "分配结果: 深货位有货且浅货位无货仓位,无需移库,分配仓位:" + combinedResult.get(0).getStruct_code());
log.info("深位优先策略:获取深货位有货且浅货位无货仓位耗时:{}", System.currentTimeMillis() - startTime1);

View File

@@ -91,6 +91,13 @@ public class SchBaseTaskController {
iSchBaseTaskService.taskSchedule(list);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping ("/delCtuIvt")
@Log("清除CTU库库存")
public ResponseEntity<Object> delCtuIvt() {
iSchBaseTaskService.deleteCtuIvt();
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/taskMsgSchedule")
public ResponseEntity<Object> taskMsgSchedule() {
return new ResponseEntity<>(HttpStatus.OK);

View File

@@ -115,6 +115,6 @@ public class ConveyorOutStorageTask extends AbstractTask {
@Override
public void cancel(JSONObject data) {
this.updateTask(data);
}
}

View File

@@ -141,6 +141,6 @@ public class GroupDickInStorageTask extends AbstractTask {
@Override
public void cancel(JSONObject data) {
this.updateTask(data);
}
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
@@ -17,6 +18,7 @@ import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -103,6 +105,14 @@ public class InStorageTask extends AbstractTask {
@Override
public void cancel(JSONObject data) {
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
// 更新终点
iStIvtStructattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.eq(StIvtStructattr::getStruct_code, schBaseTask.getPoint_code2())
.set(StIvtStructattr::getVehicle_code, null)
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁")));
this.updateTask(data);
}
}

View File

@@ -162,6 +162,6 @@ public class PalletInStorageTask extends AbstractTask {
@Override
public void cancel(JSONObject data) {
this.updateTask(data);
}
}

View File

@@ -104,6 +104,6 @@ public class PickStorageTask extends AbstractTask {
@Override
public void cancel(JSONObject data) {
this.updateTask(data);
}
}

View File

@@ -8,6 +8,7 @@ import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.dispatch_manage.task.service.dto.SchBaseTaskQuery;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
@@ -55,10 +56,15 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
* @param ids /
*/
void deleteAll(Set<String> ids);
public void deleteCtuStruct();
void taskSchedule(List<SchBaseTask> list);
@Transactional(rollbackFor = Exception.class)
void deleteCtuIvt();
/**
* 任务操作
*

View File

@@ -32,7 +32,9 @@ public interface SchBaseTaskMapper extends BaseMapper<SchBaseTask> {
int updateVehiclemater();
int updateStructattr();
int updateCStockIvt();
List<SchBaseTask> getTaskList(Set<String> pointCodes1, Set<String> pointCodes2, Set<String> pointCodes3, Set<String> pointCodes4);

View File

@@ -133,7 +133,8 @@
<update id="updateVehiclemater">
UPDATE `md_pb_vehiclemater` SET is_delete='1' WHERE vehicle_code in (SELECT vehicle_code FROM `st_ivt_structattr` WHERE stor_code ='CStockId' AND vehicle_code IS NOT NULL AND lock_type ='00')
</update>
<update id="updateStructattr">
UPDATE `st_ivt_structattr` SET vehicle_code=null,lock_type='00' WHERE stor_code ='CStockId' AND vehicle_code IS NOT NULL AND lock_type ='00'
<update id="updateCStockIvt">
UPDATE `st_ivt_structattr` SET vehicle_code=null,lock_type='00' WHERE stor_code iN ('CStockId','HStockId') AND is_used ='1'
</update>
</mapper>

View File

@@ -0,0 +1,29 @@
package org.nl.wms.dispatch_manage.task.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author lyd
* @date 2023-05-15
**/
@Data
public class SchBaseTaskDto implements Serializable {
private String id;
private String task_code;
private String task_type;
private String status;
private String vehicle_code;
private String vehicle_type;
private String point_code1;
private String point_code2;
private String point_code3;
private String point_code4;
private String priority;
private String acs_type;
private String remark;
private String agv_system_type;
}

View File

@@ -152,13 +152,18 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
this.removeByIds(ids);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteCtuStruct() {
public void deleteCtuIvt() {
if (schBaseTaskMapper.selectList(new LambdaUpdateWrapper<SchBaseTask>().in(SchBaseTask::getTask_type, "80", "81", "82", "83").lt(SchBaseTask::getStatus, "80")).size() > 0) {
throw new BadRequestException("存在正在执行的CTU出入库任务未完成请等待或手动将任务完成后再清除库存");
}
schBaseTaskMapper.updateVehiclemater();
schBaseTaskMapper.updateStructattr();
schBaseTaskMapper.updateCStockIvt();
}
@Override
public void taskSchedule(List<SchBaseTask> list) {
list = list.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成")) && "2114".equals(r.getPoint_code2())).collect(Collectors.toList());
@@ -211,7 +216,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
}
param.put("group_code", task.getGroup_code());
if (task.getStatus().equals(StatusEnum.FORM_STATUS.code("完成")) || task.getStatus().equals(StatusEnum.FORM_STATUS.code("取消")) || task.getStatus().equals(StatusEnum.FORM_STATUS.code("强制完成"))) {
throw new BadRequestException("当前任务已完成或被取消");
return;
}
if (param.getString("status").equals(StatusEnum.FORM_STATUS.code("完成"))) {
List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
@@ -255,37 +260,39 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
new QueryWrapper<MdPbVehicleMater>()
.eq("task_code", task.getTask_code()).eq("vehicle_code", task.getVehicle_code()).eq("is_delete", "0"));
if (ObjectUtils.isNotEmpty(vehicleMaterList)) {
//查找非二楼任务的未完成的出库单与明细
if (vehicleMaterList.get(0).getRemark().contains("空出")) {
List<Map> formData = this.getIoSourceFormData(task.getVehicle_code(), vehicleMaterList.get(0).getPcsn());
if (ObjectUtils.isNotEmpty(formData)) {
Map formDataMap = formData.get(0);
Object sourceFormData = formDataMap.get("source_form_data");
JSONObject formDataId = JSONObject.parseObject((String) sourceFormData);
String id = formDataId.getString("id");
String qty = formDataId.getString("qty");
if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(qty)) {
LambdaUpdateWrapper<PmFormData> lambdaUpdateWrapper = new LambdaUpdateWrapper<PmFormData>();
PmFormData pmFormData = iPmFormDataService.getById(id);
BigDecimal cancelQty = pmFormData.getAssign_qty().subtract(vehicleMaterList.get(0).getFrozen_qty()).abs();
if (cancelQty.compareTo(BigDecimal.ZERO) == 0) {
lambdaUpdateWrapper.set(PmFormData::getQty, pmFormData.getAssign_qty());
if (StringUtils.isNotBlank(vehicleMaterList.get(0).getRemark())) {
//查找非二楼任务的未完成的出库单与明细
if (vehicleMaterList.get(0).getRemark().contains("空出")) {
List<Map> formData = this.getIoSourceFormData(task.getVehicle_code(), vehicleMaterList.get(0).getPcsn());
if (ObjectUtils.isNotEmpty(formData)) {
Map formDataMap = formData.get(0);
Object sourceFormData = formDataMap.get("source_form_data");
JSONObject formDataId = JSONObject.parseObject((String) sourceFormData);
String id = formDataId.getString("id");
String qty = formDataId.getString("qty");
if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(qty)) {
LambdaUpdateWrapper<PmFormData> lambdaUpdateWrapper = new LambdaUpdateWrapper<PmFormData>();
PmFormData pmFormData = iPmFormDataService.getById(id);
BigDecimal cancelQty = pmFormData.getAssign_qty().subtract(vehicleMaterList.get(0).getFrozen_qty()).abs();
if (cancelQty.compareTo(BigDecimal.ZERO) == 0) {
lambdaUpdateWrapper.set(PmFormData::getQty, pmFormData.getAssign_qty());
}
lambdaUpdateWrapper.set(PmFormData::getAssign_qty, cancelQty).eq(PmFormData::getId, id);
iPmFormDataService.update(lambdaUpdateWrapper);
}
lambdaUpdateWrapper.set(PmFormData::getAssign_qty, cancelQty).eq(PmFormData::getId, id);
iPmFormDataService.update(lambdaUpdateWrapper);
}
String msg = "该库存在执行出库单id为" + id + ",任务号为:" + task.getTask_code() + ",触发空出或被手动取消,取消数量为:" + vehicleMaterList.get(0).getFrozen_qty();
//冻结解锁
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getFrozen_qty, 0)
.set(MdPbVehicleMater::getRemark, msg)
.eq(MdPbVehicleMater::getId, vehicleMaterList.get(0).getId()));
//库位空出
iStIvtStructattrService.update(new LambdaUpdateWrapper<StIvtStructattr>()
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("空出锁"))
.set(StIvtStructattr::getRemark, msg)
.eq(StIvtStructattr::getVehicle_code, task.getVehicle_code()));
String msg = "该库存在执行出库单id为" + id + ",任务号为:" + task.getTask_code() + ",触发空出或被手动取消,取消数量为:" + vehicleMaterList.get(0).getFrozen_qty();
//冻结解锁
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getFrozen_qty, 0)
.set(MdPbVehicleMater::getRemark, msg)
.eq(MdPbVehicleMater::getId, vehicleMaterList.get(0).getId()));
//库位空出
iStIvtStructattrService.update(new LambdaUpdateWrapper<StIvtStructattr>()
.set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("空出锁"))
.set(StIvtStructattr::getRemark, msg)
.eq(StIvtStructattr::getVehicle_code, task.getVehicle_code()));
}
}
}
}
@@ -333,7 +340,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
switch (type) {
case "ck":
if (task.getStatus().equals(StatusEnum.FORM_STATUS.code("完成")) || task.getStatus().equals(StatusEnum.FORM_STATUS.code("取消")) || task.getStatus().equals(StatusEnum.FORM_STATUS.code("强制完成"))) {
throw new BadRequestException("当前任务已完成或被取消");
return null;
}
List<MdPbVehicleMater> vehicleList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.eq("vehicle_code", task.getVehicle_code())
@@ -402,12 +409,12 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
RedissonUtils.lock(() -> {
System.out.println("---3--" + Thread.currentThread().getName());
//出阻挡说明是同排跟任务一个类型载具
Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage","depthPriority","alleyAve"), new JSONObject(MapOf.of( "is_move",true,"stor_code", stIvtStructattr.getStor_code(),"vehicle_code",task.getVehicle_code(),"errorTask","errorTask")));
Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("is_move", true, "stor_code", stIvtStructattr.getStor_code(), "vehicle_code", task.getVehicle_code(), "errorTask", "errorTask")));
moveStruct.set(((Map<String, String>) process.get("form_data")).get("end_struct_code"));
}, "1" + stIvtStructattr.getStor_code(), 5);
Map moveForm = MapOf.of("task_type", StatusEnum.IOBILL_TYPE_MOVE.code("异常位移库")
, "is_send", false
, "vehicle_code", StringUtils.isEmpty(vehicleCode)?"YCZJ" + task.getTask_code():vehicleCode, "form_data", new JSONObject(MapOf.of("start_struct_code", struct_code, "end_struct_code", moveStruct.get())));
, "vehicle_code", StringUtils.isEmpty(vehicleCode) ? "YCZJ" + task.getTask_code() : vehicleCode, "form_data", new JSONObject(MapOf.of("start_struct_code", struct_code, "end_struct_code", moveStruct.get())));
moveStorageTask.createTask(new JSONObject(moveForm));
}
@@ -454,6 +461,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
}
private JSONObject rm(StIvtStructattr stIvtStructattr, SchBaseTask task) {
String task_code = task.getTask_code();
String height = null;
//阻挡位锁定,如果无载具,那么锁定为异常库位,需要人工查看库位情况
if (StringUtils.isEmpty(stIvtStructattr.getVehicle_code())) {
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
@@ -481,10 +489,13 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
.set("remark", "异常位移库分配库位,出现二次满入,清除起点载具信息:" + task.getVehicle_code() + ",任务号为:" + task_code)
.set("vehicle_code", null));
}
if (org.apache.commons.collections4.CollectionUtils.isEmpty(vehicleList)) {
height = stIvtStructattr.getH().toString();
}
Map map = SpringContextHolder.getBean(DecisionHandler.class)
.dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("stor_code", stIvtStructattr.getStor_code()
, "vehicle_code", task.getVehicle_code(),
"start_point", task.getPoint_code1(), "errorTask", "errorTask", "taskType", task.getTask_type())));
"start_point", task.getPoint_code1(), "errorTask", "errorTask", "taskType", task.getTask_type(), "height", height)));
String new_struct_code = ((Map<String, String>) map.get("form_data")).get("end_struct_code");
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(vehicleList)) {
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
@@ -500,6 +511,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
JSONObject result = new JSONObject();
result.put("point_code2", new_struct_code);
return result;
}

View File

@@ -2,10 +2,13 @@ package org.nl.wms.external_system.acs.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.utils.CopyUtil;
import org.nl.common.utils.InterationUtil;
import org.nl.common.utils.MapOf;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.dispatch_manage.task.service.dto.SchBaseTaskDto;
import org.nl.wms.external_system.dto.InteracteDto;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
@@ -44,12 +47,13 @@ public class WmsToAcsService{
* 系统交互
*/
public TableDataInfo interationToExt(List<SchBaseTask> arr,String type) {
List<SchBaseTaskDto> taskList = CopyUtil.copyList(arr, SchBaseTaskDto.class);
//封装数据:
InteracteDto dto = InteracteDto.builder()
.service("wmsToAcsService")
.trace_id(MDC.get("trace_id"))
.type(type)
.data(arr).build();
.data(taskList).build();
TableDataInfo tableDataInfo = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto));
return tableDataInfo;
}

View File

@@ -310,8 +310,8 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
List<MdPbVehicleMater> vms = new ArrayList<>();
for (int i = 1; i < read.size(); i++) {
List<Object> list = read.get(i);
String vehicle_code = (String) list.get(0);
String material_code = (String) list.get(1);
String vehicle_code = list.get(0).toString();
String material_code = list.get(1).toString();
String pcsn = list.get(2).toString();
String qty = String.valueOf(list.get(3));
String single_weight = String.valueOf(list.get(4));
@@ -320,7 +320,7 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
}
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicle_code);
if (vehicleInfo == null) {
throw new BadRequestException("" + (i + 1) +"行,"+vehicle_code+ "载具信息未录入,请录入");
throw new BadRequestException("" + (i + 1) + "行," + vehicle_code + "载具信息未录入,请录入");
}
List<MdPbVehicleMaterVo> vehicleMaters = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code);
if (!CollectionUtils.isEmpty(vehicleMaters)) {
@@ -368,12 +368,16 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
vms.add(vehicleMater);
}
boolean count = vms.stream()
.collect(Collectors.groupingBy(MdPbVehicleMater::getMaterial_id,
Collectors.mapping(MdPbVehicleMater::getPcsn, Collectors.toSet())))
.entrySet().stream()
.anyMatch(entry -> entry.getValue().size() > 1);
.filter(vm -> vm.getVehicle_code() != null && vm.getVehicle_code().contains("T"))
//按载具和物料分组
.collect(Collectors.groupingBy(
vm -> vm.getVehicle_code() + "_" + vm.getMaterial_id(),
Collectors.mapping(MdPbVehicleMater::getPcsn, Collectors.toSet())
))
.values().stream()
.anyMatch(pcsnSet -> pcsnSet.size() > 1);
if (count) {
throw new BadRequestException("存在相同物料不同批次的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
throw new BadRequestException(",原因:同一个载具存在相同物料不同批次的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
}
iMdPbVehicleMaterService.saveBatch(vms);
this.saveBatch(groups);

View File

@@ -207,6 +207,20 @@ public class CockpitServiceImpl implements CockpitService {
int box = stockList22.stream().filter(r -> StringUtils.isNotBlank(r.getUpdate_time()))
.mapToInt(taskInfo -> taskInfo.getVehicle_code().split(",").length)
.sum();
if (Double.parseDouble(obj2.getString("time").trim().replace("h", "")) > 1) {
//根据箱数计算
if (box < 100) {
obj2.put("time", 1 + "h");
} else {
BigDecimal baseBox = BigDecimal.valueOf(100);
BigDecimal baseHours = BigDecimal.valueOf(1.1);
BigDecimal roundedTotalHours = BigDecimal.valueOf(box)
.divide(baseBox, 10, RoundingMode.HALF_UP)
.multiply(baseHours)
.setScale(1, RoundingMode.HALF_UP);
obj2.put("time", roundedTotalHours + "h");
}
}
obj2.put("box", box);
}
//托盘库入库

View File

@@ -90,7 +90,7 @@ public class PdaCommonController {
@Log("获取升级地址")
@SaIgnore
public ResponseEntity<Map> apkUrl() {
Map of = MapOf.of("versionName", "1.0.1", "url", "http://192.168.18.218:8012/api/pda/download/app-release");
Map of = MapOf.of("versionName", "1.0.1", "url", "http://172.18.1.54:8011/api/pda/download/app-release");
return new ResponseEntity<>(of, HttpStatus.OK);
}
@RequestMapping("/download/app-release")

View File

@@ -5,12 +5,10 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.BaseCode;
@@ -18,7 +16,6 @@ import org.nl.common.utils.IdUtil;
import org.nl.common.utils.ListOf;
import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorAgvTransferTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
@@ -29,6 +26,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -74,10 +72,24 @@ public class TaskScheduleService {
boolean islock = lock.tryLock();
try {
if (islock) {
//定时任务查询所有自动下发acs的任务与CTU出库完成的任务
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>() .in(SchBaseTask::getStatus, ListOf.of("10", "15", "20")));
List<SchBaseTask> createTaskList = taskList.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成"))).collect(Collectors.toList());
//生成的任务处理
//定时任务查询所有自动下发acs的任务与CTU出库完成的任务wwf
List<SchBaseTask> taskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>().in(SchBaseTask::getStatus, ListOf.of("10", "15", "20")));
if (ObjectUtil.isEmpty(taskList)) {
return;
}
taskList = taskList.stream()
.collect(Collectors.groupingBy(SchBaseTask::getVehicle_code))
.entrySet()
.stream()
.filter(r -> r.getValue().size() == 1)
.flatMap(r -> r.getValue().stream())
.collect(Collectors.toList());
List<SchBaseTask> createTaskList = taskList.stream()
.filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成")))
.sorted(Comparator.comparing(SchBaseTask::getCreate_time))
.limit(15)
.collect(Collectors.toList());
//生成的任务处理
if (ObjectUtil.isNotEmpty(createTaskList)) {
// 优先发送移库任务
List<SchBaseTask> immediatelyTaskList = createTaskList.stream()
@@ -89,7 +101,7 @@ public class TaskScheduleService {
List<String> taskCodes = immediatelyTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
log.info("---立即下发任务: " + taskCodes);
TableDataInfo response = wmsToAcsService.interationToExt(immediatelyTaskList, "createTask");
handleTaskResponse(response, taskCodes); // 提取为独立方法以复用
handleTaskResponse(response, taskCodes);
}
if (ObjectUtil.isNotEmpty(delayTaskList)) {
//1311 出库拣选 (1311目标拣选任务不超过4个)
@@ -115,38 +127,40 @@ public class TaskScheduleService {
delayTaskList.removeAll(waitTaskList);
}
//相同载具号,任务类型的任务不下发
Map<String, List<SchBaseTask>> grouped = delayTaskList.stream()
.collect(Collectors.groupingBy(task -> task.getVehicle_code() + "_" + task.getTask_type()));
List<SchBaseTask> toRemove = new ArrayList<>();
grouped.forEach((k, t) -> {
if (t.size() > 1) {
toRemove.addAll(t.subList(1, t.size()));
}
});
if (toRemove.size() > 0) {
List<String> taskIds = toRemove.stream().map(SchBaseTask::getId).collect(Collectors.toList());
LambdaUpdateWrapper<SchBaseTask> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(SchBaseTask::getId, taskIds);
updateWrapper.set(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成"));
updateWrapper.set(SchBaseTask::getIs_delete, "1");
updateWrapper.set(SchBaseTask::getRemark, "前置校验,载具号与任务类型相同,校验完成");
iSchBaseTaskService.update(updateWrapper);
delayTaskList.removeAll(toRemove);
// Map<String, List<SchBaseTask>> grouped = delayTaskList.stream()
// .collect(Collectors.groupingBy(task -> task.getVehicle_code() + "_" + task.getTask_type()));
// List<SchBaseTask> toRemove = new ArrayList<>();
// grouped.forEach((k, t) -> {
// if (t.size() > 1) {
// toRemove.addAll(t.subList(1, t.size()));
// }
// });
// if (toRemove.size() > 0) {
// List<String> taskIds = toRemove.stream().map(SchBaseTask::getId).collect(Collectors.toList());
// LambdaUpdateWrapper<SchBaseTask> updateWrapper = new LambdaUpdateWrapper<>();
// updateWrapper.in(SchBaseTask::getId, taskIds);
// updateWrapper.set(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成"));
// updateWrapper.set(SchBaseTask::getIs_delete, "1");
// updateWrapper.set(SchBaseTask::getRemark, "前置校验,载具号与任务类型相同,校验完成");
// iSchBaseTaskService.update(updateWrapper);
// delayTaskList.removeAll(toRemove);
// }
if (ObjectUtil.isNotEmpty(delayTaskList)) {
DELAY_EXECUTOR.execute(() -> {
try {
Thread.sleep(2000);
List<String> taskCodes = delayTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
log.info("---延迟下发任务: " + taskCodes);
TableDataInfo response = wmsToAcsService.interationToExt(delayTaskList, "createTask");
handleTaskResponse(response, taskCodes);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("延迟任务被中断", e);
} catch (Exception e) {
log.error("延迟下发任务执行失败", e);
}
});
}
DELAY_EXECUTOR.execute(() -> {
try {
Thread.sleep(2000);
List<String> taskCodes = delayTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
log.info("---延迟下发任务: " + taskCodes);
TableDataInfo response = wmsToAcsService.interationToExt(delayTaskList, "createTask");
handleTaskResponse(response, taskCodes);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("延迟任务被中断", e);
} catch (Exception e) {
log.error("延迟下发任务执行失败", e);
}
});
}
}
}

View File

@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
@Slf4j
public class WaitTaskScheduleService {
private ReentrantLock lock = new ReentrantLock();
private final ReentrantLock lock = new ReentrantLock();
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@@ -64,6 +64,9 @@ public class WaitTaskScheduleService {
.eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("生成"))
);
List<String> taskCodes = taskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList());
if (CollectionUtils.isEmpty(taskCodes)) {
return;
}
log.info("---执行夜间定时整出任务:-----waitTaskPublish-----" + taskCodes);
TableDataInfo response = wmsToAcsService.interationToExt(taskList, "createTask");
if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) {

View File

@@ -1,5 +1,5 @@
server:
port: 8099
port: 8018
max-http-header-size: 65536
#配置数据源
spring:

View File

@@ -6,7 +6,7 @@ spring:
freemarker:
check-template-location: false
profiles:
active: prod
active: dev
jackson:
time-zone: GMT+8
data:

View File

@@ -26,6 +26,15 @@
@click="doLog"
>日志
</el-button>
<el-button
slot="right"
class="filter-item"
size="mini"
type="danger"
icon="el-icon-warning"
@click="delCtuIvt"
>人工清除CTU库库存
</el-button>
</crudOperation>
<Log ref="log" />
</div>
@@ -196,6 +205,9 @@ import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import Crontab from './components/crontab'
import { delCtuIvt } from '@/views/wms/dispatch_manage/task/schBaseTask'
import * as crudSchBaseTask from '@/views/wms/dispatch_manage/task/schBaseTask'
import crudUser from '@/views/system/user/user'
const defaultForm = {
job_id: null,
@@ -282,6 +294,24 @@ export default {
updateParams(id) {
console.log(id)
},
delCtuIvt() {
this.$confirm(`此操作将清空CTU库所有库存清除后数据无法恢复请谨慎操作请确认后再操作`, '警告', {
confirmButtonText: '人工清除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$confirm(`二次提醒此操作将清空CTU库所有库存清除后数据无法恢复请谨慎操作请确认后再操作`, '警告', {
confirmButtonText: '我要清除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
crudSchBaseTask.delCtuIvt().then(res => {
this.crud.toQuery()
this.crud.notify('CTU库所有库存已清空', CRUD.NOTIFICATION_TYPE.SUCCESS)
})
})
})
},
delMethod(id) {
this.delLoading = true
crudJob.del([id]).then(() => {

View File

@@ -99,12 +99,12 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="仓位编码" prop="struct_code">
<el-input v-model="form.struct_code" style="width: 200px;" />
<el-input v-model="form.struct_code" disabled style="width: 200px;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仓位名称" prop="struct_name">
<el-input v-model="form.struct_name" style="width: 200px;" />
<el-input v-model="form.struct_name" disabled style="width: 200px;" />
</el-form-item>
</el-col>
</el-row>
@@ -125,7 +125,7 @@
<el-col :span="12">
<el-form-item label="载具号">
<label slot="label">载&nbsp;&nbsp;具&nbsp;号:</label>
<el-input v-model="form.vehicle_code" disabled style="width: 200px;" />
<el-input v-model="form.vehicle_code" style="width: 200px;" />
</el-form-item>
</el-col>
<el-col :span="12">
@@ -154,11 +154,11 @@
<el-input v-model="form.capacity" style="width: 200px;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="承受重量" prop="weight">
<el-input v-model="form.weight" style="width: 200px;" />
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="承受重量" prop="weight">-->
<!-- <el-input v-model="form.weight" style="width: 200px;" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-row>
<el-row :gutter="20">
<el-col :span="12">
@@ -174,15 +174,15 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="高度" prop="height">
<label slot="label">高&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;度:</label>
<el-input v-model="form.height" style="width: 200px;" />
</el-form-item>
</el-col>
<el-col :span="12" />
</el-row>
<!-- <el-row :gutter="20">-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="高度" prop="height">-->
<!-- <label slot="label">高&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;度:</label>-->
<!-- <el-input v-model="form.height" style="width: 200px;" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12" />-->
<!-- </el-row>-->
<el-row :gutter="20">
<el-col :span="24" />
</el-row>
@@ -253,7 +253,7 @@
<el-table-column prop="l" label="深度" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
<el-table-column
v-permission="['admin','structattr:edit','structattr:del']"
v-permission="['admin','structattr:edit']"
label="操作"
fixed="right"
width="120px"
@@ -325,7 +325,7 @@ const defaultForm = {
storagevehicle_type: null,
is_emptyvehicle: null,
storagevehicle_qty: null,
lock_type: null,
lock_type: '00',
material_height_type: null,
ext_id: null,
remark: null

View File

@@ -159,10 +159,10 @@ export default {
},
mounted() {
// 读写器定时器
// this.intervalId = setInterval(() => {
// this.crud.toQuery()
// this.updateLogFromResult()
// }, 3000)
this.intervalId = setInterval(() => {
this.crud.toQuery()
this.updateLogFromResult()
}, 3000)
},
beforeDestroy() {
if (this.intervalId) {

View File

@@ -46,5 +46,12 @@ export function scheduler(data) {
data
})
}
export function delCtuIvt(data) {
return request({
url: 'api/schBaseTask/delCtuIvt',
method: 'post',
data
})
}
export default { add, edit, del, getTaskStatusList, operation, scheduler }
export default { add, edit, del, getTaskStatusList, operation, scheduler, delCtuIvt }