1. 完善场内wms出入库回调功能

2. 添加xsfbillno, xsfseq, neibubianhao字段
3. 添加单机出入库功能
4. 调整入库单与出库单页面
5. 添加mes出库时对于物料号与载具号的区分逻辑, goodsId长度小于等于3为物料号, 否则为载具号
This commit is contained in:
李宇奇 2025-04-14 22:50:15 +08:00
parent 7ab3096b94
commit 16a9981ece
13 changed files with 295 additions and 44 deletions

View File

@ -11,7 +11,7 @@
Target Server Version : 80034 (8.0.34)
File Encoding : 65001
Date: 08/04/2025 19:42:54
Date: 14/04/2025 22:45:54
*/
SET NAMES utf8mb4;
@ -2223,9 +2223,9 @@ CREATE TABLE `t_app_jobs` (
-- ----------------------------
-- Records of t_app_jobs
-- ----------------------------
INSERT INTO `t_app_jobs` VALUES ('OutsExecutor', 'com.wms_main.service.quartz_job.job_executor.OutsExecutor', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('WcsStackerTaskSender', 'com.wms_main.service.quartz_job.job_executor.WcsStackerTaskSender', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('WmsTaskFinisher', 'com.wms_main.service.quartz_job.job_executor.WmsTaskFinisher', '0/2 * * * * ? *', 2000, 1, 1);
INSERT INTO `t_app_jobs` VALUES ('YcOutExecutor', 'com.wms_main.service.quartz_job.job_executor.YcOutExecutor', '0/2 * * * * ? *', 2000, 1, 1);
-- ----------------------------
-- Table structure for t_app_kanban
@ -5622,6 +5622,7 @@ CREATE TABLE `t_app_vehicle` (
INSERT INTO `t_app_vehicle` VALUES ('0401', 0, 3, '1', 0, '', '2025-04-01 13:11:48');
INSERT INTO `t_app_vehicle` VALUES ('0402', 0, 2, '1', 0, '', '2025-04-01 13:11:56');
INSERT INTO `t_app_vehicle` VALUES ('20250401150031', 0, 3, '1', 0, '', '2025-04-08 19:30:11');
INSERT INTO `t_app_vehicle` VALUES ('TU1250410142129', 0, 3, '1', 0, '', '2025-04-14 10:35:53');
-- ----------------------------
-- Table structure for t_app_wcs_task
@ -5733,6 +5734,14 @@ INSERT INTO `t_app_wcs_task_bak` VALUES ('1744110975061010000', 100, 2, 1, '2025
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111374581010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 19:22:55', '2025-04-08 19:22:55', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111790731010000', 2, 1, 0, '20250401150031', '103', 'A04-20-05-02', '2025-04-08 19:29:51', '2025-04-08 19:29:51', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744111948895010000', 100, 2, 1, '20250401150031', 'A04-20-05-02', '103', '2025-04-08 19:32:29', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744433134762010000', 2, 1, 0, 'TU1250410142129', '103', 'A04-20-05-02', '2025-04-12 12:45:35', '2025-04-12 12:45:35', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744433267719010000', 100, 2, 1, 'TU1250410142129', 'A04-20-05-02', '103', '2025-04-12 12:47:48', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744434313304010000', 2, 1, 0, 'TU1250410142129', '103', 'A04-20-05-02', '2025-04-12 13:05:13', '2025-04-12 13:05:13', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744434475517010000', 100, 2, 1, 'TU1250410142129', 'A04-20-05-02', '103', '2025-04-12 13:07:56', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744434898455010000', 2, 1, 0, 'TU1250410142129', '103', 'A04-20-05-02', '2025-04-12 13:14:58', '2025-04-12 13:14:58', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744435011511010000', 100, 2, 1, 'TU1250410142129', 'A04-20-05-02', '103', '2025-04-12 13:16:52', NULL, NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744598132392010000', 2, 1, 0, 'TU1250410142129', '103', 'A04-20-05-02', '2025-04-14 10:35:32', '2025-04-14 10:35:32', NULL, NULL);
INSERT INTO `t_app_wcs_task_bak` VALUES ('1744598438538010000', 100, 2, 1, 'TU1250410142129', 'A04-20-05-02', '103', '2025-04-14 10:40:39', NULL, NULL, NULL);
-- ----------------------------
-- Table structure for t_app_work

View File

@ -21,9 +21,28 @@ public class StockReq {
@JsonProperty("specification")
private String specification;
@JsonProperty("goodsBarCode")
private String goodsBarCode;
@JsonProperty("xsfbillno")
private String xsfbillno;
@JsonProperty("xsfseq")
private Integer xsfseq;
@JsonProperty("neibubianhao")
private String neibubianhao;
public boolean empty() {
return StringUtils.isEmpty(location) && StringUtils.isEmpty(vehicleNo) && StringUtils.isEmpty(goodsId) && specification == null;
return StringUtils.isEmpty(location)
&& StringUtils.isEmpty(vehicleNo)
&& StringUtils.isEmpty(goodsId)
&& StringUtils.isEmpty(specification)
&& StringUtils.isEmpty(goodsBarCode)
&& StringUtils.isEmpty(xsfbillno)
&& xsfseq == null
&& StringUtils.isEmpty(neibubianhao);
}
}

View File

@ -34,5 +34,15 @@ public class StockRespGoodsDetail {
@JsonProperty("storeTime")
private LocalDateTime storeTime;
@JsonProperty("goodsBarCode")
private String goodsBarCode;
@JsonProperty("xsfbillno")
private String xsfbillno;
@JsonProperty("xsfseq")
private Integer xsfseq;
@JsonProperty("neibubianhao")
private String neibubianhao;
}

View File

@ -63,4 +63,17 @@ public class ConvertUtils {
default -> -1;
};
}
public static String convertDestinationToPoint(String destination) {
return switch (destination) {
case "101" -> "LK-1";
case "102" -> "LK-2";
case "103" -> "LK-3";
case "104" -> "LK-4";
case "105" -> "LK-5";
case "106" -> "LK-6";
case "107" -> "LK-7";
default -> "";
};
}
}

View File

@ -28,6 +28,8 @@ import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.wms_main.repository.utils.ConvertUtils.convertDestinationToPoint;
/**
* 服务实现
*/
@ -451,6 +453,9 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
orderCBIds = orderCBIds.stream().distinct().collect(Collectors.toList());
for (String orderId : orderCBIds) {
if (orderId.contains("baokai")) {
continue;
}
OrderInCBReq orderInCBReq = new OrderInCBReq();
orderInCBReq.setOrderId(orderId);
orderInCBReq.setVehicleNo(vehicleId);
@ -775,18 +780,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
// 更新当前载具对应的所有库存的状态为已出库
appStockService.remove(new LambdaUpdateWrapper<TAppStock>()
.eq(TAppStock::getVehicleId, vehicleId));
// List<String> orderIds = thisVehicleOutTasks.stream()
// .map(TAppWcsTask::getOrderId)
// .filter(Objects::nonNull)
// .distinct()
// .collect(Collectors.toList());
//
// List<TAppOrderOut> thisVehicleOutOrders = orderIds.isEmpty() ?
// Collections.emptyList() :
// appOrderOutService.list(
// new LambdaQueryWrapper<TAppOrderOut>()
// .in(TAppOrderOut::getOrderId, orderIds)
// );
if (!thisVehicleOutTasks.isEmpty()) {
// 存储出库记录
List<TAppWcsTaskBak> stockOutRecordList = thisVehicleOutTasks.stream()
@ -812,10 +806,15 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
}
List<String> orderOutsId = thisVehicleOutTasks.stream().map(TAppWcsTask::getOrderId).distinct().toList();
for (String orderId : orderOutsId) {
if (orderId.contains("baokai")) {
continue;
}
List<TAppWcsTask> thisWcsTasks = vehicleIdToTaskMap.get(vehicleId);
OrderOutCBReq orderOutCBReq = new OrderOutCBReq();
orderOutCBReq.setOrderId(orderId);
orderOutCBReq.setVehicleNo(vehicleId);
orderOutCBReq.setOrderStatus(OrderStatusEnum.COMPLETE.getCode());
orderOutCBReq.setOutStand(convertDestinationToPoint(thisWcsTasks.getFirst().getDestination()));
orderOutCBReq.setMessage("出库完成");
int times = 0;
@ -831,6 +830,9 @@ public class StackerTaskServiceImpl implements IStackerTaskService {
}
}
}
appOrderOutService.remove(new LambdaUpdateWrapper<TAppOrderOut>().le(TAppOrderOut::getQuantity, 0));
List<String> orderOutIds = stackerOutTasks.stream().map(TAppWcsTask::getOrderId).distinct().toList();
for (String orderId : orderOutIds) {
appOrderOutService.remove(new LambdaUpdateWrapper<TAppOrderOut>().eq(TAppOrderOut::getOrderId, orderId));
}
}
}

