rev:仓库管理页面优化

This commit is contained in:
zhangzq
2024-07-15 09:05:53 +08:00
parent e0c508de34
commit d95d590ec2
83 changed files with 742 additions and 318 deletions

View File

@@ -61,6 +61,12 @@
<version>0.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.4</version>
</dependency>
<!-- https://onew.me/logback/2018/09/17/logback_win.html-->
<dependency>
<groupId>org.fusesource.jansi</groupId>

View File

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import org.mybatis.spring.annotation.MapperScan;
import org.nl.common.utils.SpringContextHolder;
import org.nl.common.websocket.heartSocket.clientSocket.HeartClientServer;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.AbstractBeanFactory;
import org.springframework.boot.CommandLineRunner;
@@ -19,6 +20,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.InetSocketAddress;
/**
* 开启审计功能 -> @EnableJpaAuditing
* https://www.cnblogs.com/niceyoo/p/10908647.html
@@ -42,6 +45,7 @@ public class AppRun implements CommandLineRunner {
@Override
public void run(String... args) {
HeartClientServer heartServer = new HeartClientServer(new InetSocketAddress("192.168.10.48", 20889));
System.out.println("--------项目启动完成--------");
}

View File

@@ -98,11 +98,18 @@ public class TableDataInfo<T> implements Serializable {
return rspData;
}
public static <T> TableDataInfo<T> build() {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setMsg("操作成功");
return rspData;
}
public static <T> TableDataInfo<T> buildJson(Object result) {
TableDataInfo<T> rspData = new TableDataInfo<>();
rspData.setCode(String.valueOf(HttpStatus.HTTP_OK));
rspData.setData(result);
rspData.setMsg("操作成功");
return rspData;
}
}

View File

@@ -27,7 +27,7 @@ import java.time.LocalDateTime;
* @date 2018-11-23
*/
@Data
class ApiError {
public class ApiError {
private String code = "400";
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

View File

@@ -22,7 +22,7 @@ public enum StatusEnum {
* 流程相关
*/
MODEL_STATUS(ForkMap.of("发布", "10",null, "未发布", "30",null)),
FLOW_STATUS(ForkMap.of("启动", "10",null, "节点完成", "20",null,"暂停", "30",null,"完成", "80",null)),
FLOW_STATUS(ForkMap.of("启动", "10",null, "节点完成", "20",null,"暂停", "30",null,"完成", "80",null,"异常完成", "82",null)),
/**
* 单据状态
*/
@@ -33,7 +33,7 @@ public enum StatusEnum {
*/
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10","inStorageTask", "调拨入库", "11","inStorageTask", "退货入库", "12","inStorageTask","拣选回库", "13","inStorageTask","盘点入库", "14","inStorageTask","托盘入库", "30","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask","拣选出库", "23","conveyorOutStorageTask","盘点出库", "24","outStorageTask","出库拣选", "25","toPickPlatformTask","托盘出库", "40","outStorageTask")),
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50","moveStorageTask")),
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50","moveStorageTask","异常位移库", "51","moveStorageTask")),
EXT_TASK_TYPE(ForkMap.of("盘点", "60","moveStorageTask")),
profit_loss(ForkMap.of("盘亏", "0",null,"盘盈", "1",null,"实盘", "2",null)),
@@ -50,8 +50,10 @@ public enum StatusEnum {
/**
* 点位锁类型
*/
LOCK(ForkMap.of("无锁","00",null,"入库锁","10",null,"入库盘点锁","16",null,"出库锁","20",null,"盘点出库锁","26",null,"移库锁","50",null)),
LOCK(ForkMap.of("无锁","00",null,"入库锁","10",null,"入库盘点锁","16",null,"出库锁","20",null,"盘点出库锁","26",null,"移库锁","50",null,"异常锁定","60",null)),
STRATEGY_TYPE(ForkMap.of("入库", "1",null, "出库", "2", null,"出入库", "3",null)),
PRODUCT_AREA(ForkMap.of("一层车间", "A1",null, "二层车间", "A2", null,"三层车间", "A3",null)),
;
/**

View File

@@ -77,7 +77,6 @@ public class BussEventMulticaster implements BeanPostProcessor {
if (bean instanceof AbstraceListener){
AbstraceListener listener = (AbstraceListener) bean;
LISTENER_SRT.add(listener);
System.out.println("_________"+beanName);
}
return bean;
}

View File

@@ -1,65 +1,64 @@
//package org.nl.common.utils;
//
//import org.apache.http.HttpResponse;
//import org.apache.http.client.methods.HttpGet;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.client.methods.HttpRequestBase;
//import org.apache.http.concurrent.FutureCallback;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
//import org.apache.http.impl.nio.client.HttpAsyncClients;
//import org.nl.modules.wql.util.SpringContextHolder;
//import org.springframework.context.annotation.Bean;
//import org.springframework.stereotype.Component;
//
//import java.util.concurrent.Future;
//
///*
// * HTtp异步调用
// */
//public class AsyncHttpRequest {
//
// private StringEntity entity;
// public HttpRequestBase httpbase;
// private String url;
//
// public AsyncHttpRequest(String url) {
// this.url=url;
// }
//
// public static AsyncHttpRequest post(String url,String body){
// return new AsyncHttpRequest(url).body(body);
// };
//
// public static AsyncHttpRequest get(String url){
// return new AsyncHttpRequest(url).getEntity();
// };
// private AsyncHttpRequest getEntity(){
// HttpGet httpGet = new HttpGet(this.url);
// this.httpbase = httpGet;
// return this;
// };
// private AsyncHttpRequest body(String body){
// this.entity = new StringEntity(body, "UTF-8");
// this.entity.setContentType("application/json");
// HttpPost httpPost = new HttpPost(this.url);
// httpPost.setEntity(entity);
// this.httpbase = httpPost;
// return this;
// };
// public Future<HttpResponse> execute(FutureCallback<HttpResponse> callback){
// CloseableHttpAsyncClient client = SpringContextHolder.getBean(CloseableHttpAsyncClient.class);
// Future<HttpResponse> execute = client.execute(httpbase, callback);
// return execute;
// };
//}
//@Component
//class HttpAsyncClientInit{
//
// @Bean
// public CloseableHttpAsyncClient closeableHttpAsyncClient(){
// CloseableHttpAsyncClient aDefault = HttpAsyncClients.createDefault();
// aDefault.start();
// return aDefault;
// }
//}
package org.nl.common.utils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.concurrent.FutureCallback;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future;
/*
* HTtp异步调用
*/
public class AsyncHttpRequest {
private StringEntity entity;
public HttpRequestBase httpbase;
private String url;
public AsyncHttpRequest(String url) {
this.url=url;
}
public static AsyncHttpRequest post(String url,String body){
return new AsyncHttpRequest(url).body(body);
};
public static AsyncHttpRequest get(String url){
return new AsyncHttpRequest(url).getEntity();
};
private AsyncHttpRequest getEntity(){
HttpGet httpGet = new HttpGet(this.url);
this.httpbase = httpGet;
return this;
};
private AsyncHttpRequest body(String body){
this.entity = new StringEntity(body, "UTF-8");
this.entity.setContentType("application/json");
HttpPost httpPost = new HttpPost(this.url);
httpPost.setEntity(entity);
this.httpbase = httpPost;
return this;
};
public Future<HttpResponse> execute(FutureCallback<HttpResponse> callback){
CloseableHttpAsyncClient client = SpringContextHolder.getBean(CloseableHttpAsyncClient.class);
Future<HttpResponse> execute = client.execute(httpbase, callback);
return execute;
};
}
@Component
class HttpAsyncClientInit{
@Bean
public CloseableHttpAsyncClient closeableHttpAsyncClient(){
CloseableHttpAsyncClient aDefault = HttpAsyncClients.createDefault();
aDefault.start();
return aDefault;
}
}

View File

@@ -17,6 +17,7 @@ package org.nl.common.utils;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
@@ -72,4 +73,25 @@ public class IPUtil {
return "";
}
}
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
if (ip != null && ip.contains(",")) {
String[] ipArray = ip.split(",");
ip = ipArray[0];
}
return ip;
}
}

View File

@@ -35,7 +35,7 @@ public class InterationUtil {
String url = acsUrl + api;
try {
String resultMsg = HttpRequest.post(url)
.timeout(1000)
.timeout(3000)
.body(String.valueOf(param))
.execute().body();
JSONObject response = JSONObject.parseObject(resultMsg);
@@ -46,4 +46,16 @@ public class InterationUtil {
throw new BadRequestException("acs网络不通"+ex.getMessage());
}
}
public static TableDataInfo asyncNotifyExt(String api, JSONObject param) {
log.info("下发ACS参数----------------------------------------+"+api+",---"+param.toString());
String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue();
if (STATUS_FLASE.equals(isConnect)) {
return TableDataInfo.build();
}
String acsUrl = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("wcs_url").getValue();
AsyncHttpRequest.post(acsUrl + api,String.valueOf(param))
.execute(null);
return TableDataInfo.build();
}
}

View File

@@ -47,7 +47,7 @@ public class HeartClientServer extends AbstraceServer {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline()
.addLast("client-idle-handler", new IdleStateHandler(5, 5,5 , TimeUnit.SECONDS))
.addLast("client-idle-handler", new IdleStateHandler(0, 5,0 , TimeUnit.SECONDS))
.addLast( new StringEncoder())
.addLast( new StringDecoder())
.addLast(new HeartConsumerHandler(body));
@@ -90,15 +90,20 @@ public class HeartClientServer extends AbstraceServer {
this.doDestroy();
}
}
public void pingpong() throws InterruptedException {
while (channel!=null && channel.isActive()){
Thread.sleep(2000);
System.out.println("-----chilend-------");
ByteBuf log = Unpooled.copiedBuffer("ping--222-", CharsetUtil.UTF_8);
if (channel==null){
return;
public void pingpong() {
new Thread(()->{
while (channel!=null && channel.isActive()){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ByteBuf log = Unpooled.copiedBuffer("ping--222-", CharsetUtil.UTF_8);
if (channel==null){
return;
}
channel.writeAndFlush(log);
}
channel.writeAndFlush(log);
}
}).start();
}
}

View File

@@ -28,8 +28,8 @@ public class HeartConsumerHandler extends SimpleChannelInboundHandler {
System.out.println("断开连接---");
//重新建立
ctx.close();
server.doDisConnect();
super.channelInactive(ctx);
server.channel.close();
server.channel.flush();
}
@Override

View File

@@ -15,6 +15,6 @@ import java.nio.charset.StandardCharsets;
*/
public class RunClientHeartMain {
public static void main(String[] args) throws InterruptedException {
HeartClientServer heartServer = new HeartClientServer(new InetSocketAddress("192.168.10.57", 20889));
HeartClientServer heartServer = new HeartClientServer(new InetSocketAddress("192.168.10.48", 20889));
}
}

View File

@@ -54,7 +54,7 @@ public class DruidFilter extends FilterEventAdapter {
}
executeSql = SQLUtils.format(executeSql, JdbcUtils.MYSQL, params);
}
// log.info("[----SQL----][update][ SQL: {} ]", executeSql);
log.info("[----SQL----][update][ SQL: {} ]", executeSql);
}
super.statementExecuteAfter(statement, sql, result);
}

