add:自定义入库分配策略

This commit is contained in:
2024-07-31 15:54:28 +08:00
parent f89ac94bec
commit 9b365bc4eb
5 changed files with 108 additions and 24 deletions

View File

@@ -1,27 +1,15 @@
package org.nl.wms.decision_manage.handler.chainer.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;
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.chainer.DecisionerChain;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.unify.Command;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
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.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/*
* @author ZZQ
@@ -42,7 +30,7 @@ public class ExecuteDecisionChainer extends DecisionerChain<List> {
@Override
protected List execute(List transfers) {
Map<String, Decisioner> decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class);
List list = new ArrayList();
List list = transfers;
for (String decisionerType : decisionerTypes) {
Decisioner decisioner = decisionerMap.get(decisionerType);
list = decisioner.handler(transfers, startPatam);

View File

@@ -0,0 +1,96 @@
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
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.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/*
* @author ZZQ
* @Date 2024/4/6 16:18
* 入库双叉分配测策略
*/
@Service("inventory")
public class InventoryRuleHandler extends Decisioner<StIvtStructattr, JSONObject> {
private static final Map<String, String> LINK_POINT = MapOf.of("1109", "1110", "1110", "1109");
//每个策略的配置信息
/**
* 出入库明细服务
*/
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private IStIvtStructattrService stIvtStructattrService;
/**
* 载具扩展属性服务服务
*/
/**
* 就近放置策略:根据出入库顺序进行判断
*
* @param list :仓位集合
* @param param物料相关信息、出入类型{ ioType: 出入类型
* materialId: 物料标识
* ...
* }
* @return List<StIvtStructattr> :仓位集合
*/
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, JSONObject param) {
if (CollectionUtils.isEmpty(list)) {
throw new BadRequestException("当前分配策略无可用货位");
}
String start_point = param.getString("start_point");
LambdaQueryWrapper<SchBaseTask> lqw = new LambdaQueryWrapper<>();
lqw.eq(SchBaseTask::getPoint_code1, LINK_POINT.get(start_point))
.eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("生成"));
SchBaseTask task = taskService.getOne(lqw);
if (!ObjectUtils.isEmpty(task)) {
String point_code2 = task.getPoint_code2();
list = getInventory(list, point_code2);
if (!CollectionUtils.isEmpty(list)) {
return list;
}
}
list.sort(Comparator.comparingInt(i -> i.getRow_num() + i.getCol_num() + i.getLayer_num() + i.getBlock_num()));
return list;
}
private List<StIvtStructattr> getInventory(List<StIvtStructattr> list, String point_code2) {
StIvtStructattr structattr = stIvtStructattrService.getOne(new LambdaQueryWrapper<StIvtStructattr>().eq(StIvtStructattr::getStruct_code, point_code2).eq(StIvtStructattr::getIs_used, true));
return Optional.ofNullable(list)
.orElse(new CopyOnWriteArrayList<>())
.stream()
.filter(stru -> stru.getRow_num().equals(structattr.getRow_num()) && stru.getLayer_num().equals(structattr.getLayer_num()))
.filter(stru -> (stru.getCol_num() / 4 == structattr.getCol_num() / 4) && (((stru.getCol_num() % 4) + (structattr.getCol_num() % 4) == 2) || (stru.getCol_num() % 4) + (structattr.getCol_num() % 4) == 4))
.collect(Collectors.toList());
}
}

View File

@@ -71,6 +71,10 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
if (auxParam!=null){
item_json.putAll(auxParam);
}
JSONObject param = entity.getAuxParam();
if (param != null){
item_json.putAll(param);
}
Map<String, String> map = this.dispense(params, item_json);
//更新仓位,更新数据
System.out.println(flow.getForm_type()+"更新明细id"+item_json.getString("id"));

View File

@@ -184,11 +184,10 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
}
StIvtIostorinvdtl dtl = form.toJavaObject(StIvtIostorinvdtl.class);
String[] vehicles = dtl.getVehicle_id().split(",");
List<MdPbVehicleMater> list = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.select("group_id").in("id", Arrays.asList(vehicles)));
iMdPbVehicleMaterService.remove(new QueryWrapper<MdPbVehicleMater>().in("id", Arrays.asList(vehicles)));
List<String> groups = list.stream().map(MdPbVehicleMater::getGroup_id).collect(Collectors.toList());
iMdGruopDickService.removeByIds(groups);
iMdGruopDickService.remove(new QueryWrapper<MdGruopDick>()
.in("vehicle_code", Arrays.asList(dtl.getVehicle_id().split(",")))
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("update_time", DateUtil.now())
.set("vehicle_code", null)

View File

@@ -1,21 +1,19 @@
package org.nl.wms.system_manage.service.quartz.utils;
import cn.hutool.core.util.StrUtil;
import com.yomahub.tlog.core.thread.TLogInheritableTask;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.utils.SpringContextHolder;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
/**
* 执行定时任务
*
* @author /
*/
@Slf4j
public class QuartzRunnable extends TLogInheritableTask {
public class QuartzRunnable implements Callable {
private final Object target;
private final Method method;
@@ -33,15 +31,14 @@ public class QuartzRunnable extends TLogInheritableTask {
}
}
@SneakyThrows
@Override
public void runTask() {
public Object call() throws Exception {
ReflectionUtils.makeAccessible(method);
if (StrUtil.isNotEmpty(params)) {
method.invoke(target, params);
} else {
method.invoke(target);
}
return null;
}
}