liu
2026-09-07 a7dc7b230fcc6abc6ee5a7bfadb90789b03d2ca8
src/views/mes/pro/workorder/modules/form.vue
@@ -127,7 +127,10 @@
    if (!valid || !formData.value?.id) return;
    modalApi.lock();
    try {
      const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
      const data = (await formApi.getValues()) as any;
      if (Array.isArray(data.feedbackRole)) {
        data.feedbackRole = data.feedbackRole.join(',');
      }
      await updateWorkOrder({ ...formData.value, ...data });
      if (tempProcessList.value.length > 0) {
        const processList = tempProcessList.value.map(item => ({
@@ -180,7 +183,10 @@
          if (isEditable.value) {
            const current = JSON.stringify(await formApi.getValues());
            if (current !== originalSnapshot.value) {
              const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
              const data = (await formApi.getValues()) as any;
              if (Array.isArray(data.feedbackRole)) {
                data.feedbackRole = data.feedbackRole.join(',');
              }
              await updateWorkOrder({ ...formData.value, ...data });
              originalSnapshot.value = current;
            }
@@ -242,7 +248,10 @@
      const { valid } = await formApi.validate();
      if (!valid) return;
      modalApi.lock();
      const data = (await formApi.getValues()) as MesProWorkOrderApi.WorkOrder;
      const data = (await formApi.getValues()) as any;
      if (Array.isArray(data.feedbackRole)) {
        data.feedbackRole = data.feedbackRole.join(',');
      }
      try {
        if (formData.value?.id) {
          // 编辑模式
@@ -306,7 +315,11 @@
        modalApi.lock();
        try {
          formData.value = await getWorkOrder(data.id);
          await formApi.setValues(formData.value);
          const formValues: any = { ...formData.value };
          if (formValues.feedbackRole && typeof formValues.feedbackRole === 'string') {
            formValues.feedbackRole = formValues.feedbackRole.split(',');
          }
          await formApi.setValues(formValues);
          currentProductId.value = formData.value.productId;
        } finally {
          modalApi.unlock();
@@ -340,6 +353,9 @@
        <Tabs.TabPane key="process"
                      tab="工序"
                      forceRender>
          <p class="mb-3 text-xs text-gray-400 leading-relaxed">
            新增模式会自动从所选产品的工艺路线带出工序,点击行首手柄可拖拽调整顺序;「关键工序」需重点管控、「质检工序」由质检人员检验、勾选「倒冲」的工序在报工后按投料用量自动扣减物料库存。每道工序可点「新增物料」配置投料明细。
          </p>
          <ProcessList
            ref="processListRef"
            :form-type="formType"
@@ -351,6 +367,9 @@
        </Tabs.TabPane>
        <Tabs.TabPane key="item"
                      tab="物料需求">
          <p class="mb-3 text-xs text-gray-400 leading-relaxed">
            物料需求按各工序「投料明细」×订单数量自动汇总生成,仅供查看;如需调整,请回到「工序」页签维护投料。
          </p>
          <ItemList v-if="formData?.id"
                    :work-order-id="formData.id" />
          <div v-else class="text-gray-400 text-center py-8">
@@ -361,11 +380,15 @@
    </template>
    <template #prepend-footer>
      <div class="flex flex-auto flex-col gap-2">
        <div v-if="canUseAi" class="flex items-center gap-2">
          <PredictMaterial :work-order-id="formData!.id" />
          <PredictDuration :work-order-id="formData!.id" />
          <PredictRisk :work-order-id="formData!.id" />
          <PredictDelivery :work-order-id="formData!.id" />
        <div v-if="canUseAi" class="flex flex-wrap items-center gap-x-2 gap-y-1">
          <span class="text-xs font-semibold text-gray-800 dark:text-gray-100">AI 智能分析</span>
          <div class="flex items-center gap-2">
            <PredictMaterial :work-order-id="formData!.id" />
            <PredictDuration :work-order-id="formData!.id" />
            <PredictRisk :work-order-id="formData!.id" />
            <PredictDelivery :work-order-id="formData!.id" />
          </div>
          <span class="text-xs text-gray-400">基于历史生产数据估算,仅供参考,不参与业务计算</span>
        </div>
        <div v-if="canUseAi && showMainBtn" class="border-t border-gray-200" />
        <div class="flex items-center">