liu
2 天以前 f11bd0d8d9c1190340a445a67df9e43cdbde0a3e
src/views/mes/pro/feedback/modules/form.vue
@@ -26,10 +26,10 @@
} from '#/api/mes/pro/feedback';
import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process';
import { getWorkOrder } from '#/api/mes/pro/workorder';
import { getWorkOrderParamRecordPage } from '#/api/mes/pro/workorderparamrecord';
import { $t } from '#/locales';
import { useFormSchema } from '../data';
import { findMissingRequiredParams, loadParamDetails, paramDetails } from '../param-state';
import BatchInputDialog from './batch-input-dialog.vue';
import ItemConsumeList from './item-consume-list.vue';
import ProductProduceList from './product-produce-list.vue';
@@ -41,7 +41,6 @@
const userStore = useUserStore();
const subTabsName = ref('itemConsume');
const originalSnapshot = ref(''); // 表单原始数据快照,用于 submit 时跳过未变更的保存请求
const paramDetails = ref<Array<{ id: number; paramName?: string; paramCode?: string; unitMeasureName?: string; paramValue?: string }>>([]);
const isEditable = computed(() =>
  ['create', 'submit', 'update'].includes(formType.value),
@@ -118,6 +117,9 @@
  if (!valid) {
    return;
  }
  if (!checkRequiredParams()) {
    return;
  }
  modalApi.lock();
  try {
    const data = await getAlignedData();
@@ -149,25 +151,21 @@
const batchDialogRef = ref<InstanceType<typeof BatchInputDialog>>();
const batchActionType = ref<'submit' | 'approve'>('');
async function loadParamDetails(taskId?: number) {
  paramDetails.value = [];
  if (!taskId) return;
  const page = await getWorkOrderParamRecordPage({ taskId, pageNo: 1, pageSize: 1 });
  const record = page.list?.[0];
  paramDetails.value = (record?.details ?? []).map((detail) => ({
    id: detail.id!,
    paramCode: detail.paramCode,
    paramName: detail.paramName,
    unitMeasureName: detail.unitMeasureName,
    paramValue: detail.paramValue,
  }));
}
function syncParamValues(data: MesProFeedbackApi.Feedback) {
  data.paramValues = paramDetails.value.map((detail) => ({
    detailId: detail.id,
    value: detail.paramValue,
  }));
}
/** 校验必填参数是否填写完整 */
function checkRequiredParams(): boolean {
  const missing = findMissingRequiredParams();
  if (missing.length > 0) {
    message.warning(`必填参数未填写:${missing.join('、')}`);
    return false;
  }
  return true;
}
/** 执行提交(含批次属性) */
@@ -188,6 +186,9 @@
async function handleSubmit() {
  const { valid } = await formApi.validate();
  if (!valid) {
    return;
  }
  if (!checkRequiredParams()) {
    return;
  }
  modalApi.lock();
@@ -326,6 +327,7 @@
      formData.value = undefined;
      subTabsName.value = 'itemConsume';
      originalSnapshot.value = '';
      paramDetails.value = [];
      return;
    }
    // 加载数据
@@ -383,7 +385,8 @@
      <div class="mb-3 font-medium">工艺参数</div>
      <div class="grid grid-cols-2 gap-3">
        <div v-for="detail in paramDetails" :key="detail.id" class="flex items-center gap-2">
          <span class="w-40 text-right text-sm text-gray-600">
          <span class="w-44 text-right text-sm text-gray-600">
            <span v-if="detail.required" class="text-red-500">*&nbsp;</span>
            {{ detail.paramName || detail.paramCode }}{{ detail.unitMeasureName ? `(${detail.unitMeasureName})` : '' }}
          </span>
          <Input v-model:value="detail.paramValue" :disabled="!isEditable" placeholder="请输入参数值" />