add:新增出库任务

This commit is contained in:
zhangzq
2024-05-28 09:37:47 +08:00
parent 9e3d7111c0
commit 77b4e88f49
26 changed files with 279 additions and 130 deletions

View File

@@ -1,6 +1,5 @@
package org.nl.wms.config_manage.form_struc.service.dao;
import java.math.BigDecimal;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
@@ -8,8 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;

View File

@@ -21,7 +21,8 @@ public class StructEvent extends PublishEvent {
private String task_status;
private String struct_code;
private String point_code1;
private String point_code2;
private String source_form_id;

View File

@@ -0,0 +1,85 @@
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 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.base_manage.vehicle.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.dispatch_manage.task.handler.TaskHandler;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
/*
* @author ZZQ
* @Date 2024/5/6 14:34
* 出库任务入库任务
*/
@Service
public class OutStorageTaskHandler implements TaskHandler {
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISysParamService iSysParamService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Override
public JSONObject process(JSONObject from, JSONObject param) {
//区分出库还是入库
//根据不同的仓位设置不同的终点
Param outStorage = iSysParamService.findByCode("OutStorage");
if (outStorage==null || StringUtils.isEmpty(outStorage.getValue())){
throw new BadRequestException("创建任务失败:OutStorageTaskHandler#process()未配置出库对应点位");
}
JSONObject outStorageConfig = JSONObject.parseObject(outStorage.getValue());
String end_point = outStorageConfig.getString(from.getString("stor_code"));
String vehicle_code = from.getString("vehicle_code");
StIvtStructattr struct = iStIvtStructattrService.getOne(new QueryWrapper<StIvtStructattr>().eq("vehicle_code", vehicle_code));
String struct_code = struct.getStruct_code();
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(end_point)||StringUtils.isEmpty(struct_code)){
throw new BadRequestException("创建任务失败:OutStorageTaskHandler#process()方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("task_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.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(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(struct_code);
task.setPoint_code2(end_point);
taskService.save(task);
Boolean isSend = param.getBoolean("is_send");
if (isSend){
//参数封装调acs接口
}
return (JSONObject)JSON.toJSON(task);
}
}

View File

@@ -38,20 +38,9 @@ public class StackingTaskHandler implements TaskHandler {
@Override
public JSONObject process(JSONObject from, JSONObject param) {
//区分出库还是入库
Boolean in = StatusEnum.TASK_TYPE.check(param.getString("task_type"));
String vehicle_code = from.getString("vehicle_code");
String point_code1;
String point_code2;
if(in){
point_code1 = from.getString("struct_code");
point_code2 = param.getString("start_point");
}else {
point_code2 = from.getString("struct_code");
point_code1 = param.getString("start_point");
}
String point_code1 = from.getString("struct_code");
String point_code2 = param.getString("start_point");
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(point_code1)||StringUtils.isEmpty(point_code2)){
throw new BadRequestException("创建任务失败:StackingTaskHandler#process()方法请求参数不能为空");
}

View File

@@ -51,7 +51,9 @@ public class TaskStatusHandler implements TaskHandler {
.task_status(schBaseTask.getTask_status())
.source_form_id(vehicleMater.getSource_form_id())
.source_form_type(vehicleMater.getSource_form_type())
.vehicle_code(schBaseTask.getVehicle_code()).struct_code(schBaseTask.getPoint_code2())
.vehicle_code(schBaseTask.getVehicle_code())
.point_code1(schBaseTask.getPoint_code1())
.point_code2(schBaseTask.getPoint_code2())
.build());
return from;
}

View File

@@ -49,7 +49,8 @@
sch_base_task.point_code1,
sch_base_task.point_code2,
sch_base_task.task_type,
sch_base_task.task_status
sch_base_task.task_status,
sch_base_task.task_code
FROM
md_pb_vehicleMater
LEFT JOIN st_ivt_structattr ON md_pb_vehicleMater.vehicle_code = st_ivt_structattr.vehicle_code

View File

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.CodeUtil;
import org.nl.common.utils.ListOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
@@ -89,7 +90,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
Assert.notNull(entity.getTask_status(), "任务状态不能为空!");
entity.setId(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
entity.setCreate_name(nickName);
entity.setCreate_time(now);
entity.setUpdate_name(nickName);

View File

@@ -25,6 +25,7 @@ import org.nl.wms.flow_manage.flow.service.deployment.dao.ActReProcdef;
import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -65,14 +66,28 @@ public class SubProcessActivityBehavior extends FlowNodeActivityBehavior<JSONObj
List<JSONObject> subList = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
JSONObject item = items.getJSONObject(i);
String[] vehicle_codes = item.getString("vehicle_code").split(",");
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);
subt.put("vehicle_code",vehicle_code);
JSONObject sub = new JSONObject(item);
sub.put("vehicle_code",vehicle_code);
sub.put("t",subt);
subList.add(sub);
}
}
if (subList!=null){
if (!CollectionUtils.isEmpty(subList)){
// for (JSONObject o : subList) {
// ExecutionEntity subEntity = new ExecutionEntity();
// subEntity.setParent_id(entity.getProc_inst_id());
// subEntity.setForm_id(entity.getForm_id());
// subEntity.setForm_type(entity.getForm_type());
// subEntity.setDeploymentId(entity.getDeploymentId());
// subEntity.setCurrentFlowElement(startEvent);
// subEntity.setT(o);
// //在endEvent中有个所有子流程结束的判断如果判断成功会触发父流程startEvent暂时通过等待处理防止自动流程导致endEvent判断出错
// commandExecutor.execute(new StartInstanceCmd(), subEntity);
// }
//子流程并行,子流程单一的时候直接串行
subList.stream().map((Function<Object, CompletableFuture>) o -> CompletableFuture.runAsync(() -> {
ExecutionEntity subEntity = new ExecutionEntity();

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.RedissonUtils;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
@@ -16,6 +17,7 @@ import org.nl.wms.stor_manage.io.service.in.iostor_dtl.IStIvtIostorinvdtlService
import org.nl.wms.stor_manage.io.service.in.iostor_dtl.dao.StIvtIostorinvdtl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -64,7 +66,7 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
item_json.put("struct_code",collect);
return t;
}
@Transactional
@Transactional(propagation= Propagation.REQUIRES_NEW)
public List<StIvtStructattr> dispense(List<String> params, StIvtIostorinvdtl iostorinvdtl) {
AtomicReference<List<StIvtStructattr>> structCode = new AtomicReference<>();
RedissonUtils.lock(()->{
@@ -89,16 +91,22 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
throw new BadRequestException("当前分配策略无可用货位");
}
}
System.out.println(list);
if (CollectionUtils.isEmpty(list)){
throw new BadRequestException("无可分配货位!");
}
//如果是入库的话只分配一个,出库的话有可能多个货位
if (iostorinvdtl.getIn_storage()){
list= ListOf.of(list.get(0));
}
structCode.set(list);
System.out.println("分配的货位"+list.toString());
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
// .set("vehicle_code", iostorinvdtl.getVehicle_code())
.set("lock_type", StatusEnum.LOCK.code(iostorinvdtl.getIn_storage()?"":""))
.in("struct_code", list.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())));
},"",2);
System.out.println("货位绑定成功");
},"",2);
System.out.println("货位绑定成功------");
return structCode.get();
}
}