View File

@@ -40,6 +40,7 @@ public abstract class AbstraceServer {
public void doDisConnect(){
if (channel!=null){
channel.close();
channel.flush();
doConnect();
}
};

View File

@@ -92,6 +92,10 @@ public class BmFormStruc implements Serializable {
* 载具
*/
private String vehicle_code;
/**
* 载具组盘id
*/
private String vehicle_id;
/**
* 数量

View File

@@ -2,6 +2,7 @@ package org.nl.wms.dispatch_manage.point.controller;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.utils.IdUtil;

View File

@@ -73,7 +73,7 @@ public class SchBasePoint implements Serializable {
/**
* 是否启用
*/
private String is_used;
private Boolean is_used;
/**
* 创建人

View File

@@ -9,6 +9,7 @@ import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.TaskScheduleService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
@@ -34,6 +35,8 @@ public class SchBaseTaskController {
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private TaskScheduleService taskScheduleService;
@Autowired
private RedisTemplate redisTemplate;
@@ -81,5 +84,9 @@ public class SchBaseTaskController {
taskScheduleService.taskPublish();
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/taskMsgSchedule")
public ResponseEntity<Object> taskMsgSchedule() {
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -29,11 +29,10 @@ public abstract class AbstractTask {
public void updateTask(JSONObject data){
ISchBaseTaskService taskService = SpringContextHolder.getBean(ISchBaseTaskService.class);
String status = data.getString("status");
SchBaseTask task = taskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
if (!task.getStatus().equals(status) && !task.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))){
taskService.update(new UpdateWrapper<SchBaseTask>().set("status",status).eq("task_code",data.getString("task_code")));
}
taskService.update(new UpdateWrapper<SchBaseTask>()
.set("status",data.getString("status"))
.eq("task_code",data.getString("task_code")));
}
public abstract void updateStatus(JSONObject data);

View File

@@ -68,7 +68,7 @@ public class ConveyorOutStorageTask extends AbstractTask {
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}

View File

@@ -13,9 +13,6 @@ import org.nl.common.utils.MapOf;
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.entity.ExecutionDto;
import org.nl.wms.flow_manage.flow.service.deployment.IActReProcdefService;
import org.nl.wms.flow_manage.flow.service.deployment.dao.ActReProcdef;
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;
@@ -25,7 +22,6 @@ 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.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -79,6 +75,7 @@ public class GroupDickInStorageTask extends AbstractTask {
//更新载具proc_inst_id
String currentInstId = vehicleMater.getProc_inst_id();
if (StringUtils.isNotEmpty(currentInstId)){
System.out.println("载具"+vehicle_code+"任务流程信息不存在"+currentInstId);
ActRuExecution execution = iActRuExecutionService.getById(currentInstId);
if (execution == null){
throw new BadRequestException("申请任务失败:载具"+vehicle_code+"任务流程信息不存在"+currentInstId);

View File

@@ -22,7 +22,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

View File

@@ -6,15 +6,12 @@ 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.constant.DictConstantPool;
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.SecurityUtils;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.handler.StructEvent;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
@@ -36,7 +33,7 @@ import java.util.stream.Collectors;
* 出库任务入库任务
*/
@Service
public class moveStorageTask extends AbstractTask {
public class MoveStorageTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
@@ -57,14 +54,10 @@ public class moveStorageTask extends AbstractTask {
String end_struct_code = form_data.getString("end_struct_code");
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
StIvtStructattr source = iStIvtStructattrService.getOne(new QueryWrapper<StIvtStructattr>().eq("vehicle_code", vehicle_code));
if (!source.getStruct_code().equals(start_struct_code)){
throw new BadRequestException("载具库位变动:当前货位"+source.getStruct_code()+",移库前货位"+start_struct_code);
}
StIvtStructattr target = iStIvtStructattrService.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", end_struct_code));
if (StringUtils.isNotEmpty(target.getVehicle_code())){
throw new BadRequestException("目标货位存在载具:"+target.getVehicle_code());
@@ -79,7 +72,7 @@ public class moveStorageTask extends AbstractTask {
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setTask_type(from.getString("task_type"));
task.setVehicle_code(vehicle_code);
task.setPoint_code1(source.getStruct_code());
task.setPoint_code1(start_struct_code);
task.setPoint_code2(end_struct_code);
taskService.save(task);
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()

View File

@@ -9,21 +9,17 @@ import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.constant.DictConstantPool;
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.SecurityUtils;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.handler.StructEvent;
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.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.transaction.annotation.Transactional;

View File

@@ -3,25 +3,18 @@ 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.dispatch_manage.task.handler.StructEvent;
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.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.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -54,7 +54,7 @@ public class PickStorageTask extends AbstractTask {
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>()
.eq("task_type", from.getString("task_type"))
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}

View File

@@ -6,12 +6,13 @@ 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.constant.DictConstantPool;
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.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
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;
@@ -19,7 +20,6 @@ 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.system_manage.service.param.ISysParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -35,28 +35,43 @@ import java.util.stream.Collectors;
*/
@Service
public class ToPickPlatformTask extends AbstractTask {
private static volatile String Lask_Point;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISysParamService iSysParamService;
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Override
@Transactional
public JSONObject createTask(JSONObject from) {
String vehicle_code = from.getString("vehicle_code");
String target_point = from.getString("target_point");
String target_point = null;// = from.getString("target_point");
List<SchBasePoint> targetPoints = iSchBasePointService.list(new QueryWrapper<SchBasePoint>()
.eq("region_code", "PICK01").eq("is_used", true));
//通过全局变量获取目标位置
if (CollectionUtils.isEmpty(targetPoints)){
throw new BadRequestException("当前拣选工位未启用");
}
//轮询
for (int i = 0; i < targetPoints.size(); i++) {
String code = targetPoints.get(i).getCode();
if (targetPoints.size()>1 && !code.equals(Lask_Point)){
target_point = code;
break;
}
target_point = code;
}
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(target_point)){
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
@@ -74,7 +89,8 @@ public class ToPickPlatformTask extends AbstractTask {
task.setVehicle_code(vehicle_code);
task.setPoint_code1(struct.getStruct_code());
task.setPoint_code2(target_point);
taskService.save(task);
iSchBaseTaskService.save(task);
Lask_Point = target_point;
iMdPbVehicleMaterService.update(new LambdaUpdateWrapper<MdPbVehicleMater>()
.set(MdPbVehicleMater::getTask_code,task.getTask_code())
.eq(MdPbVehicleMater::getVehicle_code,task.getVehicle_code()));
@@ -95,7 +111,7 @@ public class ToPickPlatformTask extends AbstractTask {
@Override
public void finish(JSONObject data) {
this.updateTask(data);
SchBaseTask schBaseTask = taskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", data.getString("task_code")));
iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.FALSE);
}

View File

@@ -61,4 +61,6 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
*/
void operation(JSONObject param);
JSONObject errorTask(JSONObject param,String type);
}

View File

@@ -58,7 +58,7 @@ public class TaskScheduleService {
iSchBaseTaskService.update(new UpdateWrapper<SchBaseTask>()
.eq("task_code",resultM.get("task_code"))
.set("status",StatusEnum.FORM_STATUS.code("暂停"))
.set("update_time", DateUtil.now()).set("remark",resultM.get("error")));
.set("update_time", DateUtil.now()).set("remark",resultM.get("msg")));
}
}
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.dispatch_manage.task.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
@@ -14,22 +15,28 @@ import org.nl.common.domain.entity.PageQuery;
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.ListOf;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.*;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.handler.impl.MoveStorageTask;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.dispatch_manage.task.service.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.dispatch_manage.task.service.dto.SchBaseTaskQuery;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler;
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.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
@@ -44,7 +51,14 @@ import java.util.stream.Collectors;
public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBaseTask> implements ISchBaseTaskService {
@Autowired
IMdPbVehicleMaterService iMdPbVehicleMaterService;
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private IActRuExecutionService iActRuExecutionService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
@Lazy
private MoveStorageTask moveStorageTask;
@Override
public IPage<SchBaseTask> queryAll(SchBaseTaskQuery whereJson, PageQuery page) {
@@ -75,7 +89,9 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
@Override
public void update(SchBaseTask entity) {
SchBaseTask dto = this.baseMapper.selectById(entity.getTask_code());
if (dto == null) throw new BadRequestException("任务信息不存在");
if (dto == null) {
throw new BadRequestException("任务信息不存在");
}
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
@@ -106,22 +122,125 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
}
@Override
public void operation(JSONObject param) {
String task_code = param.getString("taskCode");
public void operation(JSONObject param) {
String task_code = param.getString("task_code");
SchBaseTask task = this.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", task_code));
if (task.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))){
throw new BadRequestException("当前任务已完成");
}
this.update(new UpdateWrapper<SchBaseTask>()
.set("status",param.getString("status"))
.eq("task_code", task_code));
if (param.getString("status").equals(StatusEnum.FORM_STATUS.code("完成"))){
MdPbVehicleMater vehicleMater = iMdPbVehicleMaterService.getOne(new QueryWrapper<MdPbVehicleMater>()
.eq("vehicle_code", task.getVehicle_code()));
if (!StringUtils.isEmpty(vehicleMater.getProc_inst_id())){
if (vehicleMater!=null && !StringUtils.isEmpty(vehicleMater.getProc_inst_id())){
FlowContinueEvent continueEvent = new FlowContinueEvent(vehicleMater.getProc_inst_id(), null, null);
BussEventMulticaster.Publish(continueEvent);
}else {
String handleClass = task.getHandle_class();
try {
AbstractTask bean = (AbstractTask)SpringContextHolder.getBean(Class.forName(handleClass));
bean.finish(param);
}catch (Exception ex){
throw new BadRequestException(ex.getMessage());
}
}
}else {
this.update(new UpdateWrapper<SchBaseTask>()
.set("status",param.getString("status"))
.eq("task_code", task_code));
}
}
/**
"type":
"rm" 入满 标记目标货位异常,重新分配货位;更新任务终点,反馈目的货位
"rzd"入库阻挡 异常位生成移库单,标记目标货位异常,后续人工处理;更新任务终点,反馈目的货位
"ck"空出 修改目标货位为空位,任务直接取消,不扣件关联单据已出库数量
"czd"取货阻挡 异常位生成移库单,标记目标货位异常,后续人工处理;任务重新下发
* @return
*/
@Override
public JSONObject errorTask(JSONObject param, String type) {
String task_code = param.getString("task_code");
String struct_code = param.getString("struct_code");
StIvtStructattr stIvtStructattr = iStIvtStructattrService.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", struct_code));
SchBaseTask task = this.getOne(new QueryWrapper<SchBaseTask>().eq("task_code", task_code));
switch (type){
case "ck":
MdPbVehicleMater vehicleCode = iMdPbVehicleMaterService.getOne(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", task.getVehicle_code()));
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.set("status",StatusEnum.FLOW_STATUS.code("异常完成"))
.set("remark",task.getVehicle_code()+"载具空出:货位"+struct_code)
.eq("proc_inst_id",vehicleCode.getProc_inst_id()));
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("update_time", DateUtil.now())
.set("vehicle_code",null)
.set("remark",struct_code+"出库异常")
.eq("struct_code", struct_code));
this.update(new UpdateWrapper<SchBaseTask>()
.set("status",StatusEnum.FORM_STATUS.code("取消"))
.set("remark",struct_code+"出库异常")
.set("update_time",DateUtil.now())
.eq("task_code",task_code));
break;
case "rm":
return dicisionStruct(struct_code,stIvtStructattr, task);
case "rzd":
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("update_time", DateUtil.now())
.set("vehicle_code",null)
.set("lock_type",StatusEnum.LOCK.code("无锁"))
.eq("struct_code", task.getPoint_code2()));
return dicisionStruct(struct_code,stIvtStructattr, task);
case "czd":
moveTask(task_code, struct_code, stIvtStructattr);
break;
default:
}
return null;
}
private void moveTask(String task_code, String struct_code, StIvtStructattr stIvtStructattr) {
AtomicReference<String> moveStruct = new AtomicReference<>();
this.update(new UpdateWrapper<SchBaseTask>()
.set("status",StatusEnum.FORM_STATUS.code("生成"))
.set("remark",struct_code+"出库阻挡二次下发")
.set("update_time",DateUtil.now())
.eq("task_code",task_code));
RedissonUtils.lock(()->{
System.out.println("---3--"+Thread.currentThread().getName());
Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("nearby"), new JSONObject(MapOf.of("stor_code", stIvtStructattr.getStor_code())));
moveStruct.set(((Map<String, String>) process.get("form_data")).get("end_struct_code"));
},"1"+ stIvtStructattr.getStor_code(),5);
Map moveForm = MapOf.of("task_type", StatusEnum.IOBILL_TYPE_MOVE.code("异常位移库")
, "is_send", false
, "vehicle_code", "YCZJ" + task_code, "form_data", new JSONObject(MapOf.of("start_struct_code", struct_code, "end_struct_code", moveStruct.get())));
moveStorageTask.createTask(new JSONObject(moveForm));
}
private JSONObject dicisionStruct(String struct_code, StIvtStructattr stIvtStructattr, SchBaseTask task) {
String task_code = task.getTask_code();
MdPbVehicleMater vehicleCode = iMdPbVehicleMaterService.getOne(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", task.getVehicle_code()));
//查询分配规则
Map map = SpringContextHolder.getBean(DecisionHandler.class)
.dispenseTransa(ListOf.of("nearby"), new JSONObject(MapOf.of("stor_code", stIvtStructattr.getStor_code())));
String new_struct_code = ((Map<String, String>) map.get("form_data")).get("end_struct_code");
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.set("remark", struct_code +"入满异常重新分配货位"+new_struct_code)
.eq("proc_inst_id",vehicleCode.getProc_inst_id()));
this.update(new UpdateWrapper<SchBaseTask>()
.set("point_code2",new_struct_code)
.set("remark", struct_code +"入满异常重新分配货位"+new_struct_code)
.eq("task_code", task_code));
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.eq("struct_code", struct_code)
.set("lock_type",StatusEnum.LOCK.code("异常锁定"))
.set("update_time",DateUtil.now())
.set("remark","入满异常:"+ task_code)
.set("vehicle_code","YCZJ"+ task_code));
JSONObject result = new JSONObject();
result.put("point_code2",new_struct_code);
return result;
}
}

View File

@@ -1,13 +1,22 @@
package org.nl.wms.external_system;
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.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
import org.nl.wms.external_system.acs.service.AcsToWmsService;
import org.nl.wms.external_system.dto.InteracteDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/*
* @author ZZQ
* @Date 2024/5/6 14:53
@@ -20,18 +29,44 @@ public class GateWayService {
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@Autowired
private IBmVehicleInfoService iBmVehicleInfoService;
public void apply(InteracteDto param){
public JSONObject apply(InteracteDto<Map> param){
JSONObject jsonObject = new JSONObject(param.getData());
//处理日志相关
JSONObject result = new JSONObject();
String service = param.getService();
String type = param.getType();
//根据服务拆分不同的业务
if (service.equals("InStorage")){
acsToWmsService.applyTask(param.getService(), type, (JSONObject) JSON.toJSON(param.getData()));
RedissonUtils.lock(()->{
acsToWmsService.applyTask(param.getService(), type, jsonObject);
},param.getService() + param.getType(),null);
}
if (service.equals("Task")){
iSchBaseTaskService.operation((JSONObject) JSON.toJSON(param.getData()));
iSchBaseTaskService.operation(jsonObject);
}
if (service.equals("DeviceInfo")){
String vehicle_code = jsonObject.getString("vehicle");
if (StringUtils.isEmpty(vehicle_code)){
throw new BadRequestException("参数vehicle不能为空");
}
BmVehicleInfo vehicle = iBmVehicleInfoService.getOne(new QueryWrapper<BmVehicleInfo>()
.eq("vehicle_code", vehicle_code));
Integer h = vehicle.getH();
result.putAll(MapOf.of("height",h,"type",(h-200)/20));
}
if (service.equals("ErrorTask")){
AtomicReference<JSONObject> reference = new AtomicReference<>(new JSONObject());
RedissonUtils.lock(()->{
reference.set(iSchBaseTaskService.errorTask(jsonObject, param.getType()));
},param.getService() + param.getType(),null);
return reference.get();
}
return result;
}
}

View File

@@ -1,12 +1,15 @@
package org.nl.wms.external_system.acs.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.exception.handler.ApiError;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.external_system.GateWayService;
import org.nl.wms.external_system.dto.InteracteDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@@ -14,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicReference;
/*
* @author ZZQ
* @Date 2024/5/6 14:53
@@ -27,8 +32,12 @@ public class AcsToWmsController {
@PostMapping("/apply")
@SaIgnore
@Log("acs请求wms")
public ResponseEntity<Object> apply(@RequestBody InteracteDto form) {
gateWayService.apply(form);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
try {
return new ResponseEntity<>(TableDataInfo.buildJson(gateWayService.apply(form)),HttpStatus.OK);
}catch (Exception ex){
return new ResponseEntity<>(ApiError.error(ex.getMessage()),HttpStatus.BAD_REQUEST);
}
}
}

View File

@@ -27,6 +27,16 @@ import java.util.Map;
/*
* @author ZZQ
* @Date 2024/5/6 14:53
*
{
"service": "ZPInStorage",
"ip": "ip_7va9w",
"request_time": "request_time_pbi5u",
"trace_id": "trace_id_xl8dk",
"data": {
"D00018": "start001"
}
}
*/
@Service
public class AcsToWmsService {
@@ -39,23 +49,13 @@ public class AcsToWmsService {
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);
}
}
public void updateTAsk(String type,JSONObject data){
public void updateTask(String type,JSONObject data){
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("完成")));

View File

@@ -1,11 +1,14 @@
package org.nl.wms.external_system.acs.service;
import cn.hutool.core.convert.Convert;
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.apache.commons.beanutils.ConvertUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.utils.InterationUtil;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
import org.nl.wms.external_system.dto.InteracteDto;
@@ -32,6 +35,26 @@ public class WmsToAcsService implements InitializingBean {
.eq("form_type","sch_base_task"));
}
public TableDataInfo changeMode(String deviceCode,String type,String mode){
InteracteDto dto = InteracteDto.builder().service("wmsToAcsService")
.trace_id(MDC.get("trace_id"))
.type(type)
.data(MapOf.of("device_code", deviceCode, "type", mode))
.build();
TableDataInfo result = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto));
return result;
}
public TableDataInfo toCommand(String deviceCode,String toCommand){
InteracteDto<Object> dto = InteracteDto.builder().service("wmsToAcsService")
.trace_id(MDC.get("trace_id"))
.type("toCommand")
.data(MapOf.of("device_code", deviceCode, "toCommand", toCommand))
.build();
TableDataInfo result = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto));
return result;
}
/**
* 系统交互
*/

