add:添加托盘出入库流程

This commit is contained in:
zhangzq
2024-06-23 21:49:23 +08:00
parent 4e9b789877
commit cb0268055d
46 changed files with 779 additions and 166 deletions

View File

@@ -31,8 +31,8 @@ public enum StatusEnum {
/**
* 出入库单据类型
*/
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10","inStorageTask", "调拨入库", "11","inStorageTask", "退货入库", "12","inStorageTask","拣选回库", "13","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask", "拣选出库", "23","conveyorOutStorageTask")),
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10","inStorageTask", "调拨入库", "11","inStorageTask", "退货入库", "12","inStorageTask","拣选回库", "13","inStorageTask","托盘入库", "30","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask", "拣选出库", "23","conveyorOutStorageTask","托盘出库", "40","outStorageTask")),
/**
* 任务类型

View File

@@ -6,6 +6,7 @@ import org.nl.wms.system_manage.service.coderule.ISysCodeRuleService;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class CodeUtil {
@@ -14,7 +15,8 @@ public class CodeUtil {
public static String getNewCode(String ruleCode) {
final String[] code = {""};
ISysCodeRuleService service = SpringContextHolder.getBean(ISysCodeRuleService.class);
RedissonUtils.lock(() -> code[0] = service.codeDemo("1",ruleCode), ruleCode, 1);
RedissonUtils.lock(() ->
code[0] = service.codeDemo("1",ruleCode), ruleCode, 2);
return code[0];
}
public static String codeView(String ruleCode) {

View File

@@ -40,7 +40,7 @@ public class RedissonUtils {
ex.printStackTrace();
throw ex;
}finally {
if (isLock){
if (lock.isHeldByCurrentThread() && lock.isLocked()){
lock.unlock();
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.nl.common.domain.interfaces.CallBack;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
@@ -11,6 +12,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/*
* @author ZZQ
@@ -66,6 +68,10 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
assertContextInjected();
return applicationContext.getBean(requiredType);
}
public static <T> Map<String,T> getBeansOfType(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBeansOfType(requiredType);
}
/**
* 获取SpringBoot 配置信息

View File

@@ -1,16 +1,24 @@
package org.nl.wms.base_manage.bsrealstorattr.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.utils.IdUtil;
import org.nl.wms.base_manage.bsrealstorattr.service.IStIvtBsrealstorattrService;
import org.nl.wms.base_manage.bsrealstorattr.service.dao.StIvtBsrealstorattr;
import org.nl.wms.base_manage.bsrealstorattr.service.dto.StorQuery;
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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
@@ -31,6 +39,11 @@ public class StIvtBsrealstorattrController {
*/
@Autowired
private IStIvtBsrealstorattrService iStIvtBsrealstorattrService;
/**
* 仓库服务
*/
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@GetMapping
public ResponseEntity<Object> query(StorQuery query, PageQuery page){
@@ -68,4 +81,43 @@ public class StIvtBsrealstorattrController {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/batchSaveAttr")
@SaIgnore
public ResponseEntity<Object> batchSaveAttr(@Validated @RequestBody JSONObject config) {
int = config.getInteger("x");
int = config.getInteger("y");
int = config.getInteger("z");
String sect_code = config.getString("sect_code");
String stor_code = config.getString("stor_code");
String now = DateUtil.now();
ArrayList<StIvtStructattr> list = new ArrayList<>();
for (int x = 1; x <= ; x++) {
for (int y = 1; y <= ; y++) {
for (int z = 1; z <= ; z++) {
StIvtStructattr attr = new StIvtStructattr();
attr.setId(IdUtil.getStringId());
attr.setSect_code(sect_code);
attr.setStor_code(stor_code);
String ny = (y < 10) ? "0" + y : "" + y;
String nz = (z < 10) ? "0" + z : "" + z;
attr.setStruct_code("T0"+x+"-"+ny+"-"+nz);
attr.setStruct_name(x+""+y+""+z+"");
attr.setCreate_id("1");
attr.setRow_num(x);
attr.setCol_num(y);
attr.setBlock_num(1);
attr.setLayer_num(z);
attr.setCreate_time(now);
attr.setCreate_name("Admin");
attr.setIs_temp(false);
attr.setIs_used(true);
list.add(attr);
}
}
}
iStIvtStructattrService.saveBatch(list);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}

View File

@@ -0,0 +1,58 @@
package org.nl.wms.decision_manage.handler.chainer;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.decision_manage.handler.chainer.impl.EndDecisionChainer;
import org.nl.wms.decision_manage.handler.chainer.impl.ExecuteDecisionChainer;
import org.nl.wms.decision_manage.handler.chainer.impl.StartDecisionChainer;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.flow_manage.flow.framework.engine.behavior.FlowNodeActivityBehavior;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.interceptor.CommandInterceptor;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.interceptor.impl.InvokeCommandInterceptor;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.interceptor.impl.ThreadCommandInterceptor;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
* @author ZZQ
* @Date 2024/3/21 11:26
*/
@Configuration
public class ChainerService {
public static DecisionerChain start(List<String> decisionerTypes, JSONObject form){
List<DecisionerChain> chain = new ArrayList<>();
Map<String, Decisioner> decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class);
Decisioner decisioner = decisionerMap.get(decisionerTypes.get(0));
StartDecisionChainer start = new StartDecisionChainer(decisioner.strategyConfig.getStrategy_type(),form);
EndDecisionChainer end = new EndDecisionChainer(decisioner.strategyConfig.getStrategy_type(),form);
ExecuteDecisionChainer execute = new ExecuteDecisionChainer(decisionerTypes,form);
chain.add(start);
chain.add(execute);
chain.add(end);
for (int i = 0; i < chain.size() - 1; i++) {
chain.get(i).setNext(chain.get(i + 1));
}
return chain.get(0);
}
public static DecisionerChain initCommandInterceptor(){
// chain.add(new ThreadCommandInterceptor());
// chain.add(new InvokeCommandInterceptor());
// for (int i = 0; i < chain.size() - 1; i++) {
// chain.get(i).setNext(chain.get(i + 1));
// }
// return chain.get(0);
return null;
}
}

View File

@@ -0,0 +1,38 @@
package org.nl.wms.decision_manage.handler.chainer;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;
import java.util.HashMap;
import java.util.Map;
/*
* @author ZZQ
* @Date 2024/3/21 11:10
* 链式调用
*/
@Data
public abstract class DecisionerChain<T> {
private DecisionerChain<T> next;
protected abstract T execute(T executeParam);
public final T chainExecute(T executeParam){
T result = this.execute(executeParam);
if (this.next!=null){
result = this.next.chainExecute(result);
}
return result;
}
public final Map process(T executeParam){
T t = this.chainExecute(executeParam);
return packge(t);
}
public Map packge(T processResult){
return new HashMap();
}
}

View File

@@ -0,0 +1,73 @@
package org.nl.wms.decision_manage.handler.chainer.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.Data;
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.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
* @Date 2024/3/21 11:10
* 链式调用
*/
@Data
public class EndDecisionChainer extends DecisionerChain<List> {
private String strategy_type;
private JSONObject startParam;
private List result;
public EndDecisionChainer(String strategy_type, JSONObject startParam) {
this.strategy_type = strategy_type;
this.startParam = startParam;
}
@Override
protected List execute(List transfers) {
if (CollectionUtils.isEmpty(transfers)){
throw new BadRequestException("当前分配策略无可用货位");
}
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class);
IMdPbVehicleMaterService iMdPbVehicleMaterService = SpringContextHolder.getBean(IMdPbVehicleMaterService.class);
List<String> structs = new ArrayList<>();
if (in_storage){
StIvtStructattr structattr = (StIvtStructattr)transfers.get(0);
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("vehicle_code", startParam.getString("vehicle_code"))
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code", structattr.getStruct_code()));
System.out.println("货位绑定成功"+structattr.getStruct_code());
structs.add(structattr.getStruct_code());
}else {
for (StructattrVechielDto vechielDto : ((List<StructattrVechielDto>) transfers)) {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty",vechielDto.getFrozen_qty())
.eq("id",vechielDto.getVm_id()));
}
List<String> collect = ((List<StructattrVechielDto>) transfers).stream().map(StructattrVechielDto::getVehicle_code).collect(Collectors.toList());
System.out.println("载具绑定成功"+collect.toString());
structs = collect;
}
return structs;
}
}

