add:拣选出库

This commit is contained in:
zhangzq
2024-06-12 14:48:05 +08:00
parent 1238ad893b
commit 95a52eb5a9
24 changed files with 380 additions and 130 deletions

View File

@@ -1,9 +1,11 @@
package org.nl.common.enums;
import com.baomidou.mybatisplus.extension.api.R;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.ForkMap;
import org.nl.common.utils.MapOf;
import java.util.Map;
@@ -19,45 +21,80 @@ public enum StatusEnum {
/**
* 流程相关
*/
MODEL_STATUS(MapOf.of("发布", "10", "未发布", "30")),
FLOW_STATUS(MapOf.of("启动", "10", "节点完成", "20","暂停", "30","完成", "90")),
MODEL_STATUS(ForkMap.of("发布", "10",null, "未发布", "30",null)),
FLOW_STATUS(ForkMap.of("启动", "10",null, "节点完成", "20",null,"暂停", "30",null,"完成", "90",null)),
/**
* 单据状态
*/
FORM_STATUS(MapOf.of("生成", "10","已分配", "13", "执行中", "20","完成", "90","取消", "100")),
FORM_STATUS(ForkMap.of("生成", "10",null,"已分配", "13", null,"执行中", "20",null,"完成", "90",null,"取消", "100",null)),
/**
* 出入库单据类型
*/
IOBILL_TYPE_IN(MapOf.of("生产入库", "10", "调拨入库", "11", "退货入库", "12")),
IOBILL_TYPE_OUT(MapOf.of("销售出库", "20", "生产出库", "21", "调拨出库", "22")),
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10","inStorageTask", "调拨入库", "11","inStorageTask", "退货入库", "12","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask")),
/**
* 任务类型
*/
TASK_TYPE(MapOf.push(IOBILL_TYPE_IN.code,IOBILL_TYPE_OUT.code)),
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code,IOBILL_TYPE_OUT.code)),
ACS_TYPE(ForkMap.of("立库", "10",null
,"海柔", "20",null
,"诺宝", "30",null
)),
/**
* 点位锁类型
*/
LOCK(MapOf.of("","00","","10","","20")),
STRATEGY_TYPE(MapOf.of("入库", "1", "出库", "2", "出入库", "3")),
LOCK(ForkMap.of("","00",null,"","10",null,"","20",null)),
STRATEGY_TYPE(ForkMap.of("入库", "1",null, "出库", "2", null,"出入库", "3",null)),
;
private Map<String, String> code;
/**
* L:label
* M编码
* R:指定服务类
*/
private ForkMap<String, String,String> code;
public String code(String desc) {
String code = this.getCode().get(desc);
String code = this.getCode().getM(desc);
if (StringUtils.isNotEmpty(code)) {
return code;
}
throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
}
public String desc(String code) {
for (String key : this.getCode().getKeySet()) {
if (key.equals(code)){
return this.getCode().getM(key);
}
}
throw new BadRequestException(this.name() + "对应编码" + code + "未定义");
}
public String getR(String code) {
for (String key : this.getCode().getKeySet()) {
if (key.equals(code)){
String r = this.getCode().getR(key);
if (StringUtils.isEmpty(r)) {
throw new BadRequestException(this.name() + "对应编码" + code + "未定义R的数据");
}
return r;
}
}
throw new BadRequestException(this.name() + "对应编码" + code + "未定义x");
}
public Boolean check(String code) {
for (Map.Entry<String, String> entry : this.getCode().entrySet()) {
if (entry.getValue().equals(code)) {
ForkMap<String, String, String> map = this.getCode();
for (String key : map.getKeySet()) {
if (code.equals(map.getM(key))){
return true;
}
}
return false;
}
}

View File

@@ -0,0 +1,81 @@
package org.nl.common.utils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/*
* @author ZZQ
* @Date 2022/11/29 2:55 下午
* 三叉Map
*/
public class ForkMap<L,M,R> implements Serializable {
transient Map<Integer,Node> items=new HashMap<>();
transient Set<L> keySet = new HashSet<>();
public <M> M getM(L key){
Node<L,M,R> node = items.get(hash(key));
if (node==null){
return null;
}
return node.middle;
}
public <R> R getR(L key){
Node<L,M,R> node = items.get(hash(key));
if (node==null){
return null;
}
return node.right;
}
public Set<L> getKeySet(){
return keySet;
}
public static <L,M,R> ForkMap pushAll(ForkMap... maps){
ForkMap<L,M,R> forkMap = new ForkMap();
for (ForkMap<L,M,R> map : maps) {
for (L key : map.getKeySet()) {
L key1 = key;
M m = map.getM(key1);
R r = map.getR(key1);
forkMap.put(key1, m, r);
}
}
return forkMap;
}
public static <V> ForkMap of(V...keys){
ForkMap<V,V,V> map = new ForkMap<V,V,V>();
for (int i = 0; i < keys.length/3; i++) {
map.put(keys[i*3],keys[i*3+1],keys[i*3+2]);
}
return map;
}
public ForkMap put(L key, M middle,R right) {
Node node = new Node(key, middle, right);
items.put(hash(key),node);
keySet.add(key);
return this;
}
static class Node<L,M,R>{
private L left;
private M middle;
private R right;
Node(L left, M middle, R right) {
this.left = left;
this.middle = middle;
this.right = right;
}
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
}

View File

@@ -14,8 +14,11 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/*
@@ -24,15 +27,14 @@ import java.util.stream.Collectors;
* 先进先出策略
*/
@Service("fifo")
public class FIFORuleHandler extends Decisioner<StIvtStructattr, JSONObject> {
public class FIFORuleHandler extends Decisioner<StructattrVechielDto, JSONObject> {
/**
* 出入库明细服务
*/
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
/**
@@ -46,7 +48,7 @@ public class FIFORuleHandler extends Decisioner<StIvtStructattr, JSONObject> {
* @return List<StIvtStructattr> :仓位集合
*/
@Override
public List<StIvtStructattr> handler(List<StIvtStructattr> list, JSONObject param) {
public List<StructattrVechielDto> handler(List<StructattrVechielDto> list, JSONObject param) {
// 判断仓位是否为空
if (ObjectUtil.isEmpty(list)) {
throw new BadRequestException("仓位集合为空!");
@@ -59,20 +61,20 @@ public class FIFORuleHandler extends Decisioner<StIvtStructattr, JSONObject> {
, "stor_code", param.getString("stor_code")
, "order_by", "update_time asc")
);
List<String> need = list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList());
List<String> need = list.stream().map(StructattrVechielDto::getVehicle_code).collect(Collectors.toList());
List<StIvtStructattr> disList = new ArrayList<>();
List<StructattrVechielDto> disList = new ArrayList<>();
for (StructattrVechielDto structattr : vechielDtos) {
if (need.contains(structattr.getStruct_code())){
StIvtStructattr stIvtStructattr = new StIvtStructattr();
BeanUtils.copyProperties(structattr,stIvtStructattr);
disList.add(stIvtStructattr);
if (need.contains(structattr.getVehicle_code())){
int cause_qty = structattr.getQty().subtract(structattr.getFrozen_qty()).intValue();
plan_qty = plan_qty - cause_qty;
if (plan_qty<=0){
int sub = plan_qty - cause_qty;
disList.add(structattr);
if (sub<=0){
structattr.setFrozen_qty(new BigDecimal(plan_qty));
break;
}
structattr.setFrozen_qty(new BigDecimal(cause_qty));
plan_qty = sub;
}
}
return disList;

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.applyTask;
package org.nl.wms.dispatch_manage.task.handler;
import com.alibaba.fastjson.JSONArray;
@@ -17,10 +17,10 @@ import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
* @created 2020年6月12日 下午5:53:28
*/
@Slf4j
public abstract class AbstractApplyTask {
public abstract class AbstractTask {
public abstract String createTask(JSONObject data);
public abstract JSONObject createTask(JSONObject data);
public abstract void updateStatus(JSONObject data);

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.applyTask.impl;
package org.nl.wms.dispatch_manage.task.handler.impl;
import com.alibaba.fastjson.JSONObject;
@@ -10,7 +10,8 @@ import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.utils.MapOf;
import org.nl.wms.decision_manage.applyTask.AbstractApplyTask;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.flow_manage.monitor.event.FlowStartEvent;
import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService;
import org.nl.wms.md_manage.group_dick.service.dao.MdGruopDick;
@@ -22,7 +23,6 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.function.Consumer;
/**
@@ -35,8 +35,8 @@ import java.util.function.Consumer;
* @created 2020年6月12日 下午5:53:28
*/
@Slf4j
@Service
public class ApplyFlowTask extends AbstractApplyTask {
@Service("ZPInStorage")
public class GroupDickInStorageTask extends AbstractTask {
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@@ -44,7 +44,7 @@ public class ApplyFlowTask extends AbstractApplyTask {
private IMdGruopDickService iMdGruopDickService;
@Override
public String createTask(JSONObject data) {
public JSONObject createTask(JSONObject data) {
for (String vehicle_code : data.keySet()) {
String point_code1 = data.getString(vehicle_code);
if (StringUtils.isEmpty(point_code1)){
@@ -68,6 +68,7 @@ public class ApplyFlowTask extends AbstractApplyTask {
.build("md_group_dick",mst.getId(),mst.getSource_form_type(),mst.getSource_form_id(), mstJ)
.build("md_pb_vehicleMater",item)
);
//执行流程//
}
return null;
}

View File

@@ -0,0 +1,87 @@
package org.nl.wms.dispatch_manage.task.handler.impl;
import cn.hutool.core.date.DateUtil;
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 org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/*
* @author ZZQ
* @Date 2024/5/6 14:34
* 堆垛机入库任务
*/
@Service
public class InStorageTask extends AbstractTask {
@Autowired
ISchBaseTaskService taskService;
@Autowired
IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Override
public JSONObject createTask(JSONObject from) {
String vehicle_code = from.getString("vehicle_code");
String struct_code = from.getString("struct_code");
String target_point = from.getString("target_point");
String task_type = from.getString("task_type");
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(target_point)||StringUtils.isEmpty(struct_code)){
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
SchBaseTask task = new SchBaseTask();
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type(StatusEnum.ACS_TYPE.code("立库"));
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(task_type);
task.setVehicle_code(vehicle_code);
task.setPoint_code1(target_point);
task.setPoint_code2(struct_code);
taskService.create(task);
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code,task.getTask_code())
.eq(MdPbVehicleMater::getVehicle_code,task.getVehicle_code()));
return (JSONObject) JSON.toJSON(task);
}
@Override
public void updateStatus(JSONObject data) {
}
@Override
public void cancel(JSONObject data) {
}
}

View File

@@ -4,12 +4,15 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.InterationUtil;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.decision_manage.applyTask.impl.ApplyFlowTask;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.handler.impl.GroupDickInStorageTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.acs.service.dto.TransferDto;
import org.nl.wms.external_system.dto.InteracteDto;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.source.impl.MappingSourceDataTypeHandler;
import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
@@ -18,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/*
* @author ZZQ
@@ -27,11 +31,26 @@ import java.util.List;
public class AcsToWmsService implements InitializingBean {
@Autowired
private ApplyFlowTask applyFlowTask;
private Map<String, AbstractTask> applyTaskMap;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
private SyncFormMapping mapping;
public void applyTask(String taskType,JSONObject data){
applyFlowTask.createTask(data);
public void applyTask(String service,JSONObject data){
if (service.equals("ZPInStorage")){
applyTaskMap.get("ZPInStorage").createTask(data);
}
if (service.equals("TaskStatus")){
String task_code = data.getString("task_code");
SchBaseTask task = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", task_code)
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (task == null){
throw new BadRequestException("更新失败:当前执行中的任务不存在");
}
applyTaskMap.get(task.getTask_type()).updateStatus(data);
}
}

View File

@@ -23,7 +23,6 @@ public class SequenceFlowConverter extends BaseNodeConverter {
sequenceFlow.setName(properties.getString("name"));
sequenceFlow.setDocumentation(properties.getString("documentation"));
//设置触发事件
sequenceFlow.setExecutionListeners(null);
sequenceFlow.setSkipExpression(properties.getString("skipExpression"));
FlowNode sourceNode = model.getProcesses().get(node.getString("sourceNodeId"));

View File

@@ -71,14 +71,16 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
JSONObject t = (JSONObject)item.remove("t");
String[] vehicle_codes = t.getString("vehicle_code").split(",");
for (String vehicle_code : vehicle_codes) {
JSONObject subt = new JSONObject(t);
JSONObject subt = new JSONObject();
subt.putAll(t);
subt.put("vehicle_code",vehicle_code);
JSONObject sub = new JSONObject(item);
JSONObject sub = new JSONObject();
sub.putAll(item);
sub.put("t",subt);
subList.add(sub);
if (tmpMap.get(vehicle_code) == null){
tmpMap.put(vehicle_code,sub);
}
subList.add(sub);
}
}
//现在子流程跟载具有关后续可以通过配置拆分字段vehicle_code跟拆分规则实现

View File

@@ -6,10 +6,13 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.ListOf;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowElement;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.ServerTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
@@ -19,6 +22,7 @@ import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
@@ -45,7 +49,7 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
@Autowired
private IStIvtIostorinvdtlService stIvtIostorinvdtlInService;
@Autowired
private IPmFormDataService iPmFormDataService;
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private Map<String, Decisioner> decisionHandlerMap;
@@ -63,9 +67,8 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
JSONObject t = entity.getT();
JSONObject item_json = t.getJSONObject("t");
ServerTask flow = (ServerTask)entity.getCurrentFlowElement();
List<StIvtStructattr> list = SpringContextHolder.getBean(DecisionHandler.class).dispense(params, item_json);
Map<String, String> map = SpringContextHolder.getBean(DecisionHandler.class).dispense(params, item_json);
//更新仓位,更新数据
String collect = list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(","));
System.out.println(flow.getForm_type()+"更新明细id"+item_json.getString("id"));
// StringBuffer sql = new StringBuffer();
// sql.append("update ")
@@ -75,30 +78,29 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
// .append(" where id = ")
// .append("'"+item_json.getString("id")+"'");
// iPmFormDataService.dynamicSql(sql.toString());
item_json.put("struct_code",collect);
item_json.putAll(map);
return t;
}
@Transactional(propagation= Propagation.REQUIRES_NEW)
public List<StIvtStructattr> dispense(List<String> params, JSONObject iostorinvdtl) {
public Map<String,String> dispense(List<String> params, JSONObject iostorinvdtl) {
Decisioner oneDecisioner = decisionHandlerMap.get(params.get(0));
//判断是出库还是入库
String stor_code = iostorinvdtl.getString("stor_code");
String strategy_type = oneDecisioner.strategyConfig.getStrategy_type();
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
AtomicReference<List<StIvtStructattr>> structCode = new AtomicReference<>();
AtomicReference<Map> structCode = new AtomicReference<>();
RedissonUtils.lock(()->{
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code(""))
.eq("stor_code", iostorinvdtl.getString("stor_code"));
List list;
if (in_storage){
query.eq("vehicle_code","");
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code(""))
.eq("stor_code", iostorinvdtl.getString("stor_code"));
query.isNull("vehicle_code");
list = iStIvtStructattrService.list(query);
}else {
query.ne("vehicle_code","");
list = iStIvtStructattrService.structVehicle(null);
}
//如果是入库则过滤空;否则则不过滤
List<StIvtStructattr> list = iStIvtStructattrService.list(query);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
@@ -112,19 +114,25 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("无可分配货位!");
}
//如果是入库的话只分配一个,出库的话有可能多个货位
if (in_storage){
list= ListOf.of(list.get(0));
}
structCode.set(list);
System.out.println("分配的货位"+list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(",")));
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
StIvtStructattr structattr = (StIvtStructattr)list.get(0);
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
// .set("vehicle_code", iostorinvdtl.getVehicle_code())
.set("lock_type", StatusEnum.LOCK.code(in_storage?"":""))
.in("struct_code", list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())));
System.out.println("货位绑定成功");
},"",2);
System.out.println("货位绑定成功------");
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code", structattr.getStruct_code()));
System.out.println("货位绑定成功"+structattr.getStruct_code());
structCode.set(MapOf.of("struct_code",structattr.getStruct_code()));
}else {
for (StructattrVechielDto vechielDto : ((List<StructattrVechielDto>) list)) {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty",vechielDto.getFrozen_qty())
.eq("id",vechielDto.getVm_id()));
}
List<String> collect = ((List<StructattrVechielDto>) list).stream().map(StructattrVechielDto::getVehicle_code).collect(Collectors.toList());
System.out.println("载具绑定成功"+collect.toString());
structCode.set(MapOf.of("vehicle_code",collect.stream().collect(Collectors.joining(","))));
}
},"",2);
return structCode.get();
}
}

View File

@@ -11,6 +11,7 @@ import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess;
@@ -22,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/*
@@ -33,46 +35,17 @@ import java.util.stream.Collectors;
public class CreateTaskProcessHandler implements ClassProcess {
@Autowired
ISchBaseTaskService taskService;
@Autowired
IMdPbVehicleMaterService iMdPbVehicleMaterService;
Map<String, AbstractTask> taskMap;
@Override
@Transactional
public JSONObject process(JSONObject from, JSONObject param) {
//区分出库还是入库
String vehicle_code = from.getString("vehicle_code");
String struct_code = from.getString("struct_code");
String target_point = param.getString("target_point");
String task_type = param.getString("task_type");
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(target_point)||StringUtils.isEmpty(struct_code)){
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
//根据不同的任务类型调用不同的任务创建逻辑
SchBaseTask task = new SchBaseTask();
task.setId(IdUtil.getStringId());
task.setSource_form_id(from.getString("id"));
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
task.setHandle_class(this.getClass().getName());
task.setAcs_type("");
task.setCreate_time(DateUtil.now());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(param.getString("task_type"));
task.setVehicle_code(vehicle_code);
task.setPoint_code1(target_point);
task.setPoint_code2(struct_code);
taskService.create(task);
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code,task.getTask_code())
.eq(MdPbVehicleMater::getVehicle_code,task.getVehicle_code()));
return (JSONObject)JSON.toJSON(task);
from.putAll(param);
AbstractTask abstractTask = taskMap.get(StatusEnum.TASK_TYPE.getR(from.getString("task_type")));
if (abstractTask==null){
throw new BadRequestException("创建任务失败:当前任务类型未定义处理类");
}
return abstractTask.createTask(from);
}
}

View File

@@ -36,7 +36,7 @@ public class StorageChangesProcessHandler implements ClassProcess {
@Override
public JSONObject process(JSONObject from, JSONObject param) {
//暂时出入入库的问题
//暂时出入入库的问题:库存变动中任务变动由任务变动接口处理
from.put("status",param.getString("status"));
from.put("update_time",DateUtil.now());
from.put("update_name",SecurityUtils.getCurrentNickName());

View File

@@ -62,6 +62,11 @@ public class MdPbVehicleMater implements Serializable {
*/
private BigDecimal frozen_qty;
/**
* 载具锁定
*/
private Boolean is_lock;
/**
* 数量计量单位标识
*/

View File

@@ -66,8 +66,8 @@ public class StIvtIostorinvOutController {
*/
@PostMapping("/outDecision")
public ResponseEntity<Object> outDecision(@RequestBody JSONObject dtl) {
String struct_code = iStIvtIostorinvService.outDispense(dtl);
return new ResponseEntity<>(struct_code,HttpStatus.OK);
String vechicle_codes = iStIvtIostorinvService.outDispense(dtl);
return new ResponseEntity<>(vechicle_codes,HttpStatus.OK);
}
/**

View File

@@ -183,12 +183,13 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
@Override
public String outDispense(JSONObject form) {
//分配更新
List<StIvtStructattr> desicion = iStIvtStructattrService.desicion(form, Boolean.FALSE);
if (CollectionUtils.isEmpty(desicion)){
Map<String, String> map = iStIvtStructattrService.desicion(form, Boolean.FALSE);
if (CollectionUtils.isEmpty(map)){
throw new BadRequestException("分配失败,当前出库分配无可用货位");
}
String vehicle_code = map.get("vehicle_code");
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("vehicle_code",desicion.stream().map(StIvtStructattr::getVehicle_code).collect(Collectors.joining(",")))
.set("vehicle_code",vehicle_code)
.eq("id",form.getString("id")));
int count = iStIvtIostorinvDtlService.count(new QueryWrapper<StIvtIostorinvdtl>()
.eq("inv_id", form.getString("inv_id")).isNull("vehicle_code"));
@@ -197,7 +198,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
.set("status",StatusEnum.FORM_STATUS.code("已分配"))
.eq("id",form.getString("inv_id")));
}
return desicion.get(0).getStruct_code();
return vehicle_code;
}
@Override
@@ -207,8 +208,8 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
if (StringUtils.isNotEmpty(vehicles)){
String[] split = vehicles.split(",");
//更新点位锁,删除分配
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code(""))
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", 0)
.in("vehicle_code", Arrays.asList(split)));
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("vehicle_code",null)

View File

@@ -40,7 +40,9 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
* @param in
* @return
*/
List<StIvtStructattr> desicion(JSONObject form, Boolean in);
Map<String, String> desicion(JSONObject form, Boolean in);
List<StructattrVechielDto> collectVechicle(Map query);
List<StructattrVechielDto> structVehicle(Map query);
}

View File

@@ -23,4 +23,6 @@ public interface StIvtStructattrMapper extends BaseMapper<StIvtStructattr> {
List<Map> getPageQuery(@Param("query") StructattrQuery query, PageQuery pageQuery);
List<StructattrVechielDto> collectVehicle(Map query);
List<StructattrVechielDto> structVehicle(Map query);
}

View File

@@ -42,6 +42,7 @@
md_pb_vehicleMater.frozen_qty,
md_pb_vehicleMater.material_id,
md_pb_vehicleMater.pcsn,
md_pb_vehicleMater.id as vm_id,
st_ivt_structattr.*
FROM
st_ivt_structattr
@@ -60,4 +61,19 @@
order by ${order_by}
</if>
</select>
<select id="structVehicle" resultType="org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto">
SELECT
md_pb_vehicleMater.qty,
md_pb_vehicleMater.frozen_qty,
md_pb_vehicleMater.material_id,
md_pb_vehicleMater.pcsn,
md_pb_vehicleMater.id as vm_id,
st_ivt_structattr.*
FROM
st_ivt_structattr
LEFT JOIN md_pb_vehicleMater ON st_ivt_structattr.vehicle_code = md_pb_vehicleMater.vehicle_code
WHERE
st_ivt_structattr.vehicle_code is not null and
md_pb_vehicleMater.is_lock = false
</select>
</mapper>

View File

@@ -17,6 +17,10 @@ public class StructattrVechielDto extends MdPbVehicleMater {
* 仓位标识
*/
private String id;
/**
* 载具物料id
*/
private String vm_id;
/**
* 仓位编码

View File

@@ -72,7 +72,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
.set("update_time",now)
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code",struct_code));
//b变动结存
List<StIvtStructivtflow> records = new ArrayList<>();
for (MdPbVehicleMater vehicleMater : vehicleMaters) {
StIvtStructivtflow record = new StIvtStructivtflow();
@@ -125,15 +125,15 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
}
@Override
public List<StIvtStructattr> desicion(JSONObject form, Boolean in) {
public Map<String, String> desicion(JSONObject form, Boolean in) {
//查询出入库配置规则
Param byCode = iSysParamService.findByCode("decision_"+ in);
if (byCode ==null || StringUtils.isEmpty(byCode.getValue())){
throw new BadRequestException("未配置出入库默认规则,请在系统配置中配置");
}
List<String> decisions = Arrays.asList(byCode.getValue().split(","));
List<StIvtStructattr> dispense = decisionHandler.dispense(decisions, form);
return dispense;
Map<String, String> map = decisionHandler.dispense(decisions, form);
return map;
}
@Override
@@ -142,4 +142,10 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
return collectVehicle;
}
@Override
public List<StructattrVechielDto> structVehicle(Map query) {
List<StructattrVechielDto> structVehicle = this.baseMapper.structVehicle(query);
return structVehicle;
}
}

View File

@@ -13,6 +13,7 @@ import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.ForkMap;
import org.nl.common.utils.MapOf;
import org.nl.wms.system_manage.service.dict.ISysDictService;
import org.nl.wms.system_manage.service.dict.dao.Dict;
@@ -128,9 +129,9 @@ public class SysDictController {
List<Map> items = new ArrayList<>();
for (StatusEnum value : StatusEnum.values()) {
if (value.name().equals(type)){
Map<String, String> code = value.getCode();
for (String label : code.keySet()) {
items.add(MapOf.of("label",label,"value",code.get(label)));
ForkMap<String, String, String> forkMap = value.getCode();
for (String label : forkMap.getKeySet()) {
items.add(MapOf.of("label",label,"value",forkMap.getM(label)));
}
break;
}

View File

@@ -106,8 +106,8 @@
<el-table-column show-overflow-tooltip prop="pcsn" label="物料批次" width="160" align="center">
<template scope="scope"><el-input v-model="tableData[scope.$index].pcsn" class="input-with-select" /></template>
</el-table-column>
<el-table-column show-overflow-tooltip prop="plan_qty" label="计划数量" width="160" align="center">
<template scope="scope"><el-input-number v-model="tableData[scope.$index].plan_qty" class="input-with-select" /></template>
<el-table-column show-overflow-tooltip prop="qty" label="计划数量" width="160" align="center">
<template scope="scope"><el-input-number v-model="tableData[scope.$index].qty" class="input-with-select" /></template>
</el-table-column>
<el-table-column show-overflow-tooltip prop="unit_id" label="单位" width="160">
<template slot-scope="scope">
@@ -321,11 +321,15 @@ export default {
},
tableDtlMaterial2(data) {
let mst = data['t'];
let rows = data['item'];
let rows = [];
this.form.source_form_type = mst.form_type
this.form.source_form_id = mst.id
let mst_form_data = mst.form_data;
if (data['item'] ==null || data['item'].length == 0){
rows.push(mst)
}else {
rows = data['item']
}
this.cols.forEach(a=>{
let item = ''
if (a.value in mst_form_data) {

View File

@@ -107,8 +107,7 @@
<el-table-column show-overflow-tooltip prop="material_name" label="物料名称" />
<el-table-column show-overflow-tooltip prop="material_spec" label="物料规格" />
<el-table-column show-overflow-tooltip prop="pcsn" label="批次" />
<el-table-column show-overflow-tooltip prop="plan_qty" label="计划数量" />
<el-table-column show-overflow-tooltip prop="qty" label="载具分配数量" />
<el-table-column show-overflow-tooltip prop="qty" label="计划数量" />
<el-table-column show-overflow-tooltip prop="unit_id" label="单位" align="center" />
<el-table-column show-overflow-tooltip prop="stor_code" label="仓库" />
<el-table-column show-overflow-tooltip prop="struct_code" label="仓位" width="160"/>
@@ -142,6 +141,7 @@
<el-table-column min-width="120" show-overflow-tooltip prop="material_spec" label="物料规格" align="center" />
<el-table-column prop="pcsn" label="批次" align="center" width="150" />
<el-table-column prop="qty" :formatter="crud.formatNum3" label="数量" align="center" />
<el-table-column prop="frozen_qty" :formatter="crud.formatNum3" label="分配数量" align="center" />
<el-table-column min-width="120" show-overflow-tooltip prop="stor_code" label="仓库" align="center" />
<el-table-column min-width="120" show-overflow-tooltip prop="struct_code" label="载具所在仓位" align="center" />
<el-table-column prop="point_code1" label="任务起始位置" align="center" width="120"/>

View File

@@ -91,7 +91,7 @@
<el-table-column min-width="120" show-overflow-tooltip prop="material_name" label="物料名称" align="center" />
<el-table-column min-width="120" show-overflow-tooltip prop="material_spec" label="物料规格" align="center" />
<el-table-column prop="pcsn" label="批次" width="150" align="center" />
<el-table-column prop="plan_qty" :formatter="crud.formatNum3" label="计划数量" align="center" />
<el-table-column prop="qty" :formatter="crud.formatNum3" label="计划数量" align="center" />
<el-table-column prop="qty" :formatter="crud.formatNum3" width="150" label="载具物料数量" align="center" />
<el-table-column prop="unit_id" label="单位" align="center" />
<el-table-column prop="vehicle_code" label="载具" align="center" />