View File

@@ -50,6 +50,11 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
@Override
public String startUp(String model_key, Consumer callback, ExecutionDto dto) {
ActRuExecution one = iActRuExecutionService.getOne(new QueryWrapper<ActRuExecution>()
.eq("form_type", dto.getForm_type()).eq("form_id", dto.getForm_id()));
if (one!=null){
throw new BadRequestException("当前单据流程已存在:"+dto.getForm_type()+"_"+dto.getForm_id());
}
ActReProcdef deployment = actReProcdefService.getCurrentVersion(model_key);
if (deployment==null){
throw new BadRequestException("当前单据类型未配置业务流程");
@@ -64,8 +69,8 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
entity.setCurrentFlowElement(bpmnModel.getStartEvent());
entity.setT(JSONObject.toJSON(dto));
entity.setCallback(callback);
entity.setForm_type(dto.getSource_form_type());
entity.setForm_id(dto.getSource_form_id());
entity.setForm_type(dto.getForm_type());
entity.setForm_id(dto.getForm_id());
entity.setStartActivityId(entity.getActivityId());
entity.setDeploymentId(deployment.getDeployment_id());
commandExecutor.execute(new StartInstanceCmd(),entity);

View File

@@ -41,13 +41,16 @@ public class StIvtIostorinvOutController {
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@GetMapping
public ResponseEntity<Object> getAll(StorInvOutQuery query, PageQuery page) {
Page<StIvtIostorinvOut> result = iStIvtIostorinvOutService.page(page.build(), query.build());
return new ResponseEntity<>(TableDataInfo.build(result), HttpStatus.OK);
}
@PostMapping("delete")
public ResponseEntity<Object> delete(@RequestBody List<String> ids) {
iStIvtIostorinvOutService.removeByIds(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Object> save(@RequestBody JSONObject form) {
iStIvtIostorinvOutService.save(form);
@@ -87,5 +90,11 @@ public class StIvtIostorinvOutController {
List<Map> dis = iSchBaseTaskService.getByVehicle(dtl.getString("vehicle_code"));
return new ResponseEntity<>(TableDataInfo.build(dis),HttpStatus.OK);
}
@PostMapping("/taskOpen")
public ResponseEntity<Object> taskOpen(@RequestBody JSONObject dtl) {
iStIvtIostorinvOutService.taskOpen(dtl);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -20,4 +20,6 @@ public interface IStIvtIostorinvOutService extends IService<StIvtIostorinvOut> {
String dispense(JSONObject form);
String canceldispense(JSONObject form);
void taskOpen(JSONObject form);
}

View File

@@ -1,7 +1,11 @@
package org.nl.wms.stor_manage.io.service.out.iostor.dao;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -15,7 +19,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("st_ivt_iostorinv_out")
@TableName(value = "st_ivt_iostorinv_out", autoResultMap = true)
public class StIvtIostorinvOut implements Serializable {
private static final long serialVersionUID = 1L;
@@ -33,7 +37,7 @@ public class StIvtIostorinvOut implements Serializable {
/**
* 出入类型
*/
private Boolean bill_type;
private String bill_type;
/**
@@ -90,7 +94,8 @@ public class StIvtIostorinvOut implements Serializable {
/**
* 自定义映射数据
*/
private String form_data;
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject form_data;
}

View File

@@ -7,10 +7,16 @@ 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.publish.BussEventMulticaster;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.base_manage.vehicle.vehicleMater.service.dao.MdPbVehicleMater;
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.group_dick.service.dao.MdGruopDtl;
import org.nl.wms.stor_manage.io.service.out.iostor.IStIvtIostorinvOutService;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.StIvtIostorinvOut;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.mapper.StIvtIostorinvOutMapper;
@@ -23,9 +29,11 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@@ -111,4 +119,31 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
return null;
}
@Override
public void taskOpen(JSONObject form) {
StIvtIostorinvOut iostorinv = form.toJavaObject(StIvtIostorinvOut.class);
//查询明细
List<StIvtIostorinvdtlOut> dtls = iStIvtIostorinvDtlOutService.list(new QueryWrapper<StIvtIostorinvdtlOut>().eq("inv_id", iostorinv.getId()));
List<Map> dtlJson = new ArrayList<>();
if (!CollectionUtils.isEmpty(dtls)){
for (StIvtIostorinvdtlOut dtl : dtls) {
dtlJson.add(MapOf.of("form_id",dtl.getId()
,"t",JSONObject.toJSON(dtl)
,"source_form_type",dtl.getSource_form_type()
,"source_form_id",dtl.getSource_form_id()));
}
}
BussEventMulticaster.Publish(new FlowStartEvent("st_ivt_iostorinv_out", null)
.build("st_ivt_iostorinv_out",iostorinv.getId(),iostorinv.getSource_form_type(),iostorinv.getSource_form_id(),form)
.build("st_ivt_iostorinvdtl_out",dtlJson)
,true);
this.update(new UpdateWrapper<StIvtIostorinvOut>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.set("update_time",DateUtil.now())
.set("update_name",SecurityUtils.getCurrentNickName())
.eq("id",form.getString("id")));
}
}

View File

@@ -14,6 +14,8 @@ import org.nl.wms.flow_manage.monitor.event.FlowEndEvent;
import org.nl.wms.flow_manage.monitor.event.FlowStartEvent;
import org.nl.wms.stor_manage.io.service.in.iostor.IStIvtIostorinvInService;
import org.nl.wms.stor_manage.io.service.in.iostor.dao.StIvtIostorinvIn;
import org.nl.wms.stor_manage.io.service.out.iostor.IStIvtIostorinvOutService;
import org.nl.wms.stor_manage.io.service.out.iostor.dao.StIvtIostorinvOut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -27,6 +29,8 @@ public class FlowEndEventListener extends AbstraceListener<FlowEndEvent> {
@Autowired
private IStIvtIostorinvInService iStIvtIostorinvInService;
@Autowired
private IStIvtIostorinvOutService iStIvtIostorinvOutService;
@Override
protected String doEvent(FlowEndEvent event) {
@@ -41,6 +45,11 @@ public class FlowEndEventListener extends AbstraceListener<FlowEndEvent> {
.set("status", StatusEnum.FORM_STATUS.code("完成"))
.set("update_time", DateUtil.now()).eq("id",form_id));
}
if (form_type.equals("st_ivt_iostorinv_out")){
iStIvtIostorinvOutService.update(new UpdateWrapper<StIvtIostorinvOut>()
.set("status", StatusEnum.FORM_STATUS.code("完成"))
.set("update_time", DateUtil.now()).eq("id",form_id));
}
return "";
}
}

View File

@@ -39,7 +39,8 @@ public class StructEventListener extends AbstraceListener<StructEvent> {
}
if (task_status.equals(StatusEnum.FORM_STATUS.code("完成"))){
//更新出入库单明细状态如果单据类型是其他的则从from-data表中更新
structattrService.changeStruct(event.getStruct_code(),event.getVehicle_code(),task_type);
Boolean in = StatusEnum.IOBILL_TYPE_IN.check(task_type);
structattrService.changeStruct(in?event.getPoint_code2():event.getPoint_code1(),in?event.getVehicle_code():null,task_type);
}
if (task_status.equals(StatusEnum.FORM_STATUS.code("取消"))){

View File

@@ -38,6 +38,10 @@ public class StIvtStructivtflow implements Serializable {
*/
private String struct_code;
/**
* 载具编码
*/
private String vehicle_code;
/**
* 物料标识
*/

View File

@@ -127,6 +127,15 @@ public class StIvtStructattr implements Serializable {
* 创建时间
*/
private String create_time;
/**
* 修改时间
*/
private String update_time;
/**
* 修改人
*/
private String update_name;
/**
* 是否临时仓位

View File

@@ -65,18 +65,20 @@ 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));
this.update(new UpdateWrapper<StIvtStructattr>()
.set("vehicle_code",vehicle_code)
.set("lock_type", StatusEnum.LOCK.code(""))
.eq("struct_code",struct_code));
Boolean in = StatusEnum.TASK_TYPE.check(task_type);
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));
List<StIvtStructivtflow> records = new ArrayList<>();
for (MdPbVehicleMater vehicleMater : vehicleMaters) {
StIvtStructivtflow record = new StIvtStructivtflow();
record.setId(IdUtil.getStringId());
record.setUpdate_time(now);
record.setVehicle_code(vehicleMater.getVehicle_code());
record.setMaterial_id(vehicleMater.getMaterial_id());
record.setPcsn(vehicleMater.getPcsn());
record.setQty(vehicleMater.getQty());
@@ -87,7 +89,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
record.setUnit_id(vehicleMater.getUnit_id());
record.setStruct_code(struct_code);
record.setVehicle_form_data(vehicleMater.getForm_data());
record.setGrowth(in);
record.setGrowth( StatusEnum.IOBILL_TYPE_IN.check(task_type));
records.add(record);
}
structivtflowService.saveBatch(records);