View File

@@ -10,6 +10,7 @@ import lombok.NoArgsConstructor;
import org.nl.common.utils.IPUtil;
import java.util.List;
import java.util.Map;
/*
* @author ZZQ
@@ -19,7 +20,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InteracteDto {
public class InteracteDto<T> {
private String service;
private String type;
@@ -29,5 +30,5 @@ public class InteracteDto {
/**
* 要么JSONArray要么JSONObject
*/
private Object data;
private T data;
}

View File

@@ -5,10 +5,17 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
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.IdUtil;
import org.nl.common.utils.SecurityUtils;
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.service.deployment.IActReProcdefService;
import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService;
import org.nl.wms.flow_manage.flow.service.execution.IFlowOperationService;
@@ -16,15 +23,20 @@ import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.nl.wms.flow_manage.flow.service.execution.dto.ExecutionQuery;
import org.nl.wms.flow_manage.flow.service.history.IActHiExecutionService;
import org.nl.wms.flow_manage.flow.service.history.dao.ActHiExecution;
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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/*
* @author ZZQ
@@ -37,18 +49,22 @@ public class ExecutionController {
@Autowired
IFlowOperationService flowOperationService;
private IFlowOperationService iFlowOperationService;
@Autowired
private IActRuExecutionService executionService;
private IActRuExecutionService iActRuExecutionService;
@Autowired
private IActHiExecutionService iActHiExecutionService;
@Autowired
private IActReProcdefService procdefService;
private IActReProcdefService iActReProcdefService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
private ISchBaseTaskService iSchBaseTaskService;
@GetMapping
public ResponseEntity<Object> getAll(ExecutionQuery query, PageQuery page) {
return new ResponseEntity<>(executionService.getAll(query, page), HttpStatus.OK);
return new ResponseEntity<>(iActRuExecutionService.getAll(query, page), HttpStatus.OK);
}
@PostMapping
@@ -56,7 +72,7 @@ public class ExecutionController {
dto.setCreate_id(SecurityUtils.getCurrentUserId());
dto.setCreate_time(DateUtil.now());
dto.setProc_inst_id(IdUtil.getStringId());
executionService.save(dto);
iActRuExecutionService.save(dto);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -64,7 +80,7 @@ public class ExecutionController {
public ResponseEntity<Object> update(@Validated @RequestBody ActRuExecution dto) {
dto.setStatus(StatusEnum.MODEL_STATUS.code("未发布"));
dto.setUpdate_time(DateUtil.now());
executionService.updateById(dto);
iActRuExecutionService.updateById(dto);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -74,10 +90,10 @@ public class ExecutionController {
removeCollect.addAll(Arrays.asList(ids));
if (ids.length > 0) {
for (String proc_inst_id : ids) {
removeCollect.addAll(executionService.getChildList(proc_inst_id));
removeCollect.addAll(iActRuExecutionService.getChildList(proc_inst_id));
}
if (removeCollect.size()>0){
executionService.removeByIds(removeCollect);
iActRuExecutionService.removeByIds(removeCollect);
}
}
return new ResponseEntity<>(HttpStatus.OK);
@@ -102,30 +118,56 @@ public class ExecutionController {
}
@GetMapping(value = "/confirm/{proc_inst_id}")
@Log("手动触发流程")
public ResponseEntity<Object> flowConfirm(@PathVariable String proc_inst_id) {
return new ResponseEntity<>(flowOperationService.flowConfirm(proc_inst_id, null, null, null), HttpStatus.OK);
return new ResponseEntity<>(iFlowOperationService.flowConfirm(proc_inst_id, null, null, null), HttpStatus.OK);
}
@GetMapping(value = "/queryByParentId/{id}")
public ResponseEntity<Object> queryByParentId(@PathVariable String id) {
LambdaQueryWrapper<ActRuExecution> lqw = new LambdaQueryWrapper<>();
lqw.eq(ActRuExecution::getParent_id, id);
return new ResponseEntity<>(executionService.list(lqw), HttpStatus.OK);
return new ResponseEntity<>(iActRuExecutionService.list(lqw), HttpStatus.OK);
}
@GetMapping(value = "/getDeploymentById/{id}")
public ResponseEntity<Object> getDeploymentById(@PathVariable String id) {
return new ResponseEntity<>(procdefService.getById(id), HttpStatus.OK);
return new ResponseEntity<>(iActReProcdefService.getById(id), HttpStatus.OK);
}
@PostMapping("/changePdfActive")
public ResponseEntity<Object> changePdfActive(@Validated @RequestBody ActRuExecution dto) {
executionService.updateById(dto);
iActRuExecutionService.updateById(dto);
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping(value = "/queryHisActivityId/{proc_inst_id}")
public ResponseEntity<Object> queryHisActivityId(@PathVariable String proc_inst_id) {
return new ResponseEntity<>(executionService.queryHisActivityId(proc_inst_id), HttpStatus.OK);
return new ResponseEntity<>(iActRuExecutionService.queryHisActivityId(proc_inst_id), HttpStatus.OK);
}
@GetMapping(value = "/errorFinish/{proc_inst_id}")
@Log("异常中断流程")
public ResponseEntity<Object> errorFinish(@PathVariable String proc_inst_id) {
List<MdPbVehicleMater> vehicleMaters = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.eq("proc_inst_id", proc_inst_id)
.eq("is_delete", false)
.select("vehicle_code"));
if (!CollectionUtils.isEmpty(vehicleMaters)){
List<SchBaseTask> tasks = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>()
.select("task_code")
.nested(query->{
query.eq("status",StatusEnum.FORM_STATUS.code("生成"))
.or().eq("status",StatusEnum.FORM_STATUS.code("暂停"));
})
.in("vehicle_code", vehicleMaters.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.toList())));
if (!CollectionUtils.isEmpty(tasks)){
throw new BadRequestException("当前流程存在执行中的任务无法异常中断,操作完任务后在终止流程"+tasks.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}
}
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.set("status",StatusEnum.FLOW_STATUS.code("异常完成"))
.eq("proc_inst_id",proc_inst_id));
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
}

View File

@@ -73,7 +73,6 @@ public abstract class FlowNodeActivityBehavior<T> {
.set("form_id",entity.getForm_id())
.set("update_time", DateUtil.now()));
this.leaveActivity(entity);
//
}catch (Exception ex){
ex.printStackTrace();
log.error(entity.getActivityName()+"流程执行异常:{}",ex.getMessage());

View File

@@ -42,8 +42,7 @@ public class EndEventActivityBehavior extends FlowNodeActivityBehavior<JSONObjec
private IActReProcdefService reProcdefService;
@Autowired
private BpmnJSONConverter bpmnJSONConverter;
@Autowired
private CommandExecutor commandExecutor;
@Override

View File

@@ -67,6 +67,8 @@ public class StrucFormActivityBehavior extends FlowNodeActivityBehavior<JSONObje
.eq("activity_id", source_data)
.eq("proc_inst_id", entity.getProc_inst_id()));
sourceData = one.getForm_data();
//将外部数据带进去
sourceData.getJSONObject("t").put("node_t",entity.getT().getJSONObject("t"));
}
//处理自定义参数:
if (currentNode.getSkipExpression()!=null || currentNode.getSkipExpression().size()>0){

View File

@@ -89,7 +89,7 @@ public class DecisionHandler extends TypeHandler<JSONObject,ExecutionEntity<JSON
System.out.println("---3--"+Thread.currentThread().getName());
Map<String, String> process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(params, iostorinvdtl);
atomicResult.set(process);
},decisioner.strategyConfig.getStrategy_type()+iostorinvdtl.getString("stor_code"),10);
},decisioner.strategyConfig.getStrategy_type()+iostorinvdtl.getString("stor_code"),5);
return atomicResult.get();
}
@Transactional(propagation= Propagation.REQUIRES_NEW)

View File

@@ -1,25 +1,18 @@
package org.nl.wms.flow_manage.flow.service.classprocessimpl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import org.apache.commons.lang3.ClassUtils;
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.ListOf;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SpelUtil;
import org.nl.common.utils.SpringContextHolder;
import org.nl.wms.dispatch_manage.task.handler.AbstractTask;
import org.nl.wms.dispatch_manage.task.handler.StructEvent;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

View File

@@ -23,4 +23,6 @@ public interface IActRuExecutionService extends IService<ActRuExecution> {
List<String> getChildList(String proc_inst_id);
String getParentByChild(String proc_inst_id);
}

View File

@@ -27,4 +27,15 @@ public interface ActRuExecutionMapper extends BaseMapper<ActRuExecution> {
" ) t3\n" +
" where childId != '0'")
String findAllChild(String proc_inst_id);
@Select("select min(inst_id) from (SELECT\n" +
"@r AS inst_id,\n" +
"( SELECT @r := parent_id FROM act_ru_execution WHERE proc_inst_id = inst_id ) AS parentId,\n" +
"@l := @l + 1 AS L \n" +
"FROM\n" +
"\t( SELECT @r := #{proc_inst_id}, @l := 0 ) vars,\n" +
"\tact_ru_execution h \n" +
"WHERE\n" +
"\t@r <> 0 \n" +
"\tAND parent_id > 0 ) as d")
String findParent(String proc_inst_id);
}

View File

@@ -105,4 +105,9 @@ public class ActRuExecutionServiceImpl extends ServiceImpl<ActRuExecutionMapper,
}
return new ArrayList<>();
}
@Override
public String getParentByChild(String proc_inst_id) {
return this.baseMapper.findParent(proc_inst_id);
}
}

View File

@@ -93,7 +93,7 @@ public class FlowOperationServiceImpl implements IFlowOperationService {
//判断子流程
List<ActRuExecution> childList = iActRuExecutionService.list(new QueryWrapper<ActRuExecution>()
.eq("parent_id", proc_inst_id)
.ne("status", StatusEnum.FLOW_STATUS.code("完成")));
.lt("status", StatusEnum.FLOW_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(childList)){
throw new BadRequestException("当前流程存在未完成的子流程");
}

View File

@@ -23,5 +23,12 @@ public interface IMdPbVehicleMaterService extends IService<MdPbVehicleMater> {
List<MdPbVehicleMaterVo> getVehicleMaters(String vehicle_code);
/**
* 载具编码与id对应关系
* @param vehicle_code
* @return
*/
Map<String, String> getVehicleCode2Id(String...vehicle_code);
}

