|
@@ -897,59 +897,81 @@ const configFormRules = reactive({
|
|
|
|
|
|
/** 校验表格数据 */
|
|
|
const validateTableData = (): boolean => {
|
|
|
- let isValid = true
|
|
|
- const errorMessages: string[] = []
|
|
|
- let shouldBreak = false;
|
|
|
- const materialRequiredErrors: string[] = [] // 物料必填错误
|
|
|
+ let isValid = true;
|
|
|
+ const errorMessages: string[] = []; // 通用错误集合
|
|
|
+ const materialRequiredErrors: string[] = []; // 物料缺失专用错误集合
|
|
|
|
|
|
+ // 1. 基础校验:工单明细是否存在
|
|
|
if (list.value.length === 0) {
|
|
|
- errorMessages.push('工单明细不存在')
|
|
|
- isValid = false
|
|
|
- // 直接返回无需后续校验
|
|
|
- message.error('工单明细不存在')
|
|
|
- return isValid
|
|
|
+ message.error('工单明细不存在');
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
- // 新增物料必填校验(仅在非委外模式下检查)
|
|
|
- if (formData.value.outsourcingFlag !== 1) { // 非委外模式
|
|
|
+ // 2. 校验设备状态
|
|
|
+ list.value.forEach((row, index) => {
|
|
|
+ const rowNumber = index + 1;
|
|
|
+ if (row.deviceCode === null || row.deviceName === null) {
|
|
|
+ errorMessages.push(`第${rowNumber}行设备状态错误`);
|
|
|
+ isValid = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 3. 校验物料必填(仅在非委外模式下)
|
|
|
+ if (formData.value.outsourcingFlag !== 1) {
|
|
|
list.value.forEach((row, index) => {
|
|
|
- const rowNumber = index + 1
|
|
|
- const deviceIdentifier = `${row.deviceCode}-${row.name}`
|
|
|
+ const rowNumber = index + 1;
|
|
|
+ const deviceIdentifier = `${row.deviceCode}-${row.name}`;
|
|
|
|
|
|
// 检查是否设置了推迟保养
|
|
|
const hasDelay =
|
|
|
(row.delayKilometers || 0) > 0 ||
|
|
|
(row.delayNaturalDate || 0) > 0 ||
|
|
|
- (row.delayDuration || 0) > 0
|
|
|
+ (row.delayDuration || 0) > 0;
|
|
|
|
|
|
// 未设置推迟保养且未选择物料
|
|
|
if (!hasDelay && getMaterialCount(row.bomNodeId) === 0) {
|
|
|
- materialRequiredErrors.push(`第${rowNumber}行【${deviceIdentifier}】必须选择物料`)
|
|
|
- isValid = false
|
|
|
+ materialRequiredErrors.push(`第${rowNumber}行【${deviceIdentifier}】未添加物料`);
|
|
|
+ isValid = false;
|
|
|
}
|
|
|
- })
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
- list.value.forEach((row, index) => {
|
|
|
- if (shouldBreak) return;
|
|
|
- const rowNumber = index + 1 // 用户可见的行号从1开始
|
|
|
- // const deviceIdentifier = `${row.deviceCode}-${row.name}` // 设备标识
|
|
|
- if(row.deviceCode === null || row.deviceName === null){
|
|
|
- errorMessages.push('设备状态错误')
|
|
|
- isValid = false
|
|
|
+ // 4. 智能错误提示
|
|
|
+ if (!isValid) {
|
|
|
+ // 构建错误消息HTML
|
|
|
+ let errorHtml = '';
|
|
|
+
|
|
|
+ // 添加通用错误
|
|
|
+ if (errorMessages.length > 0) {
|
|
|
+ errorHtml += errorMessages.join('<br>');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加物料错误(带智能截断)
|
|
|
+ if (materialRequiredErrors.length > 0) {
|
|
|
+ if (errorHtml) errorHtml += '<br>'; // 添加换行分隔
|
|
|
+
|
|
|
+ if (materialRequiredErrors.length > 3) {
|
|
|
+ errorHtml += materialRequiredErrors.slice(0, 3).join('<br>');
|
|
|
+ errorHtml += `<br>...等共 ${materialRequiredErrors.length} 个保养项未添加物料`;
|
|
|
+ } else {
|
|
|
+ errorHtml += materialRequiredErrors.join('<br>');
|
|
|
+ }
|
|
|
}
|
|
|
- })
|
|
|
- if (errorMessages.length > 0) {
|
|
|
- message.error('设备状态错误')
|
|
|
- }
|
|
|
- // 合并错误信息
|
|
|
- if (materialRequiredErrors.length > 0) {
|
|
|
- message.error(materialRequiredErrors.join('\n'))
|
|
|
- }
|
|
|
- return isValid
|
|
|
-}
|
|
|
|
|
|
+ // 添加标题
|
|
|
+ const title = "<span style='font-weight:bold;color:#f56c6c'></span>";
|
|
|
+ errorHtml = title + errorHtml;
|
|
|
+
|
|
|
+ // 显示带格式的错误消息
|
|
|
+ message.error({
|
|
|
+ message: errorHtml,
|
|
|
+ dangerouslyUseHTMLString: true,
|
|
|
+ duration: 8000 // 延长显示时间
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
+ return isValid;
|
|
|
+};
|
|
|
|
|
|
/** 重置表单 */
|
|
|
const resetForm = () => {
|