View File

@ -68,9 +68,12 @@ public class WcsControllerServiceImpl implements IWcsControllerService {
orderIn.setGoodsName("空托盘");
orderIn.setBatch("0");
orderIn.setGoodsType("0");
orderIn.setSpecification("");
orderIn.setSpecification("empty");
orderIn.setQuantity(1.0);
orderIn.setGoodsDesc("");
orderIn.setXsfbillno("");
orderIn.setXsfseq(0);
orderIn.setNeibubianhao("");
orderIn.setOrderStatus(OrderStatusEnum.RUNNING.getCode());
orderIn.setCreateTime(LocalDateTime.now());
orderIn.setUpdateTime(LocalDateTime.now());
@ -131,9 +134,12 @@ public class WcsControllerServiceImpl implements IWcsControllerService {
orderIn.setGoodsName("空托盘");
orderIn.setBatch("0");
orderIn.setGoodsType("0");
orderIn.setSpecification("");
orderIn.setSpecification("empty");
orderIn.setQuantity(1.0);
orderIn.setGoodsDesc("");
orderIn.setXsfbillno("");
orderIn.setXsfseq(0);
orderIn.setNeibubianhao("");
orderIn.setOrderStatus(OrderStatusEnum.RUNNING.getCode());
orderIn.setCreateTime(LocalDateTime.now());
orderIn.setUpdateTime(LocalDateTime.now());

View File

@ -67,6 +67,9 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
log.error("处理载具[{}]数据时发生异常:", vehicleNo, e);
}
List<OrderInGoodsDetail> mesGoodsDetails = request.getGoodsDetail();
if (request.getOrderId().contains("baokai")) {
mesGoodsDetails.clear();
}
// 对比inTasks和goodsDetails
Iterator<OrderInGoodsDetail> iterator = mesGoodsDetails.iterator();
while (iterator.hasNext()) {
@ -195,6 +198,10 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
goodsDetail.setStoreTime(stock.getFirstInTime());
goodsDetail.setBatch(stock.getBatch());
goodsDetail.setGoodsType(stock.getGoodsType());
goodsDetail.setGoodsBarCode(stock.getGoodsBarCode());
goodsDetail.setXsfbillno(stock.getXsfbillno());
goodsDetail.setXsfseq(stock.getXsfseq());
goodsDetail.setNeibubianhao(stock.getNeibubianhao());
goodsDetails.add(goodsDetail);
}
stockResp.setGoodsDetail(goodsDetails);

View File

@ -0,0 +1,161 @@
package com.wms_main.service.quartz_job.job_executor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums;
import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums;
import com.wms_main.constant.enums.wms.OrderStatusEnum;
import com.wms_main.constant.enums.wms.WmsStockStatusEnums;
import com.wms_main.dao.ITAppOrderOutService;
import com.wms_main.dao.ITAppStockService;
import com.wms_main.dao.ITAppTaskService;
import com.wms_main.dao.ITAppWcsTaskService;
import com.wms_main.model.po.TAppOrderOut;
import com.wms_main.model.po.TAppStock;
import com.wms_main.model.po.TAppWcsTask;
import com.wms_main.repository.utils.StringUtils;
import com.wms_main.repository.utils.UUIDUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 定时任务定义类---出库单解析类
*/
@Slf4j
@PersistJobDataAfterExecution
// 以下注解用于实现fixed_delay
@DisallowConcurrentExecution
@RequiredArgsConstructor
public class YcOutExecutor implements Job {
private final ITAppOrderOutService orderOutService;
private final ITAppStockService stockService;
private final ITAppTaskService taskService;
private final ITAppWcsTaskService wcsTaskService;
/**
* 运行定时任务
*
* @param jobExecutionContext 定时任务执行的环境上下文
*/
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 处理出库单
try {
executeOrderOut();
} catch (Exception e) {
log.error("处理出库单失败{}", StringUtils.objectToString(e));
}
}
/**
* 解析出库单
*/
private void executeOrderOut() {
List<TAppOrderOut> orderOutsList = orderOutService.getWithStatus(OrderStatusEnum.CREATE.getCode());
if (orderOutsList == null || orderOutsList.isEmpty()) {
return;
}
for (TAppOrderOut orderOut : orderOutsList) {
String strId = orderOut.getGoodsId();
if (strId != null && strId.length() <= 3) {
_resolveGoodsId(orderOut);
} else if (strId != null) {
_resolveVehicleId(orderOut);
}
}
}
private void _resolveGoodsId(TAppOrderOut orderOut) {
Double needQuantity = orderOut.getQuantity();
if (needQuantity == null || needQuantity < 1) {
return;
}
TAppStock stock = new TAppStock();
stock.setGoodsId(orderOut.getGoodsId());
stock.setSled(orderOut.getSpecification());
List<TAppStock> stockList = stockService.getWithEntity(stock);
// 提取所有相关库存的载具号
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).distinct().toList();
List<TAppStock> outStockList = new ArrayList<TAppStock>();
if (vehicleIds.isEmpty()) {
log.warn("缺少库存, goodsId is {}, batch is {}, specification is {}", orderOut.getGoodsId(), orderOut.getBatch(), orderOut.getSpecification());
return;
}
for (String vehicleId : vehicleIds) {
List<TAppStock> stockListToOut = stockService.list(new LambdaQueryWrapper<TAppStock>().eq(TAppStock::getVehicleId, vehicleId));
for (TAppStock stockItem : stockListToOut) {
if (needQuantity <= 0) break;
if (stockItem == null) {
continue;
}
if (stockItem.getGoodsId().equals(orderOut.getGoodsId()) && stockItem.getStockStatus().equals(WmsStockStatusEnums.OK.getCode())) {
needQuantity -= stockItem.getTotalNum();
}
stockItem.setStockStatus(WmsStockStatusEnums.OUTING.getCode());
outStockList.add(stockItem);
}
}
List<TAppWcsTask> wcsTasks = new ArrayList<>();
Map<String, List<TAppStock>> vehicleIdToStockMap = outStockList.stream()
.filter(stockMap -> Objects.equals(stockMap.getStockStatus(), WmsStockStatusEnums.OUTING.getCode()))
.collect(Collectors.groupingBy(TAppStock::getVehicleId));
for (String vehicleId : vehicleIdToStockMap.keySet()) {
List<TAppStock> stocks = vehicleIdToStockMap.get(vehicleId);
TAppWcsTask wcsTask = new TAppWcsTask();
wcsTask.setWcsTaskId(UUIDUtils.getNewUUID());
wcsTask.setWcsTaskType(WcsStackerTaskTypeEnums.OUT.getCode());
wcsTask.setWcsTaskStatus(WcsStackerTaskStatusEnums.INIT.getCode());
wcsTask.setTaskPriority(1);
wcsTask.setVehicleId(stocks.getFirst().getVehicleId());
wcsTask.setOrderId(orderOut.getOrderId());
wcsTask.setCreateTime(LocalDateTime.now());
wcsTask.setOrigin(stocks.getFirst().getLocationId());
wcsTask.setDestination(stocks.getFirst().getBarCode());
wcsTasks.add(wcsTask);
}
orderOut.setOrderStatus(OrderStatusEnum.RUNNING.getCode());
orderOutService.updateById(orderOut);
wcsTaskService.saveBatch(wcsTasks);
stockService.updateBatchById(outStockList);
}
private void _resolveVehicleId(TAppOrderOut orderOut) {
String vehicleId = orderOut.getGoodsId();
List<TAppStock> stocks = stockService.list(new LambdaQueryWrapper<TAppStock>().eq(TAppStock::getVehicleId, vehicleId));
if (stocks == null) {
log.warn("数据库连接异常");
return;
} else if (stocks.isEmpty()) {
log.warn("载具{} 无库存", vehicleId);
return;
}
TAppWcsTask wcsTask = new TAppWcsTask();
wcsTask.setWcsTaskId(UUIDUtils.getNewUUID());
wcsTask.setWcsTaskType(WcsStackerTaskTypeEnums.OUT.getCode());
wcsTask.setWcsTaskStatus(WcsStackerTaskStatusEnums.INIT.getCode());
wcsTask.setTaskPriority(1);
wcsTask.setVehicleId(vehicleId);
wcsTask.setOrderId(orderOut.getOrderId());
wcsTask.setCreateTime(LocalDateTime.now());
wcsTask.setOrigin(stocks.getFirst().getLocationId());
wcsTask.setDestination(stocks.getFirst().getBarCode());
orderOut.setOrderStatus(OrderStatusEnum.RUNNING.getCode());
orderOutService.updateById(orderOut);
wcsTaskService.save(wcsTask);
stockService.update(
new LambdaUpdateWrapper<TAppStock>()
.eq(TAppStock::getVehicleId, vehicleId)
.set(TAppStock::getStockStatus, WmsStockStatusEnums.OUTING.getCode()));
}
}