View File

@@ -66,6 +66,10 @@ public class MdPbVehicleMater implements Serializable {
* 载具锁定
*/
private Boolean is_lock;
/**
* 载具是否出库
*/
private Boolean is_delete;
/**
* 数量计量单位标识

View File

@@ -7,10 +7,12 @@ 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.dao.mapper.MdPbVehicleMaterMapper;
import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
/**
* <p>
@@ -39,4 +41,16 @@ public class MdPbVehicleMaterServiceImpl extends ServiceImpl<MdPbVehicleMaterMap
public List<MdPbVehicleMaterVo> getVehicleMaters(String vehicle_code) {
return this.baseMapper.getVehicleMaters(vehicle_code);
}
@Override
public Map<String, String> getVehicleCode2Id(String... vehicle_code) {
if (vehicle_code!=null){
List<MdPbVehicleMater> list = this.list(new QueryWrapper<MdPbVehicleMater>()
.in("vehicle_code", vehicle_code)
.eq("is_delete", false));
Map<String, String> collect = list.stream().collect(HashMap::new, (map, vehicle) -> map.put(vehicle.getVehicle_code(), vehicle.getId()), HashMap::putAll);
return collect;
}
return null;
}
}

View File

@@ -95,7 +95,10 @@ public class PmFormData implements Serializable {
* 载具
*/
private String vehicle_code;
/**
* 载具组盘id
*/
private String vehicle_id;
/**
* 自定义表单字段

View File

@@ -42,6 +42,7 @@
<result property="material_spec" column="material_spec"/>
<result property="single_weight" column="single_weight"/>
<result property="vehicle_code" column="vehicle_code"/>
<result property="vehicle_id" column="vehicle_id"/>
<result property="parent_id" column="parent_id"/>
<result property="form_data" column="form_data" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
<result property="unit_id" column="unit_id"/>

View File

@@ -121,6 +121,10 @@ public class PmFormDataDto implements Serializable {
* 载具
*/
private String vehicle_code;
/**
* 载具组盘id
*/
private String vehicle_id;
/**

View File

@@ -164,7 +164,7 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
formMap.put(item.getString("value"), item);
}, HashMap::putAll);
//基础字段
Set<String> fields = ListOf.ofSet(formStruc.getBiz_code(), formStruc.getBiz_id(), formStruc.getBiz_code(), formStruc.getBiz_status(), formStruc.getMaterial_id(), formStruc.getPcsn(), formStruc.getVehicle_code(), formStruc.getUnit_id(), formStruc.getQty());
Set<String> fields = ListOf.ofSet(formStruc.getBiz_code(), formStruc.getBiz_id(), formStruc.getBiz_code(), formStruc.getBiz_status(), formStruc.getMaterial_id(), formStruc.getPcsn(), formStruc.getVehicle_code(), formStruc.getVehicle_id(),formStruc.getUnit_id(), formStruc.getQty());
JSONObject data = fieldMapping(fields, fieldMapping, sourceData);
data.put("form_type",formStruc.getForm_type());
JSONObject form_param = formStruc.getForm_param();

View File

@@ -4,6 +4,7 @@ package org.nl.wms.stor_manage.io.controller;
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.stor_manage.io.service.dto.StorInvQuery;
@@ -90,7 +91,14 @@ public class StIvtIostorinvOutController {
@PostMapping("/taskOpen")
public ResponseEntity<Object> taskOpen(@RequestBody JSONObject dtl) {
iStIvtIostorinvService.taskOpen(dtl);
return new ResponseEntity<>(HttpStatus.OK);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
@GetMapping("/cancelMst/{inv_id}")
@Log("强制取消单据")
public ResponseEntity<Object> cancelMst(@PathVariable String inv_id) {
iStIvtIostorinvService.cancelMst(inv_id);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
}

View File

@@ -36,6 +36,7 @@ public interface IStIvtIostorinvService extends IService<StIvtIostorinv> {
void cancelVehicle(JSONObject form);
String canceldispense(JSONObject form);
String cancelMst(String id);
void taskOpen(JSONObject form);
}

View File

@@ -93,6 +93,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("update_time", now)
.set("vehicle_code",vehicleMaters.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.joining(",")))
.set("vehicle_id",vehicleMaters.stream().map(MdPbVehicleMater::getId).collect(Collectors.joining(",")))
.eq("id", dtl.getId())
);
//更新组单据
@@ -163,12 +164,15 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
throw new BadRequestException("取消分配失败:请求参数不能为空");
}
StIvtIostorinvdtl dtl = form.toJavaObject(StIvtIostorinvdtl.class);
String[] vehicles = dtl.getVehicle_code().split(",");
iMdPbVehicleMaterService.remove(new QueryWrapper<MdPbVehicleMater>().in("vehicle_code",Arrays.asList(vehicles)));
iMdGruopDickService.remove(new QueryWrapper<MdGruopDick>().in("vehicle_code",Arrays.asList(vehicles)));
String[] vehicles = dtl.getVehicle_id().split(",");
iMdPbVehicleMaterService.remove(new QueryWrapper<MdPbVehicleMater>().in("id",Arrays.asList(vehicles)));
iMdGruopDickService.remove(new QueryWrapper<MdGruopDick>()
.in("vehicle_code",Arrays.asList(dtl.getVehicle_id().split(",")))
.lt("status",StatusEnum.FORM_STATUS.code("完成")));
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("update_time",DateUtil.now())
.set("vehicle_code",null)
.set("vehicle_id",null)
.eq("id",dtl.getId())
);
this.update(new UpdateWrapper<StIvtIostorinv>()
@@ -186,8 +190,10 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
throw new BadRequestException("分配失败,当前出库分配无可用货位");
}
String vehicle_code = map.get("vehicle_code");
Map<String, String> stringMap = iMdPbVehicleMaterService.getVehicleCode2Id(vehicle_code.split(","));
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("vehicle_code",vehicle_code)
.set("vehicle_id",stringMap.values().stream().collect(Collectors.joining(",")))
.eq("id",form.getString("id")));
int count = iStIvtIostorinvDtlService.count(new QueryWrapper<StIvtIostorinvdtl>()
.eq("inv_id", form.getString("inv_id")).isNull("vehicle_code"));
@@ -208,9 +214,11 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
//更新点位锁,删除分配
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", 0)
.eq("is_delete",false)
.in("vehicle_code", Arrays.asList(split)));
iStIvtIostorinvDtlService.update(new UpdateWrapper<StIvtIostorinvdtl>()
.set("vehicle_code",null)
.set("vehicle_id",null)
.eq("id",form.getString("id")));
this.update(new UpdateWrapper<StIvtIostorinv>()
@@ -245,4 +253,22 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
.set("update_name",SecurityUtils.getCurrentNickName())
.eq("id",form.getString("id")));
}
@Override
public String cancelMst(String id) {
StIvtIostorinv mst = this.getById(id);
List<StIvtIostorinvdtl> iostorinvdtls = iStIvtIostorinvDtlService.list(new QueryWrapper<StIvtIostorinvdtl>().eq("inv_id", id));
String collect = iostorinvdtls.stream().map(StIvtIostorinvdtl::getVehicle_id).collect(Collectors.joining(","));
if (StringUtils.isNotEmpty(collect)){
String[] split = collect.split(",");
//更新点位锁,删除分配
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", 0)
.in("id", Arrays.asList(split)));
}
this.update(new UpdateWrapper<StIvtIostorinv>()
.set("status",StatusEnum.FORM_STATUS.code("取消"))
.eq("id",id));
return null;
}
}

View File

@@ -74,7 +74,10 @@ public class StIvtIostorinvdtl implements Serializable {
* 分配的载具
*/
private String vehicle_code;
/**
* 组盘记录表id
*/
private String vehicle_id;
/**
* 仓库
@@ -92,7 +95,7 @@ public class StIvtIostorinvdtl implements Serializable {
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject form_data = new JSONObject();;
private JSONObject form_data = new JSONObject();

View File

@@ -72,6 +72,7 @@ public class StIvtIostorinvdtlVo {
* 分配的载具
*/
private String vehicle_code;
private String vehicle_id;
/**

View File

@@ -73,14 +73,16 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl<StIvtIostorinvdtlM
}
List<StIvtIostorinvdtl> dtl = this.list(new QueryWrapper<StIvtIostorinvdtl>().eq("inv_id", inv_id));
for (StIvtIostorinvdtl iostorinvdtl : dtl) {
for (String vehicle_code : iostorinvdtl.getVehicle_code().split(",")) {
for (String vehicle_id : iostorinvdtl.getVehicle_id().split(",")) {
StIvtIostorinvdtlVo vo = new StIvtIostorinvdtlVo();
BeanUtils.copyProperties(iostorinvdtl,vo);
MdPbVehicleMater one = iMdPbVehicleMaterService.getOne(new QueryWrapper<MdPbVehicleMater>()
.eq("vehicle_code", vehicle_code)
.eq("id", vehicle_id)
.eq("is_delete", false)
.eq("material_id", iostorinvdtl.getMaterial_id()));
vo.setVehicleMater(one);
vo.setVehicle_code(vehicle_code);
vo.setVehicle_code(one.getVehicle_code());
vo.setVehicle_id(vehicle_id);
list.add(vo);
}
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
@@ -53,6 +54,7 @@ public class PickingController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/savePickTask")
@Log("拣选作业")
public ResponseEntity<Object> savePickTask(@RequestBody JSONArray params) {
pickingService.savePickTask(params);
return new ResponseEntity<>(HttpStatus.OK);
@@ -66,6 +68,7 @@ public class PickingController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/taskOpen")
@Log("拣选作业下发")
public ResponseEntity<Object> taskOpen(@RequestBody JSONObject param) {
pickingService.taskOpen(param);
return new ResponseEntity<>(HttpStatus.OK);

View File

@@ -11,12 +11,10 @@ import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.function.PermeateFunction;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.SpringContextHolder;
import org.nl.common.utils.*;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.external_system.acs.service.WmsToAcsService;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionDto;
import org.nl.wms.flow_manage.monitor.event.FlowContinueEvent;
import org.nl.wms.flow_manage.monitor.event.FlowStartEvent;
@@ -47,6 +45,8 @@ import java.util.stream.Collectors;
*/
@Service
public class PickingService {
private static Map<String,String> Pick_Convery = MapOf.of("1309","1207","1311","1209");
@Autowired
private IPmFormDataService iFormDataService;
@Autowired
@@ -55,6 +55,8 @@ public class PickingService {
private IMdGruopDickService iMdGruopDickService;
@Autowired
private IBmVehicleInfoService iBmVehicleInfoService;
@Autowired
private WmsToAcsService wmsToAcsService;
/**
* 生成拣选任务
@@ -122,8 +124,6 @@ public class PickingService {
if (!mst.getStatus().equals(StatusEnum.FORM_STATUS.code("已分配"))){
throw new BadRequestException("下发失败:当前单据未分配或者一下发");
}
PickingService pickingService = SpringContextHolder.getBean(this.getClass());
pickingService.disGroup(mst);
JSONObject mstJ = (JSONObject) JSON.toJSON(mst);
ExecutionDto dto = new ExecutionDto();
dto.setForm_id(mst.getId());
@@ -132,16 +132,40 @@ public class PickingService {
dto.setSource_form_id(mst.getSource_form_id());
dto.setT(mstJ);
dto.setItem(packageT(mstJ,"id"));
//只有透传才有vehicle_code参数否则只有inst_id
FlowContinueEvent continueEvent = new FlowContinueEvent(mst.getProc_inst_id(), (PermeateFunction<String, String>) (inst_id, vehicle_code) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("proc_inst_id",inst_id).eq("vehicle_code",vehicle_code)), null)
.setDto(dto);
continueEvent.setCallback(emp->{
iFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.eq("id",mst.getId()));
});
BussEventMulticaster.Publish(continueEvent);
JSONObject form_data = mstJ.getJSONObject("form_data");
String platform = form_data.getString("point_code");
String sourceVehicle = mstJ.getString("vehicle_code");
List<String> converys = new ArrayList<>();
for (ExecutionDto executionDto : dto.getItem()) {
for (ExecutionDto executionDto1 : executionDto.getItem()) {
JSONObject dis = executionDto1.getT();
if (!"false".equals(dis.getJSONObject("form_data").getString("s_move"))){
String vehicle_code = dis.getString("vehicle_code");
if (vehicle_code.equals(sourceVehicle)){
converys.add(platform);
}else {
converys.add(Pick_Convery.get(platform));
}
}
}
}
for (String convery : converys) {
wmsToAcsService.toCommand(convery,"1");
}
// PickingService pickingService = SpringContextHolder.getBean(this.getClass());
// pickingService.disGroup(mst);
// //只有透传才有vehicle_code参数否则只有inst_id
// FlowContinueEvent continueEvent = new FlowContinueEvent(mst.getProc_inst_id(), (PermeateFunction<String, String>) (inst_id, vehicle_code) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
// .set("proc_inst_id",inst_id).eq("vehicle_code",vehicle_code)), null)
// .setDto(dto);
// continueEvent.setCallback(emp->{
// iFormDataService.update(new UpdateWrapper<PmFormData>()
// .set("status",StatusEnum.FORM_STATUS.code("执行中"))
// .eq("id",mst.getId()));
// });
// BussEventMulticaster.Publish(continueEvent);
}

View File

@@ -28,7 +28,11 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
*/
List<Map<String, Object>> getByQuery(StructattrQuery query);
void changeStruct(String struct_code, String vehicle_code, String task_type, BigDecimal change_qty,Boolean growth);
void changeStruct(String struct_code
, String vehicle_code
, String task_type
, BigDecimal change_qty
, Boolean growth);
void deleteAll(Long[] ids);
Object pageQuery(StructattrQuery query, PageQuery page);

View File

@@ -4,6 +4,7 @@
<select id="getPageQuery" resultType="java.util.Map">
SELECT
md_pb_vehicleMater.id as vehicle_id,
md_pb_vehicleMater.material_id,
md_pb_vehicleMater.qty,
md_pb_vehicleMater.frozen_qty,

View File

@@ -65,17 +65,22 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
System.out.println(in);
}
@Override
public void changeStruct(String struct_code, String vehicle_code, String task_type, BigDecimal change_qty,Boolean growth) {
public void changeStruct(String struct_code, String vehicle_code, String task_type, BigDecimal change_qty, Boolean growth) {
UpdateWrapper<StIvtStructattr> wrapper = new UpdateWrapper<StIvtStructattr>()
.set("update_time", DateUtil.now())
.set("lock_type", StatusEnum.LOCK.code("无锁"))
.set("vehicle_code",vehicle_code)
.eq("struct_code", struct_code);
//如果是整出
if (!growth && change_qty==null){
wrapper.set("vehicle_code",null);
}
this.update(wrapper);
List<MdPbVehicleMater> vehicleMaters = vehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().eq("vehicle_code", vehicle_code));
if (growth && CollectionUtils.isEmpty(vehicleMaters)){
wrapper.set("lock_type",StatusEnum.LOCK.code("异常锁定"))
.set("remark","异常入库");
}
this.update(wrapper);
List<StIvtStructivtflow> records = new ArrayList<>();
StIvtStructattr attr = this.getOne(new QueryWrapper<StIvtStructattr>().eq("struct_code", struct_code).select("stor_code"));
for (MdPbVehicleMater vehicleMater : vehicleMaters) {

View File

@@ -53,18 +53,18 @@ public class MonitorServiceImpl implements MonitorService {
Map<String, Object> resultMap = new LinkedHashMap<>(8);
try {
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
// OperatingSystem os = si.getOperatingSystem();
HardwareAbstractionLayer hal = si.getHardware();
// 系统信息
resultMap.put("sys", getSystemInfo(os));
resultMap.put("sys", "getSystemInfo(os)");
// cpu 信息
resultMap.put("cpu", getCpuInfo(hal.getProcessor()));
resultMap.put("cpu", "getCpuInfo(hal.getProcessor())");
// 内存信息
resultMap.put("memory", getMemoryInfo(hal.getMemory()));
resultMap.put("memory", "getMemoryInfo(hal.getMemory())");
// 交换区信息
resultMap.put("swap", getSwapInfo(hal.getMemory()));
resultMap.put("swap", "getSwapInfo(hal.getMemory())");
// 磁盘
resultMap.put("disk", getDiskInfo(os));
resultMap.put("disk", "getDiskInfo(os)");
resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss"));
} catch (Exception e) {
e.printStackTrace();

View File

@@ -84,7 +84,7 @@ mybatis-plus:
feishu: https://open.feishu.cn/open-apis/bot/v2/hook/cfe495f7-9bcd-40bb-ab66-038de2131cac
lucene:
index:
path: E:\lms\lucene\index
path: D:\lms\lucene\index
pageheiper:
helperDialect: mysql
reasonable: true

View File

@@ -80,6 +80,7 @@
<springProfile name="dev3">
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="asyncLuceneAppender"/>
</root>
<logger name="jdbc" level="ERROR" additivity="true">
<appender-ref ref="asyncFileAppender"/>

View File

@@ -323,8 +323,8 @@ export default {
this.total = res.total
// 清空
this.logs = []
for (const j in res.records) { // 用push的方式将所有日志数组添加进去
this.logs.push(res.records[j])
for (const j in res.page) { // 用push的方式将所有日志数组添加进去
this.logs.push(res.page[j])
}
})
},

View File

@@ -242,7 +242,6 @@
<el-table-column prop="w" label="宽度" show-overflow-tooltip />
<el-table-column prop="h" label="高度" show-overflow-tooltip />
<el-table-column prop="l" label="深度" show-overflow-tooltip />
<el-table-column prop="remark" label="承受重量" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
<el-table-column
v-permission="['admin','structattr:edit','structattr:del']"

View File

@@ -79,72 +79,12 @@
@change="hand"
/>
</el-form-item>
<el-form-item label="是否启用">
<el-switch
v-model="query.is_used"
active-value="0"
inactive-value="1"
active-color="#C0CCDA"
inactive-color="#409EFF"
@change="hand"
/>
</el-form-item>
<rrOperation/>
</el-form>
</div>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission">
<el-button
v-if="crud.query.is_used == 0"
slot="right"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-circle-check"
:disabled="crud.selections.length === 0"
@click="changeUsed(crud.selections, 1)"
>
启用
</el-button>
<el-button
v-if="crud.query.is_used == 1"
slot="right"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-circle-close"
:disabled="crud.selections.length === 0"
@click="changeUsed(crud.selections, 0)"
>
禁用
</el-button>
<el-button
v-if="crud.query.lock_type == 0"
slot="right"
class="filter-item"
size="mini"
type="danger"
icon="el-icon-circle-check"
:disabled="crud.selections.length === 0"
@click="changeLock(crud.selections, 1)"
>
锁定
</el-button>
<el-button
v-if="crud.query.lock_type == 1"
slot="right"
class="filter-item"
size="mini"
type="danger"
icon="el-icon-circle-close"
:disabled="crud.selections.length === 0"
@click="changeLock(crud.selections, 0)"
>
解锁
</el-button>
</crudOperation>
<crudOperation :permission="permission"/>
<!--表单组件-->
<el-dialog
:close-on-click-modal="false"
@@ -202,6 +142,9 @@
/>
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="is_used">
<el-switch v-model="form.is_used" active-value="1" inactive-value="0" />
</el-form-item>
<el-form-item v-show="pointTypesDialogList.length > 0" label="点位类型" prop="device_point_type">
<el-select
v-model="form.point_type"

View File

@@ -291,7 +291,7 @@ export default {
return
}
const data = {
taskCode: row.task_code,
task_code: row.task_code,
status: status
}
crudSchBaseTask.operation(data).then(res => {

View File

@@ -88,6 +88,12 @@ export function flowConfirm(inst_id) {
method: 'get'
})
}
export function errorFinish(inst_id) {
return request({
url: 'api/bpmnExecution/errorFinish/' + inst_id,
method: 'get'
})
}
export function queryHisActivityId(proc_inst_id) {
return request({
@@ -109,5 +115,6 @@ export default {
getDtl,
changeActive,
flowConfirm,
errorFinish,
queryHisActivityId
}

View File

@@ -145,7 +145,7 @@
v-permission="['admin','actDeModel:edit','actDeModel:del']"
fixed="right"
label="操作"
width="210px"
width="280px"
align="center"
>
<template slot-scope="scope">
@@ -171,8 +171,9 @@
>确定
</el-button>
</div>
<el-button slot="reference" type="text" icon="el-icon-video-play" size="mini" @click="showPopover">触发
</el-button>
<el-button slot="reference" type="text" icon="el-icon-video-play" size="mini" @click="showPopover">触发</el-button>
<el-button slot="reference" type="text" icon="el-icon-video-play" size="mini" @click="errorFinish(scope.row.proc_inst_id)">异常完成</el-button>
</el-popover>
<el-button slot="right" type="text" icon="el-icon-thumb" size="mini" @click="viewClick(scope.row)">预览
</el-button>
@@ -273,6 +274,12 @@ export default {
showPopover() {
// this.popoverVisible = true;
},
errorFinish(proc_inst_id) {
curdExecution.errorFinish(proc_inst_id).then(res => {
this.crud.notify('异常结束流程成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
},
cancelFlow(scope) {
scope._self.$refs[`popover-${scope.$index}`].doClose()
},

View File

@@ -34,7 +34,7 @@
style="width: 200px"
>
<el-option
v-for="item in dict.FORM_STATUS"
v-for="item in statusEnum.FORM_STATUS"
:key="item.id"
:label="item.label"
:value="item.value"
@@ -78,7 +78,7 @@
<el-form-item label="状态" prop="status">
<el-select v-model="editForm.status" placeholder="" style="width: 120px">
<el-option
v-for="item in dict.FORM_STATUS"
v-for="item in statusEnum.FORM_STATUS"
:key="item.value"
:label="item.label"
:value="item.value"
@@ -102,7 +102,7 @@
</el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ dict.label.FORM_STATUS[scope.row.status] }}
{{ statusEnum.label.FORM_STATUS[scope.row.status] }}
</template>
</el-table-column>
<el-table-column prop="vehicle_code" label="托盘" show-overflow-tooltip/>
@@ -153,8 +153,8 @@ const defaultForm = {
form_data: {}
}
export default {
name: 'DeliveryOrder',
dicts: ['PCS_DELIVER_TYPE', 'FORM_STATUS'],
name: 'groupDick',
statusEnums: ['FORM_STATUS'],
components: { ViewDialog, AddDialog, crudbucketrecord, formstruc, pagination, crudOperation, rrOperation },
mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() {

View File

@@ -55,7 +55,22 @@
<template v-for="(col,index) in cols">
<el-form-item label="col.lable" prop="bill_code">
<label slot="label">{{col.lable}}:</label>
<el-input v-model="form.form_data[col.value]" :value="col.value" clearable style="width: 150px" />
<el-select v-if="col.value == 'product_area'"
v-model="form.form_data[col.value]"
clearable
size="mini"
placeholder="车间"
class="filter-item"
style="width: 120px"
>
<el-option
v-for="item in statusEnum.PRODUCT_AREA"
:key="item.key"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-if="col.value != 'product_area'" v-model="form.form_data[col.value]" :value="col.value" clearable style="width: 150px" />
</el-form-item>
</template>
<el-form-item label="备注" prop="remark">
@@ -153,7 +168,22 @@
</el-table-column>
<el-table-column v-for="(item, index) in dtlCols" :key="item.value" :label="item.lable" width="160">
<template scope="scope">
<el-input v-model="tableData[scope.$index].form_data[item.value]" class="input-with-select" />
<el-select v-if="item.value == 'product_area'"
v-model="tableData[scope.$index].form_data[item.value]"
clearable
size="mini"
placeholder="车间"
class="filter-item"
style="width: 120px"
>
<el-option
v-for="item in statusEnum.PRODUCT_AREA"
:key="item.key"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-if="item.value != 'product_area'" disabled v-model="tableData[scope.$index].form_data[item.value]" class="input-with-select" />
</template>
</el-table-column>
@@ -219,7 +249,7 @@ export default {
name: 'AddDialog',
components: { formstruc, MaterDialog,measureunit, FormDialog },
mixins: [crud(), form(defaultForm)],
statusEnums: [ 'FORM_STATUS', 'IOBILL_TYPE_OUT' ],
statusEnums: [ 'FORM_STATUS', 'IOBILL_TYPE_OUT', 'PRODUCT_AREA' ],
tableEnums: [ 'st_ivt_bsrealstorattr#stor_name#stor_code' ],
props: {
dialogShow: {

View File

@@ -106,9 +106,9 @@
:disabled="confirm_flag"
icon="el-icon-check"
size="mini"
@click="confirm"
@click="cancelMst"
>
强制确认
强制取消
</el-button>
</crudOperation>
<!--表格渲染-->
@@ -292,6 +292,16 @@ export default {
this.crud.toQuery()
})
},
cancelMst() {
if (!this.currentRow) {
this.crud.notify('请选择一条单据', CRUD.NOTIFICATION_TYPE.INFO)
return
}
crudProductOut.cancelMst(this.currentRow.id ).then(res => {
this.crud.notify('操作成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
},
handleCurrentChange(currentRow) {
if (currentRow === null) {
this.dis_flag = true

View File

@@ -66,6 +66,13 @@ export function taskOpen(data) {
data
})
}
export function cancelMst(id) {
return request({
url: "/api/stIvtIostorinvOut/cancelMst/" + id,
method: 'get'
})
}
export default {
add,
edit,
@@ -75,5 +82,6 @@ export default {
outDecision,
cancelDecision,
divDis,
cancelMst,
taskOpen,
}

View File

@@ -278,6 +278,7 @@ export default {
data.stor_name = row.stor_name
data.struct_code = row.struct_code
data.vehicle_code = row.vehicle_code
data.vehicle_id = row.vehicle_id
data.material_spec = row.material_spec
data.material_name = row.material_name
data.material_id = row.material_id

View File

@@ -199,7 +199,7 @@ export default {
{"label":"拣选回库","value":"13"},{"label":"拣选出库","value":"23"}
],
outboundList:[
{"label":"一楼出库口","value":"1101"},{"label":"二楼出库口","value":"2114"}
{"label":"一楼出库口","value":"1101"},{"label":"二楼出库口","value":"2114"},{"label":"三楼出库口","value":"3204"}
],
}
@@ -242,7 +242,6 @@ export default {
this.dialogVisible = false
},
handleDtlCurrentChange(current) {
debugger
if (current !== null) {
this.currentdtl = current
this.queryTableDis(this.currentdtl)

View File

@@ -92,6 +92,7 @@
<el-table-column type="index" label="序号" width="55" align="center" />
<el-table-column show-overflow-tooltip prop="stor_name" label="仓库" />
<el-table-column show-overflow-tooltip prop="vehicle_code" label="载具编码" />
<el-table-column show-overflow-tooltip prop="vehicle_id" label="载具组盘id" width="160" />
<el-table-column show-overflow-tooltip prop="material_spec" label="物料规格" />
<el-table-column show-overflow-tooltip prop="material_name" label="物料名称" />
<el-table-column show-overflow-tooltip prop="pcsn" label="批次" />
@@ -301,6 +302,7 @@ export default {
data.stor_name = row.stor_name
data.start_struct_code = row.struct_code
data.vehicle_code = row.vehicle_code
data.vehicle_id = row.vehicle_id
data.material_spec = row.material_spec
data.material_name = row.material_name
data.material_id = row.material_id

View File

@@ -226,7 +226,6 @@ export default {
this.dialogVisible = false
},
handleDtlCurrentChange(current) {
debugger
if (current !== null) {
this.currentdtl = current
this.queryTableDis(this.currentdtl)

View File

@@ -230,6 +230,8 @@
/>
</el-select>
<el-input v-if="item.value == 'end_struct_code'" v-model="tabledis[scope.$index].form_data[item.value]" />
<el-input v-if="item.value == 'pick_vehicle'" disabled v-model="tabledis[scope.$index].form_data[item.value]" />
<el-input v-if="item.value == 'point_code'" v-model="tabledis[scope.$index].form_data[item.value]" />
</template>
</el-table-column>
<el-table-column align="center" label="操作" fixed="right">
@@ -352,6 +354,8 @@ export default {
dtl.source_form_date = this.currentDtl.create_time
dtl.parent_id = this.currentDtl.id
dtl.form_data = JSON.parse(JSON.stringify(this.disFormData))
dtl.form_data.pick_vehicle = this.currentDtl.vehicle_code
dtl.form_data.point_code = this.form.form_data.point_code
this.tabledis.push(dtl)
},
subRow(index){

View File

@@ -297,7 +297,6 @@ export default {
return this.dict.label.work_status[row.work_status]
},
handleDtlCurrentChange(current) {
debugger
if (current !== null) {
this.currentdtl = current
this.queryTableDis(this.currentdtl.id)

View File

@@ -115,12 +115,12 @@
</template>
</el-table-column>
<el-table-column prop="vehicle_code" label="载具编号" show-overflow-tooltip width="120" />
<el-table-column prop="qty" label="物料数量" show-overflow-tooltip />
<el-table-column prop="material_id" label="物料id" show-overflow-tooltip width="120" />
<el-table-column prop="material_name" label="物料名称" show-overflow-tooltip width="120" />
<el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />
<el-table-column prop="pcsn" label="批次" show-overflow-tooltip width="120" />
<el-table-column prop="unit_id" label="单位" show-overflow-tooltip width="120" />
<!-- <el-table-column prop="qty" label="物料数量" show-overflow-tooltip />-->
<!-- <el-table-column prop="material_id" label="物料id" show-overflow-tooltip width="120" />-->
<!-- <el-table-column prop="material_name" label="物料名称" show-overflow-tooltip width="120" />-->
<!-- <el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />-->
<!-- <el-table-column prop="pcsn" label="批次" show-overflow-tooltip width="120" />-->
<!-- <el-table-column prop="unit_id" label="单位" show-overflow-tooltip width="120" />-->
<el-table-column prop="biz_code" label="业务单据编码" show-overflow-tooltip width="120" />
<el-table-column prop="biz_date" label="业务单据时间" show-overflow-tooltip width="130" />
<el-table-column prop="parent_id" label="父单据数据id" show-overflow-tooltip width="120" />