View File

@@ -0,0 +1,56 @@
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
* @Date 2024/3/21 11:10
* 链式调用
*/
@Data
public class ExecuteDecisionChainer extends DecisionerChain<List> {
private List<String> decisionerTypes;
private JSONObject startPatam;
public ExecuteDecisionChainer(List<String> decisionerTypes, JSONObject startPatam) {
this.decisionerTypes = decisionerTypes;
this.startPatam = startPatam;
}
@Override
protected List execute(List transfers) {
Map<String, Decisioner> decisionerMap = SpringContextHolder.getBeansOfType(Decisioner.class);
List list = new ArrayList();
for (String decisionerType : decisionerTypes) {
Decisioner decisioner = decisionerMap.get(decisionerType);
list = decisioner.handler(transfers, startPatam);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前策略"+decisioner.strategyConfig.getStrategy_name()+"无可用货位,分配前数量:"+transfers.size());
}
}
return list;
}
}

View File

@@ -0,0 +1,77 @@
package org.nl.wms.decision_manage.handler.chainer.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.MapOf;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.decision_manage.handler.chainer.DecisionerChain;
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.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler;
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
* @Date 2024/3/21 11:10
* 链式调用
*/
@Data
public class StartDecisionChainer extends DecisionerChain<List> {
private String strategy_type;
private JSONObject startParam;
public StartDecisionChainer(String strategy_type,JSONObject startParam) {
this.strategy_type = strategy_type;
this.startParam = startParam;
}
@Override
protected List execute(List from) {
List list;
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class);
if (in_storage){
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code(""))
.eq("stor_code", startParam.getString("stor_code"));
query.isNull("vehicle_code");
list = iStIvtStructattrService.list(query);
}else {
list = iStIvtStructattrService.structVehicle(MapOf.of("stor_code",startParam.getString("stor_code")));
}
return list;
}
@Override
public Map packge(List processResult) {
if (CollectionUtils.isEmpty(processResult)){
throw new BadRequestException("策略分配异常:结果值为空");
}
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
if (in_storage){
return MapOf.of("struct_code",processResult.get(0));
}else {
return MapOf.of("vehicle_code",processResult.stream().collect(Collectors.joining(",")));
}
}
}

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.handler;
package org.nl.wms.decision_manage.handler.decisioner;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
import org.nl.common.domain.exception.BadRequestException;
@@ -6,7 +6,7 @@ import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
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.StructattrQuery;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
@@ -7,7 +7,7 @@ import org.nl.common.utils.ListOf;
import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -1,24 +1,19 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
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;
/*
@@ -51,7 +46,7 @@ public class FIFORuleHandler extends Decisioner<StructattrVechielDto, JSONObject
public List<StructattrVechielDto> handler(List<StructattrVechielDto> list, JSONObject param) {
// 判断仓位是否为空
if (ObjectUtil.isEmpty(list)) {
throw new BadRequestException("仓位集合为空!");
throw new BadRequestException("库存分配失败:库存不足!");
}
//分配数量
int plan_qty = param.getInteger("qty");
@@ -65,7 +60,7 @@ public class FIFORuleHandler extends Decisioner<StructattrVechielDto, JSONObject
List<StructattrVechielDto> disList = new ArrayList<>();
for (StructattrVechielDto structattr : vechielDtos) {
if (need.contains(structattr.getVehicle_code())){
if (need.contains(structattr.getVehicle_code()) && structattr.getFrozen_qty().intValue()==0){
int cause_qty = structattr.getQty().subtract(structattr.getFrozen_qty()).intValue();
int sub = plan_qty - cause_qty;
disList.add(structattr);

View File

@@ -1,4 +1,4 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import com.alibaba.fastjson.JSONArray;
import org.nl.common.domain.exception.BadRequestException;
@@ -7,7 +7,7 @@ import org.nl.wms.stor_manage.io.service.iostor_dtl.dao.StIvtIostorinvdtl;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
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;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -1,13 +1,10 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
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.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.decision_manage.service.dao.StStrategyConfig;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,11 +1,11 @@
package org.nl.wms.decision_manage.handler.impl.base;
package org.nl.wms.decision_manage.handler.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@@ -1,6 +1,6 @@
package org.nl.wms.decision_manage.handler.impl.diy;
package org.nl.wms.decision_manage.handler.decisioner.impl.diy;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import java.util.List;

View File

@@ -42,7 +42,7 @@ import java.util.List;
* @created 2020年6月12日 下午5:53:28
*/
@Slf4j
@Service("ZPInStorage")
@Service("groupInStorage")
public class GroupDickInStorageTask extends AbstractTask {
@Autowired

View File

@@ -0,0 +1,84 @@
package org.nl.wms.dispatch_manage.task.handler.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService;
import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.nl.wms.flow_manage.monitor.event.FlowContinueEvent;
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;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* Title: AbstractAcsTask.java Description:任务抽象类
* <p>
* Task状态:01生成 ,02确定起点03、确定终点04、起点和终点都确认05:下发,可以下发, 06、执行中 07、完成
* 完成方式:01自动,02:wcs删除03、wms删除04、发给wcs失败自动删除
*
* @author ldjun
* @created 2020年6月12日 下午5:53:28
*/
@Slf4j
@Service("palletInStorageTask")
public class PalletInStorageTask extends AbstractTask {
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private IActRuExecutionService iActRuExecutionService;
@Override
public JSONObject createTask(JSONObject data) {
for (String vehicle_code : data.keySet()) {
String point_code1 = data.getString(vehicle_code);
if (StringUtils.isEmpty(point_code1)){
throw new BadRequestException("申请任务失败:请求参数数据异常");
}
List<MdPbVehicleMaterVo> item = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code);
if (CollectionUtils.isEmpty(item)){
throw new BadRequestException("申请任务失败:载具"+vehicle_code+"物料信息不存在");
}
MdPbVehicleMaterVo vehicleMater = item.get(0);
//更新载具proc_inst_id
String currentInstId = vehicleMater.getProc_inst_id();
if (StringUtils.isEmpty(currentInstId)){
throw new BadRequestException("申请任务失败:载具"+vehicle_code+"未创建入库流程");
}
ActRuExecution execution = iActRuExecutionService.getById(currentInstId);
if (execution == null){
throw new BadRequestException("申请任务失败:载具"+vehicle_code+"流程信息不存在"+currentInstId);
}
FlowContinueEvent continueEvent = new FlowContinueEvent(currentInstId, null, new JSONObject(MapOf.of("start_point", point_code1)));
BussEventMulticaster.Publish(continueEvent);
}
return null;
}
@Override
public void updateStatus(JSONObject data) {
}
@Override
public void cancel(JSONObject data) {
}
}