View File

@ -6,7 +6,7 @@ import axios from "axios";
*/
const _request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
// baseURL: 'http://localhost:12315',
baseURL: 'http://10.18.58.21:12315',
timeout: 5000
})

View File

@ -6,7 +6,7 @@ import axios from "axios";
*/
const _request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
// baseURL: 'http://localhost:12315',
baseURL: 'http://10.18.58.21:12315',
timeout: 5000
})

View File

@ -1,8 +1,8 @@
import axios from 'axios'
const request = axios.create({
// baseURL: 'http://10.18.58.20:12315/wms',
baseURL: 'http://localhost:12315/wms',
baseURL: 'http://10.18.58.21:12315/wms',
// baseURL: 'http://localhost:12315/wms',
timeout: 5000
})

View File

@ -7,12 +7,6 @@
<el-form ref="orderInFormRef" :model="orderInForm" :rules="rules" label-width="100px"
:label-position="labelPosition" status-icon>
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="6" :lg="5">
<el-form-item label="订单号" prop="orderId">
<el-input v-model="orderInForm.orderId" clearable @keyup.enter="handleEnter('vehicleNo')"
ref="orderIdRef"/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="6" :lg="5">
<el-form-item label="料箱号" prop="vehicleNo">
<el-input v-model="orderInForm.vehicleNo" clearable @keyup.enter="handleEnter('vehicleSize')"
@ -301,10 +295,23 @@ import {errorBox} from '@/utils/myMessageBox.js'
import {labelPosition} from '@/constant/form'
import {submitOrderInForm, getOrderIns, updateOrderIn} from '@/api/orderIn.js'
//
const generateOrderId = () => {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
const milliseconds = String(now.getMilliseconds()).padStart(3, '0')
return `baokai${year}${month}${day}${hours}${minutes}${seconds}${milliseconds}`
}
//
const orderInFormRef = ref()
const orderInForm = reactive({
orderId: '',
orderId: generateOrderId(),
vehicleNo: '',
vehicleSize: '',
inStand: '',
@ -333,14 +340,12 @@ const queryForm = reactive({
//
const rules = reactive({
orderId: [{required: true, message: '请输入订单号', trigger: 'blur'}],
vehicleNo: [{required: true, message: '请输入料箱号', trigger: 'blur'}],
vehicleSize: [{required: true, message: '请输入料箱尺寸', trigger: 'blur'}],
inStand: [{required: true, message: '请输入入库站台', trigger: 'blur'}],
})
// DOM
const orderIdRef = ref()
const vehicleNoRef = ref()
const vehicleSizeRef = ref()
const inStandRef = ref()
@ -360,7 +365,7 @@ const currentOrderIn = ref(null)
//
onMounted(() => {
nextTick(() => {
orderIdRef.value.focus()
vehicleNoRef.value.focus()
window.addEventListener('resize', resizeHeight)
})
})
@ -410,6 +415,15 @@ const clearGoodsDetail = () => {
orderInForm.goodsDetail = []
}
//
const resetOrderInForm = () => {
orderInForm.orderId = generateOrderId()
orderInForm.vehicleNo = ''
orderInForm.vehicleSize = ''
orderInForm.inStand = ''
orderInForm.goodsDetail = []
}
//
const submitOrderIn = () => {
orderInFormRef.value.validate((valid) => {
@ -437,6 +451,8 @@ const submitOrderIn = () => {
if (res.data.code === 0) {
ElMessage.success('入库单提交成功')
//
resetOrderInForm()
} else {
errorBox(`入库单提交失败: ${res.data.message}`)
}

View File

@ -6,11 +6,6 @@
<legend>出库单信息</legend>
<el-form ref="orderOutFormRef" :model="orderOutForm" :rules="rules" label-width="70px" :label-position="labelPosition" status-icon>
<el-row :gutter="5" class="form-row">
<el-col :xs="24" :sm="4" :md="4" :lg="4">
<el-form-item label="订单号" prop="orderId">
<el-input v-model="orderOutForm.orderId" clearable @keyup.enter="handleEnter('goodsId')" ref="orderIdRef" class="custom-input" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="4" :md="4" :lg="4">
<el-form-item label="物料编号" prop="goodsId">
<el-input v-model="orderOutForm.goodsId" clearable @keyup.enter="handleEnter('batch')" ref="goodsIdRef" class="custom-input" />
@ -23,7 +18,7 @@
</el-col>
<el-col :xs="24" :sm="4" :md="4" :lg="4">
<el-form-item label="规格" prop="specification">
<el-input-number v-model="orderOutForm.specification" :min="1" controls-position="right" clearable @keyup.enter="handleEnter('quantity')" ref="specificationRef" class="custom-input" />
<el-input v-model="orderOutForm.specification" placeholder="请输入规格" clearable @keyup.enter="handleEnter('quantity')" ref="specificationRef" class="custom-input" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="4" :md="4" :lg="4">
@ -61,19 +56,31 @@ import { errorBox } from '@/utils/myMessageBox.js'
import { labelPosition } from '@/constant/form'
import { submitOrderOutForm } from '@/api/orderOut.js'
//
const generateOrderId = () => {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
const milliseconds = String(now.getMilliseconds()).padStart(3, '0')
return `baokai${year}${month}${day}${hours}${minutes}${seconds}${milliseconds}`
}
//
const orderOutFormRef = ref()
const orderOutForm = reactive({
orderId: '',
orderId: generateOrderId(),
goodsId: '',
batch: '',
specification: null,
specification: '',
quantity: null
})
//
const rules = reactive({
orderId: [{ required: true, message: '请输入订单号', trigger: 'blur' }],
goodsId: [{ required: true, message: '请输入物料编号', trigger: 'blur' }],
batch: [{ required: true, message: '请输入批次', trigger: 'blur' }],
specification: [{ required: true, message: '请输入规格', trigger: 'blur' }],
@ -81,7 +88,6 @@ const rules = reactive({
})
// DOM
const orderIdRef = ref()
const goodsIdRef = ref()
const batchRef = ref()
const specificationRef = ref()
@ -94,7 +100,7 @@ const responseResult = ref({})
//
onMounted(() => {
nextTick(() => {
orderIdRef.value.focus()
goodsIdRef.value.focus()
window.addEventListener('resize', resizeHeight)
})
})
@ -125,8 +131,10 @@ const handleEnter = (nextField) => {
//
const resetForm = () => {
orderOutFormRef.value.resetFields()
//
orderOutForm.orderId = generateOrderId()
nextTick(() => {
orderIdRef.value.focus()
goodsIdRef.value.focus()
})
}