View File

@@ -1,24 +1,10 @@
package org.nl.wms.external_system;
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.utils.InterationUtil;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.acs.service.AcsToWmsService;
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;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/*
* @author ZZQ
* @Date 2024/5/6 14:53
@@ -33,8 +19,9 @@ public class GateWayService {
public void apply(InteracteDto param){
//处理日志相关
String service = param.getService();
String type = param.getType();
//根据服务拆分不同的业务
acsToWmsService.applyTask(param.getService(),param.getData());
acsToWmsService.applyTask(param.getService(), type, param.getData());
}

View File

@@ -9,7 +9,6 @@ import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.InterationUtil;
import org.nl.common.utils.SpringContextHolder;
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;
@@ -37,9 +36,20 @@ public class AcsToWmsService implements InitializingBean {
private SyncFormMapping mapping;
public void applyTask(String service,JSONObject data){
if (service.equals("ZPInStorage")){
applyTaskMap.get("ZPInStorage").createTask(data);
public void applyTask(String service,String type,JSONObject data){
if (service.equals("InStorage")){
/*
{
"service": "ZPInStorage",
"ip": "ip_7va9w",
"request_time": "request_time_pbi5u",
"trace_id": "trace_id_xl8dk",
"data": {
"D00018": "start001"
}
}
* */
applyTaskMap.get(type).createTask(data);
}
if (service.equals("TaskStatus")){
String task_code = data.getString("task_code");

View File

@@ -11,6 +11,7 @@ import lombok.Data;
public class InteracteDto {
String service;
String type;
String ip;
String request_time;
String trace_id;

View File

@@ -22,6 +22,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -69,8 +70,15 @@ public class ExecutionController {
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
List<String> removeCollect = new ArrayList<>();
removeCollect.addAll(Arrays.asList(ids));
if (ids.length > 0) {
executionService.removeByIds(Arrays.asList(ids));
for (String proc_inst_id : ids) {
removeCollect.addAll(executionService.getChildList(proc_inst_id));
}
if (removeCollect.size()>0){
executionService.removeByIds(removeCollect);
}
}
return new ResponseEntity<>(HttpStatus.OK);
}

View File

@@ -27,8 +27,12 @@ public class SubProcessConverter extends BaseNodeConverter {
subProcess.setChildren(node.getJSONArray("children").toJavaList(String.class));
subProcess.setName(properties.getString("name"));
subProcess.setSplit(properties.getString("split"));
subProcess.setSplitSwitch(properties.getBoolean("splitSwitch"));
subProcess.setPermeate(properties.getBoolean("permeate"));
if (properties.getBoolean("splitSwitch")!=null){
subProcess.setSplitSwitch(properties.getBoolean("splitSwitch"));
}
if (properties.getBoolean("permeate")!=null){
subProcess.setPermeate(properties.getBoolean("permeate"));
}
subProcess.setDocumentation(properties.getString("documentation"));
//设置触发事件
subProcess.setExecutionListeners(null);

View File

@@ -13,7 +13,9 @@ import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor;
import org.nl.wms.flow_manage.flow.framework.engine.operation.impl.SequenceFlowOperation;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowElement;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowNode;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.Sequence.SequenceFlow;
import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService;
import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.nl.wms.flow_manage.flow.service.history.IActHiExecutionService;
@@ -43,12 +45,13 @@ public abstract class FlowNodeActivityBehavior<T> {
public final void activity(ExecutionEntity<T> entity) {
IActRuExecutionService iActRuExecutionService = SpringContextHolder.getBean(IActRuExecutionService.class);
String proc_inst_id = entity.getProc_inst_id();
try {
//当前节点:子节点更换form_type
log.info("流程:{},开始流程数据:{}", entity.getActivityName(),JSONObject.toJSONString(entity.getT()));
if (StringUtils.isNotEmpty(entity.getProc_inst_id())){
if (StringUtils.isNotEmpty(proc_inst_id)){
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.eq("proc_inst_id",entity.getProc_inst_id())
.eq("proc_inst_id", proc_inst_id)
.set("activity_id", entity.getActivityId())
.set("activity_name", entity.getActivityName())
.set("form_type", entity.getForm_type())
@@ -62,7 +65,7 @@ public abstract class FlowNodeActivityBehavior<T> {
this.execute(entity);
log.info("流程:{},结束流程数据:{}", entity.getActivityName(), JSONObject.toJSONString(entity.getT()));
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.eq("proc_inst_id",entity.getProc_inst_id())
.eq("proc_inst_id", entity.getProc_inst_id())
.set("status", StatusEnum.FLOW_STATUS.code("节点完成"))
.set("form_data", entity.getT().toString())
.set("aux_param", entity.getAuxParam().toString())
@@ -75,11 +78,12 @@ public abstract class FlowNodeActivityBehavior<T> {
ex.printStackTrace();
log.error(entity.getActivityName()+"流程执行异常:{}",ex.getMessage());
ActRuExecution execution = new ActRuExecution();
execution.setProc_inst_id(entity.getProc_inst_id());
execution.setProc_inst_id(proc_inst_id);
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.eq("proc_inst_id",entity.getProc_inst_id())
.eq("proc_inst_id", proc_inst_id)
.set("status", StatusEnum.FLOW_STATUS.code("暂停"))
.set("remark","节点:"+entity.getActivityName()+":异常:"+ex.getMessage()));
throw new BadRequestException(ex.getMessage());
}
}
@@ -98,10 +102,16 @@ public abstract class FlowNodeActivityBehavior<T> {
historyEntity.setUpdate_time(DateUtil.now());
history.save(historyEntity);
this.leave(entity);
FlowNode currentFlowElement = (FlowNode)entity.getCurrentFlowElement();
if (currentFlowElement.getPassNode()){
FlowElement flowElement = entity.getCurrentFlowElement();
if (flowElement instanceof FlowNode){
if (((FlowNode)flowElement).getPassNode()){
CommandExecutor.getAgenda().planOperation(new SequenceFlowOperation(entity));
}
}
if (flowElement instanceof SequenceFlow){
CommandExecutor.getAgenda().planOperation(new SequenceFlowOperation(entity));
}
}
public void execute(ExecutionEntity<T> entity) {}

View File

@@ -1,16 +1,20 @@
package org.nl.wms.flow_manage.flow.framework.engine.behavior.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.ListOf;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SpelUtil;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.flow_manage.flow.framework.engine.behavior.FlowNodeActivityBehavior;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowElement;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.Sequence.SequenceFlow;
import org.nl.wms.flow_manage.flow.framework.entity.node.impl.gateway.GateWay;
import org.nl.wms.flow_manage.flow.service.history.IActHiExecutionService;
import org.nl.wms.flow_manage.flow.service.history.dao.ActHiExecution;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -33,19 +37,34 @@ public class GateWayActivityBehavior extends FlowNodeActivityBehavior<JSONObject
FlowElement element = entity.getCurrentFlowElement();
GateWay gateWay = (GateWay) element;
List<SequenceFlow> targetSequence = new ArrayList<>();
SequenceFlow targetSequence = null;
for (SequenceFlow sequenceFlow : gateWay.getOutgoingFlows()) {
String skipExpression = sequenceFlow.getSkipExpression();
Boolean parse = SpelUtil.parse(entity.getT().getJSONObject("t"),skipExpression, Boolean.class);
if (parse){
targetSequence.add(sequenceFlow);
System.out.println(Thread.currentThread().getName()+"_执行网关判断:"+skipExpression+"_"+sequenceFlow.getName());
targetSequence = sequenceFlow;
break;
}
}
if (CollectionUtils.isEmpty(targetSequence)){
if (targetSequence == null){
throw new BadRequestException("当前网关没有满足的流程线");
}
gateWay.setOutgoingFlows(targetSequence);
//手动保存网关调用
IActHiExecutionService history = SpringContextHolder.getBean(IActHiExecutionService.class);
ActHiExecution historyEntity = new ActHiExecution();
historyEntity.setProc_inst_id(entity.getProc_inst_id());
historyEntity.setParent_id(entity.getParent_id());
historyEntity.setActivity_id(entity.getActivityId());
historyEntity.setActivity_name(entity.getActivityName());
historyEntity.setForm_type(entity.getForm_type());
historyEntity.setForm_id(entity.getForm_id());
historyEntity.setForm_data((JSONObject) entity.getT());
historyEntity.setAux_param(entity.getAuxParam());
historyEntity.setUpdate_time(DateUtil.now());
history.save(historyEntity);
entity.setCurrentFlowElement(targetSequence);
//处理流程线:将结果值封装
super.execute(entity);
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.wms.flow_manage.flow.framework.converter.BpmnJSONConverter;
import org.nl.wms.flow_manage.flow.framework.engine.behavior.FlowNodeActivityBehavior;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor;
@@ -54,6 +55,10 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
List<Object> subList = new ArrayList<>();
String splitParam = subProcess.getSplit();
if (StringUtils.isNotEmpty(splitParam)){
if (items == null){
items = new JSONArray();
items.add(form);
}
for (int i = 0; i < items.size(); i++) {
JSONObject item = items.getJSONObject(i);
JSONObject t = (JSONObject)item.remove("t");
@@ -94,6 +99,9 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
subEntity.setForm_id(entity.getForm_id());
subEntity.setForm_type(entity.getForm_type());
subEntity.setDeploymentId(entity.getDeploymentId());
JSONObject subAuxParam = new JSONObject();
subAuxParam.putAll(entity.getAuxParam());
subEntity.setAuxParam(subAuxParam);
subEntity.setCurrentFlowElement(startEvent);
if (subProcess.getPermeate()){
subEntity.setCallback(entity.getCallback().andThen(() -> ((JSONObject) o).getJSONObject("t").getString("vehicle_code")));
@@ -102,6 +110,7 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
//在endEvent中有个所有子流程结束的判断如果判断成功会触发父流程startEvent暂时通过等待处理防止自动流程导致endEvent判断出错
commandExecutor.execute(new StartInstanceCmd(), subEntity);
}).exceptionally(throwable -> {
throwable.printStackTrace();
buffer.append("子流程执行异常"+throwable.getMessage());
return null;
})).parallel().forEach(CompletableFuture::join);

View File

@@ -1,5 +1,6 @@
package org.nl.wms.flow_manage.flow.framework.engine.operation.impl;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.wms.flow_manage.flow.framework.engine.cmd.CommandExecutor;
import org.nl.wms.flow_manage.flow.framework.engine.operation.AbstractOperation;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
@@ -28,14 +29,22 @@ public class SequenceFlowOperation extends AbstractOperation {
FlowNode flowNode = (FlowNode) flowElement;
//EndEvent没有outgoing
List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows();
if (!CollectionUtils.isEmpty(outgoingFlows)){
for (SequenceFlow sequenceFlow : outgoingFlows) {
String skipExpression = sequenceFlow.getSkipExpression();
//TODO:流程线的脚本判断获取当下一个节点:当前节点或者下个节点:这一步统一在网关中处理!!!
execution.setCurrentFlowElement(sequenceFlow.getTargetFlowElement());
}
CommandExecutor.getAgenda().planOperation(new ContinuOperation(execution));
if (CollectionUtils.isEmpty(outgoingFlows)){
return;
}
if (outgoingFlows.size()>1){
throw new BadRequestException("流程异常:当前流程节点"+flowNode.getName()+"存在2条流程线且无网关配置");
}
execution.setCurrentFlowElement(outgoingFlows.get(0).getTargetFlowElement());
}
if (flowElement instanceof SequenceFlow){
FlowNode flowNode = ((SequenceFlow) flowElement).getTargetFlowElement();
if (flowNode == null){
throw new BadRequestException("流程异常:当前流程线"+flowNode.getId()+"为配置目标流程节点");
}
execution.setCurrentFlowElement(flowNode);
}
CommandExecutor.getAgenda().planOperation(new ContinuOperation(execution));
}
}

View File

@@ -35,11 +35,11 @@ public class SubProcess extends FlowNode {
/**
* 数据拆分
*/
protected Boolean splitSwitch;
protected Boolean splitSwitch=Boolean.FALSE;
/**
* 透传回调函数
*/
protected Boolean permeate;
protected Boolean permeate =Boolean.FALSE;

View File

@@ -3,22 +3,22 @@ package org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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;
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.decision_manage.handler.chainer.ChainerService;
import org.nl.wms.decision_manage.handler.chainer.DecisionerChain;
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;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.decision_manage.handler.Decisioner;
import org.nl.wms.decision_manage.handler.decisioner.Decisioner;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler;
@@ -29,7 +29,6 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
@@ -74,69 +73,20 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
Map<String, String> map = SpringContextHolder.getBean(DecisionHandler.class).dispense(params, item_json);
//更新仓位,更新数据
System.out.println(flow.getForm_type()+"更新明细id"+item_json.getString("id"));
// StringBuffer sql = new StringBuffer();
// sql.append("update ")
// .append(flow.getForm_type())
// .append(" set struct_code = ")
// .append("'"+collect+"'")
// .append(" where id = ")
// .append("'"+item_json.getString("id")+"'");
// iPmFormDataService.dynamicSql(sql.toString());
item_json.putAll(map);
return t;
}
@Transactional(propagation= Propagation.REQUIRES_NEW)
public Map<String,String> dispense(List<String> params, JSONObject iostorinvdtl) {
Decisioner oneDecisioner = decisionHandlerMap.get(params.get(0));
//判断是出库还是入库
String strategy_type = oneDecisioner.strategyConfig.getStrategy_type();
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
AtomicReference<Map> structCode = new AtomicReference<>();
if (StringUtils.isEmpty(iostorinvdtl.getString("stor_code"))){
throw new BadRequestException("出入库策略执行异常:单据确认仓库编码");
}
AtomicReference<Map> atomicResult = new AtomicReference<>();
RedissonUtils.lock(()->{
List list;
if (in_storage){
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 {
list = iStIvtStructattrService.structVehicle(null);
}
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
for (String param : params) {
Decisioner decisioner = decisionHandlerMap.get(param);
list = decisioner.handler(list, iostorinvdtl);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前分配策略无可用货位");
}
}
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("无可分配货位!");
}
if (in_storage){
StIvtStructattr structattr = (StIvtStructattr)list.get(0);
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
// .set("vehicle_code", iostorinvdtl.getVehicle_code())
.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();
DecisionerChain<List<String>> start = ChainerService.start(params, iostorinvdtl);
Map process = start.process(null);
atomicResult.set(process);
},""+iostorinvdtl.getString("stor_code"),2);
return atomicResult.get();
}
}

View File

@@ -31,9 +31,6 @@ public class StorageChangesProcessHandler implements ClassProcess {
@Autowired
private ISchBaseTaskService schBaseTaskService;
@Autowired
private IMdPbVehicleMaterService vehicleMaterService;
@Override
public JSONObject process(JSONObject from, JSONObject param) {
//暂时出入入库的问题:库存变动中任务变动由任务变动接口处理
@@ -52,13 +49,9 @@ public class StorageChangesProcessHandler implements ClassProcess {
StatusEnum.FORM_STATUS.code("完成");
StatusEnum.FORM_STATUS.code("取消");
//TODO:后续在流程节点中配置监听时间触发
List<MdPbVehicleMater> vehicleMaters = vehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", schBaseTask.getVehicle_code()));
MdPbVehicleMater vehicleMater = vehicleMaters.get(0);
BussEventMulticaster.Publish(StructEvent.builder()
.task_type(schBaseTask.getTask_type())
.status(schBaseTask.getStatus())
.source_form_id(vehicleMater.getSource_form_id())
.source_form_type(vehicleMater.getSource_form_type())
.vehicle_code(schBaseTask.getVehicle_code())
.point_code1(schBaseTask.getPoint_code1())
.point_code2(schBaseTask.getPoint_code2())

View File

@@ -20,4 +20,7 @@ public interface IActRuExecutionService extends IService<ActRuExecution> {
Object getAll(ExecutionQuery query, PageQuery page);
List<String> queryHisActivityId(String proc_inst_id);
List<String> getChildList(String proc_inst_id);
}

View File

@@ -1,8 +1,11 @@
package org.nl.wms.flow_manage.flow.service.execution.dao.mapper;
import org.apache.ibatis.annotations.Select;
import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* <p>
* 流程实例表 Mapper 接口
@@ -12,5 +15,16 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @since 2024-03-21
*/
public interface ActRuExecutionMapper extends BaseMapper<ActRuExecution> {
@Select("SELECT\n" +
" max(t3.childId)\n" +
" from\n" +
" (\n" +
" select *,\n" +
" if( find_in_set(parent_id, @p) > 0,@p := concat(@p,',',proc_inst_id),0 ) as childId\n" +
" from\n" +
" (select t.proc_inst_id as proc_inst_id, t.parent_id from act_ru_execution t ) t1,\n" +
" (select @p := #{proc_inst_id}) t2\n" +
" ) t3\n" +
" where childId != '0'")
String findAllChild(String proc_inst_id);
}

View File

@@ -1,12 +1,14 @@
package org.nl.wms.flow_manage.flow.service.execution.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
@@ -23,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -92,4 +95,14 @@ public class ActRuExecutionServiceImpl extends ServiceImpl<ActRuExecutionMapper,
}
}
}
@Override
public List<String> getChildList(String proc_inst_id) {
Assert.notNull(proc_inst_id, "参数不能为空");
String allChild = this.baseMapper.findAllChild(proc_inst_id);
if (StringUtils.isNotEmpty(allChild)){
return Arrays.asList(allChild.split(","));
}
return new ArrayList<>();
}
}

View File

@@ -50,11 +50,11 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
@Override
public String startUp(String model_key, PermeateFunction callback, ExecutionDto dto, JSONObject auxParam) {
ActRuExecution one = iActRuExecutionService.getOne(new QueryWrapper<ActRuExecution>()
Integer one = iActRuExecutionService.count(new QueryWrapper<ActRuExecution>()
.eq("form_type", dto.getForm_type())
.eq("form_id", dto.getForm_id())
.lt("status",StatusEnum.FLOW_STATUS.code("完成")));
if (one!=null){
if (one>0){
throw new BadRequestException("当前单据流程已存在:"+dto.getForm_type()+"_"+dto.getForm_id());
}
ActReProcdef deployment = actReProcdefService.getCurrentVersion(model_key);

View File

@@ -19,7 +19,7 @@ public class FlowStartEvent extends PublishEvent {
private ExecutionDto dto;
private String model_key;
//流程内部函数;在启动时出传入,如果流程失败透传函数将丢失
private PermeateFunction flowStartCallback;

View File

@@ -0,0 +1,56 @@
package org.nl.wms.pda_manage.palletio;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.pda_manage.palletio.service.PalletIostorinvService;
import org.nl.wms.stor_manage.io.service.dto.StorInvQuery;
import org.nl.wms.stor_manage.io.service.iostor.IStIvtIostorinvService;
import org.nl.wms.stor_manage.io.service.iostor.dao.StIvtIostorinv;
import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* <p>
* 出入库单主表 前端控制器
* </p>
*
* @author generator
* @since 2024-03-28
*/
@RestController
@RequestMapping("api/pdaPalletIostorinv")
public class PalletStIvtIostorinvController {
@Autowired
private PalletIostorinvService palletIostorinvService;
@PostMapping("in")
@SaIgnore
@Log("手持托盘入库")
public ResponseEntity<Object> inStorage(@RequestBody JSONObject form) {
palletIostorinvService.inStorage(form);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
@PostMapping("out")
@SaIgnore
@Log("手持托盘出库")
public ResponseEntity<Object> outStorage(@RequestBody JSONObject form) {
palletIostorinvService.outStorage(form);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -0,0 +1,77 @@
package org.nl.wms.pda_manage.palletio.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.utils.*;
import org.nl.wms.flow_manage.monitor.event.FlowStartEvent;
import org.nl.wms.md_manage.group_dick.service.dao.MdGruopDick;
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 java.math.BigDecimal;
/*
* @author ZZQ
* @Date 2024/6/21 14:23
*/
@Service
public class PalletIostorinvService {
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
//托盘库
static String STOR_CODE = "FStockPallet";
public void inStorage(JSONObject form){
Assert.notNull(form, "参数不能为空");
String vehicle_code = form.getString("vehicle_code");
String material_id = form.getString("material_id");
MdPbVehicleMater vehicleMater = new MdPbVehicleMater();
vehicleMater.setGroup_id(IdUtil.getStringId());
vehicleMater.setId(IdUtil.getStringId());
vehicleMater.setCreate_time(DateUtil.now());
vehicleMater.setCreate_name(SecurityUtils.getCurrentNickName());
vehicleMater.setVehicle_code(vehicle_code);
vehicleMater.setMaterial_id(material_id);
vehicleMater.setPcsn("1");
vehicleMater.setStor_code(STOR_CODE);
vehicleMater.setQty(new BigDecimal(1));
vehicleMater.setUnit_id("16");
iMdPbVehicleMaterService.save(vehicleMater);
//触发流程
BussEventMulticaster.Publish(
new FlowStartEvent("pallet_in",
(proc_inst_id,empPlace) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>().set("proc_inst_id",proc_inst_id).eq("vehicle_code",vehicle_code))
,null)
.build("md_pb_vehicleMater",vehicleMater.getId(),null,null, (JSONObject) JSONObject.toJSON(vehicleMater))
);
};
public void outStorage(JSONObject form){
Assert.notNull(form, "参数不能为空");
//触发流程
JSONObject flowData = new JSONObject();
flowData.put("material_id",form.getString("material_id"));
flowData.put("qty",form.getInteger("qty"));
flowData.put("pcsn","1");
flowData.put("stor_code",STOR_CODE);
JSONObject auxParam = new JSONObject();
auxParam.put("target_point",form.getString("target_point"));
BussEventMulticaster.Publish(
new FlowStartEvent("pallet_out",
(proc_inst_id,vehicle) -> {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("proc_inst_id",proc_inst_id)
.eq("vehicle_code",vehicle));
}
,auxParam)
.build("st_ivt_iostorinv",null,null,null, flowData)
);
};
}

View File

@@ -52,20 +52,21 @@ public class FlowEndEventListener extends AbstraceListener<FlowEndEvent> {
.eq("proc_inst_id", proc_inst_id)
.in("form_type",finish)
.select("activity_id","update_time","form_type","form_id"));
Set<String> tmpFormTypes = historys.stream().map(ActHiExecution::getForm_type).collect(Collectors.toSet());
List<BmFormStruc> tmpFormTypeCollect = iBmFormStrucService.list(new QueryWrapper<BmFormStruc>().in("form_type", tmpFormTypes));
Set<String> baseFromCollect = tmpFormTypeCollect.stream().filter(BmFormStruc::getIs_base).map(BmFormStruc::getForm_type).collect(Collectors.toSet());
for (ActHiExecution history : historys) {
StringBuffer sql = new StringBuffer();
sql.append("update ")
.append(baseFromCollect.contains(history.getForm_type())?history.getForm_type():"pm_form_data")
.append(" set status = ")
.append("'"+StatusEnum.FORM_STATUS.code("完成")+"'")
.append(" where id = ")
.append("'"+history.getForm_id()+"'");
iPmFormDataService.dynamicSql(sql.toString());
if (!CollectionUtils.isEmpty(historys)){
Set<String> tmpFormTypes = historys.stream().map(ActHiExecution::getForm_type).collect(Collectors.toSet());
List<BmFormStruc> tmpFormTypeCollect = iBmFormStrucService.list(new QueryWrapper<BmFormStruc>().in("form_type", tmpFormTypes));
Set<String> baseFromCollect = tmpFormTypeCollect.stream().filter(BmFormStruc::getIs_base).map(BmFormStruc::getForm_type).collect(Collectors.toSet());
for (ActHiExecution history : historys) {
StringBuffer sql = new StringBuffer();
sql.append("update ")
.append(baseFromCollect.contains(history.getForm_type())?history.getForm_type():"pm_form_data")
.append(" set status = ")
.append("'"+StatusEnum.FORM_STATUS.code("完成")+"'")
.append(" where id = ")
.append("'"+history.getForm_id()+"'");
iPmFormDataService.dynamicSql(sql.toString());
}
}
}

View File

@@ -46,8 +46,6 @@ public class StructEventListener extends AbstraceListener<StructEvent> {
if (status.equals(StatusEnum.FORM_STATUS.code("取消"))){
}
iostorinvdtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("status",status).eq("id",event.getSource_form_id()));
return null;
}
}

View File

@@ -33,6 +33,10 @@ public class StIvtStructivtflow implements Serializable {
@TableId
private String id;
/**
* 仓库编码
*/
private String stor_code;
/**
* 仓位编码
*/

View File

@@ -71,7 +71,10 @@
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
and IF(ISNULL(md_pb_vehicleMater.is_lock),true,md_pb_vehicleMater.is_lock = false)
<if test="stor_code != null and stor_code != ''">
and st_ivt_structattr.stor_code = #{stor_code}
</if>
</select>
<select id="getStructIvt" resultType="java.util.Map">

View File

@@ -30,6 +30,7 @@ import org.nl.wms.system_manage.service.param.dao.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -64,16 +65,16 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
}
@Override
public void changeStruct(String struct_code, String vehicle_code, String task_type) {
List<MdPbVehicleMater> vehicleMaters = vehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", vehicle_code));
String now = DateUtil.now();
this.update(new UpdateWrapper<StIvtStructattr>()
.set("vehicle_code",vehicle_code)
.set("update_time",now)
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code",struct_code));
//b变动结存
//变动结存记录"如果没有载具物料信息则不考虑结存TODO:多级载具处理
List<MdPbVehicleMater> vehicleMaters = vehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", vehicle_code));
List<StIvtStructivtflow> records = new ArrayList<>();
StIvtStructattr attr = this.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", struct_code).select("stor_code"));
for (MdPbVehicleMater vehicleMater : vehicleMaters) {
StIvtStructivtflow record = new StIvtStructivtflow();
record.setId(IdUtil.getStringId());
@@ -88,11 +89,14 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
record.setSource_form_id(vehicleMater.getSource_form_id());
record.setUnit_id(vehicleMater.getUnit_id());
record.setStruct_code(struct_code);
record.setStor_code(attr.getStor_code());
record.setVehicle_form_data(vehicleMater.getForm_data());
record.setGrowth( StatusEnum.IOBILL_TYPE_IN.check(task_type));
records.add(record);
}
structivtflowService.saveBatch(records);
if (!CollectionUtils.isEmpty(records)){
structivtflowService.saveBatch(records);
}
}
@Override

View File

@@ -24,6 +24,7 @@ import org.nl.wms.system_manage.service.coderule.dao.mapper.SysCodeRuleMapper;
import org.nl.wms.system_manage.service.coderule.dto.CodeRuleQuery;
import org.nl.wms.system_manage.service.coderule.utils.CodeRuleTypeEnum;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -59,6 +60,7 @@ public class SysCodeRuleServiceImpl extends ServiceImpl<SysCodeRuleMapper, SysCo
}
@Override
@Transactional(propagation= Propagation.REQUIRES_NEW)
public String codeDemo(String flag, String code) {
SysCodeRule codeRule = this.getOne(new QueryWrapper<SysCodeRule>().eq("code", code));
if (codeRule == null){