yuansh преди 3 седмици
родител
ревизия
2c9598ec96

+ 12 - 0
src/views/otherCode/suggestedPrice/PurSuggestedPrice.api.ts

@@ -11,6 +11,8 @@ enum Api {
   deleteBatch = '/otherCode/purSuggestedPrice/deleteBatch',
   importExcel = '/otherCode/purSuggestedPrice/importExcel',
   exportXls = '/otherCode/purSuggestedPrice/exportXls',
+  supplierList = '/cuspCode/cuspSupplierProfile/list',
+  materialList = '/baseCode/baseProductArchive/list',
 }
 
 /**
@@ -70,3 +72,13 @@ export const saveOrUpdate = (params, isUpdate) => {
   let url = isUpdate ? Api.edit : Api.save;
   return defHttp.post({ url: url, params }, { isTransformResponse: false });
 }
+
+/**
+ * 供应商下拉
+ */
+export const supplierOption = (params) => defHttp.get({ url: Api.supplierList, params });
+
+/**
+ * 物料下拉
+ */
+export const materialOption = (params) => defHttp.get({ url: Api.materialList, params });

+ 50 - 40
src/views/otherCode/suggestedPrice/PurSuggestedPrice.data.ts

@@ -5,67 +5,77 @@ import { render } from '/@/utils/common/renderUtils';
 import { getWeekMonthQuarterYear } from '/@/utils';
 //列表数据
 export const columns: BasicColumn[] = [
-  {
-    title: '状态',
-    align: "center",
-    dataIndex: 'status_dictText'
-  },
-  {
-    title: '序号',
+ // {
+ //   title: '序号',
+ //   align: "center",
+ //   sorter: true,
+ //   dataIndex: 'serialNumber'
+ // },
+ {
+   title: '年度(annual)',
+   align: "center",
+   dataIndex: 'annual' ,
+      width:"120px",
+ },
+ {
+    title: '标题(title)',
     align: "center",
-    sorter: true,
-    dataIndex: 'serialNumber'
+    dataIndex: 'title',
+      width:"180px",
   },
+  // {
+  //   title: '状态',
+  //   align: "center",
+  //   dataIndex: 'status_dictText'
+  // },
+  
   {
-    title: '物料编码',
+    title: '物料编码(Material Code)',
     align: "center",
-    dataIndex: 'materialCode'
+    dataIndex: 'materialCode',
+      width:"180px",
   },
   {
-    title: '物料名称',
+    title: '物料名称(Material Name)',
     align: "center",
-    dataIndex: 'materialName'
+    dataIndex: 'materialName',
+      width:"180px",
   },
   {
-    title: '备件号',
+    title: '备件号(SparePartNumber)',
     align: "center",
-    dataIndex: 'sparePartNumber'
+    dataIndex: 'sparePartNumber',
+      width:"180px",
   },
   {
-    title: '价格',
+    title: '价格(Price)',
     align: "center",
     dataIndex: 'price'
   },
+  
   {
-    title: '年度',
-    align: "center",
-    dataIndex: 'annual'
-  },
-  {
-    title: '供应商名称',
-    align: "center",
-    dataIndex: 'supplierName'
-  },
-  {
-    title: '标题',
-    align: "center",
-    dataIndex: 'title'
-  },
-  {
-    title: '单位',
-    align: "center",
-    dataIndex: 'unit'
-  },
-  {
-    title: '版本号',
+    title: '供应商名称(Supplier)',
     align: "center",
-    dataIndex: 'versionNumber'
+    dataIndex: 'supplierName',
+      width:"180px",
   },
+  
   {
-    title: '编码',
+    title: '单位(Unit)',
     align: "center",
-    dataIndex: 'code'
+    dataIndex: 'unit',
+      width:"150px",
   },
+  // {
+  //   title: '版本号',
+  //   align: "center",
+  //   dataIndex: 'versionNumber'
+  // },
+  // {
+  //   title: '编码',
+  //   align: "center",
+  //   dataIndex: 'code'
+  // },
 ];
 
 // 高级查询数据

+ 226 - 38
src/views/otherCode/suggestedPrice/PurSuggestedPriceList.vue

@@ -2,55 +2,66 @@
   <div class="p-2">
     <!--查询区域-->
     <div class="jeecg-basic-table-form-container">
-      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="{ style: 'width: 160px' }" :wrapper-col="wrapperCol">
         <a-row :gutter="24">
-          <a-col :lg="6">
-            <a-form-item name="status">
-              <template #label><span title="状态">状态</span></template>
-              <j-select-multiple placeholder="请选择状态" v-model:value="queryParam.status" dictCode="yes_or_no" allow-clear />
+          
+          <a-col :lg="8">
+            <a-form-item name="annual">
+              <template #label><span title="年度">年度(Annual)</span></template>
+              <a-date-picker
+                v-model:value="queryParam.annual"
+                picker="year"
+                value-format="YYYY"
+                format="YYYY"
+                style="width: 100%"
+                placeholder="请选择年度"
+                allow-clear
+              />
             </a-form-item>
           </a-col>
-          <a-col :lg="6">
+          <a-col :lg="8">
+            <a-form-item name="supplierId">
+              <template #label><span title="供应商">供应商(Supplier)</span></template>
+              <a-select
+                v-model:value="queryParam.supplierId"
+                :options="supplierOptions"
+                show-search
+                optionFilterProp="label"
+                placeholder="请选择供应商"
+                allow-clear
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :lg="8">
+            <a-form-item name="title">
+              <template #label><span title="标题">标题(Title)</span></template>
+              <a-input placeholder="请输入标题" v-model:value="queryParam.title" allow-clear ></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :lg="8">
             <a-form-item name="materialCode">
-              <template #label><span title="物料编码">物料编码</span></template>
+              <template #label><span title="物料编码">物料编码(Material Code)</span></template>
               <a-input placeholder="请输入物料编码" v-model:value="queryParam.materialCode" allow-clear ></a-input>
             </a-form-item>
           </a-col>
-          <template v-if="toggleSearchStatus">
-            <a-col :lg="6">
+          
+            <a-col :lg="8">
               <a-form-item name="materialName">
-                <template #label><span title="物料名称">物料名称</span></template>
+                <template #label><span title="物料名称">物料名称(Material Name)</span></template>
                 <a-input placeholder="请输入物料名称" v-model:value="queryParam.materialName" allow-clear ></a-input>
               </a-form-item>
             </a-col>
-            <a-col :lg="6">
+            <a-col :lg="8">
               <a-form-item name="sparePartNumber">
-                <template #label><span title="备件号">备件号</span></template>
+                <template #label><span title="备件号">备件号(SparePartNumber)</span></template>
                 <a-input placeholder="请输入备件号" v-model:value="queryParam.sparePartNumber" allow-clear ></a-input>
               </a-form-item>
             </a-col>
-            <a-col :lg="6">
-              <a-form-item name="annual">
-                <template #label><span title="年度">年度</span></template>
-                <a-input placeholder="请输入年度" v-model:value="queryParam.annual" allow-clear ></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :lg="6">
-              <a-form-item name="supplierName">
-                <template #label><span title="供应商名称">供应商名</span></template>
-                <a-input placeholder="请输入供应商名称" v-model:value="queryParam.supplierName" allow-clear ></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :lg="6">
-              <a-form-item name="title">
-                <template #label><span title="标题">标题</span></template>
-                <a-input placeholder="请输入标题" v-model:value="queryParam.title" allow-clear ></a-input>
-              </a-form-item>
-            </a-col>
+			<template v-if="toggleSearchStatus">
           </template>
           <a-col :xl="6" :lg="7" :md="8" :sm="24">
             <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
-              <a-col :lg="6">
+              <a-col :lg="8">
                 <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
                 <a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
                 <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
@@ -69,7 +80,7 @@
       <template #tableTitle>
         <a-button type="primary" v-auth="'otherCode:pur_suggested_price:add'"  @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
         <a-button  type="primary" v-auth="'otherCode:pur_suggested_price:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
-        <j-upload-button  type="primary" v-auth="'otherCode:pur_suggested_price:importExcel'"  preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
+        <a-button type="primary" v-auth="'otherCode:pur_suggested_price:importExcel'" preIcon="ant-design:import-outlined" @click="openImportModal">导入</a-button>
         <a-dropdown v-if="selectedRowKeys.length > 0">
           <template #overlay>
             <a-menu>
@@ -95,11 +106,59 @@
     </BasicTable>
     <!-- 表单区域 -->
     <PurSuggestedPriceModal ref="registerModal" @success="handleSuccess"></PurSuggestedPriceModal>
+    <a-modal
+      title="导入供应商指导价"
+      :visible="importVisible"
+      :confirm-loading="importSubmitting"
+      @ok="submitImport"
+      @cancel="closeImportModal"
+      destroyOnClose
+    > 
+	<a-form-item label="年度" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }" required>
+          <a-date-picker
+            v-model:value="importForm.annual"
+            picker="year"
+            value-format="YYYY"
+            format="YYYY"
+            style="width: 100%"
+            placeholder="请选择年度"
+          />
+        </a-form-item>
+      <a-form :model="importForm" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
+        <a-form-item label="供应商" required>
+          <a-select
+            v-model:value="importForm.supplierId"
+            :options="supplierOptions"
+            show-search
+            optionFilterProp="label"
+            placeholder="请选择供应商"
+            allow-clear
+          />
+        </a-form-item>
+        <a-form-item label="单位" required :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
+          <JDictSelectTag v-model:value="importForm.unit" dictCode="currency" placeholder="请选择单位" />
+        </a-form-item>
+       
+        <a-form-item label="是否覆盖" required>
+          <a-switch
+            :checked="importForm.overwrite === 1"
+            checked-children="是"
+            un-checked-children="否"
+            @change="(checked) => (importForm.overwrite = checked ? 1 : 0)"
+          />
+        </a-form-item> 
+        <a-form-item label="导入文件" required>
+          <a-upload :beforeUpload="beforeImportFile" :fileList="importFileList" :maxCount="1" @remove="removeImportFile">
+            <a-button preIcon="ant-design:upload-outlined">选择文件</a-button>
+          </a-upload>
+        </a-form-item>
+      </a-form>
+    </a-modal>
   </div>
 </template>
 
 <script lang="ts" name="otherCode-purSuggestedPrice" setup>
-  import { ref, reactive } from 'vue';
+  import { ref, reactive, onMounted } from 'vue';
   import { BasicTable, useTable, TableAction } from '/@/components/Table';
   import { useListPage } from '/@/hooks/system/useListPage';
   import { columns, superQuerySchema } from './PurSuggestedPrice.data';
@@ -109,6 +168,9 @@
   import { useUserStore } from '/@/store/modules/user';
   import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
   import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { defHttp } from '/@/utils/http/axios';
+  import { useGlobSetting } from '/@/hooks/setting';
 
   const formRef = ref();
   const queryParam = reactive<any>({});
@@ -116,7 +178,9 @@
   const registerModal = ref();
   const userStore = useUserStore();
   //注册table数据
-  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
+  const { createMessage, createWarningModal } = useMessage();
+  const glob = useGlobSetting();
+  const { prefixCls, tableContext, onExportXls } = useListPage({
     tableProps: {
       title: '供应商指导价',
       api: list,
@@ -124,17 +188,32 @@
       canResize:false,
       useSearchForm: false,
       actionColumn: {
-        width: 120,
+        width: 130,
         fixed: 'right',
       },
       beforeFetch: async (params) => {
-        return Object.assign(params, queryParam);
+        // 覆盖 useListPage 默认 createTime 倒序
+        delete params.column;
+        delete params.order;
+        const query = { ...queryParam };
+        if (query.supplierId) {
+          query.supplier = query.supplierId;
+          delete query.supplierId;
+        }
+        return Object.assign(params, query);
       },
     },
     exportConfig: {
       name: "供应商指导价",
       url: getExportUrl,
-      params: queryParam,
+      params: () => {
+        const query = { ...queryParam };
+        if (query.supplierId) {
+          query.supplier = query.supplierId;
+          delete query.supplierId;
+        }
+        return query;
+      },
     },
 	  importConfig: {
 	    url: getImportUrl,
@@ -152,10 +231,25 @@
     xs: 24,
     sm: 20,
   });
+  const importVisible = ref(false);
+  const importSubmitting = ref(false);
+  const importFileList = ref<any[]>([]);
+  const supplierOptions = ref<any[]>([]);
+  const importForm = reactive<any>({
+    supplierId: '',
+    unit: '',
+    annual: '',
+    overwrite: 0,
+  });
 
   // 高级查询配置
   const superQueryConfig = reactive(superQuerySchema);
 
+  // 加载供应商选项
+  onMounted(() => {
+    loadSupplierOptions();
+  });
+
   /**
    * 高级查询事件
    */
@@ -260,7 +354,101 @@
     //刷新数据
     reload();
   }
-  
+
+  function openImportModal() {
+    importVisible.value = true;
+    loadSupplierOptions();
+  }
+
+  function closeImportModal() {
+    importVisible.value = false;
+    importSubmitting.value = false;
+    importFileList.value = [];
+    importForm.supplierId = '';
+    importForm.unit = '';
+    importForm.annual = '';
+    importForm.overwrite = 0;
+  }
+
+  function beforeImportFile(file) {
+    importFileList.value = [file];
+    return false;
+  }
+
+  function removeImportFile() {
+    importFileList.value = [];
+  }
+
+  async function loadSupplierOptions() {
+    if (supplierOptions.value.length) {
+      return;
+    }
+    const res: any = await defHttp.get(
+      { url: '/cuspCode/cuspSupplierProfile/list', params: { pageSize: -1, status: 1 } },
+      { isTransformResponse: false }
+    );
+    const records = res?.result?.records || [];
+    supplierOptions.value = records.map((item) => ({
+      label: item.name || item.supplierName,
+      value: item.id,
+    }));
+  }
+
+  async function submitImport() {
+    if (!importForm.supplierId) {
+      createMessage.warning('请选择供应商');
+      return;
+    }
+    if (!importForm.unit) {
+      createMessage.warning('请选择单位');
+      return;
+    }
+    if (!importForm.annual) {
+      createMessage.warning('请填写年度');
+      return;
+    }
+    if (!importFileList.value.length) {
+      createMessage.warning('请选择导入文件');
+      return;
+    }
+    importSubmitting.value = true;
+    try {
+      const file = importFileList.value[0];
+      const fileInfo: any = await defHttp.uploadFile(
+        { url: getImportUrl },
+        {
+          file,
+          data: {
+            supplier: importForm.supplierId,
+            unit: importForm.unit,
+            annual: importForm.annual,
+            overwrite: importForm.overwrite,
+          },
+        },
+        { isReturnResponse: true }
+      );
+      if (fileInfo?.code === 201) {
+        const {
+          message,
+          result: { msg, fileUrl, fileName },
+        } = fileInfo;
+        const href = glob.uploadUrl + fileUrl;
+        createWarningModal({
+          title: message,
+          centered: false,
+          content: `<div><span>${msg}</span><br/><span>具体详情请<a href=${href} download=${fileName}> 点击下载 </a></span></div>`,
+        });
+      } else if (fileInfo?.code === 500 || fileInfo?.code === 510) {
+        createMessage.error(fileInfo?.message || `${file.name} 导入失败`);
+      } else {
+        createMessage.success(fileInfo?.message || `${file.name} 文件上传成功`);
+      }
+      handleSuccess();
+      closeImportModal();
+    } finally {
+      importSubmitting.value = false;
+    }
+  }
 
 
 

+ 110 - 27
src/views/otherCode/suggestedPrice/components/PurSuggestedPriceForm.vue

@@ -4,73 +4,104 @@
       <template #detail>
         <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="PurSuggestedPriceForm">
           <a-row>
-						<a-col :span="24">
+						<!-- <a-col :span="24">
 							<a-form-item label="状态" v-bind="validateInfos.status" id="PurSuggestedPriceForm-status" name="status">
 								<j-dict-select-tag v-model:value="formData.status" dictCode="yes_or_no" placeholder="请选择状态"  allow-clear />
 							</a-form-item>
-						</a-col>
-						<a-col :span="24">
+						</a-col> -->
+						<!-- <a-col :span="24">
 							<a-form-item label="序号" v-bind="validateInfos.serialNumber" id="PurSuggestedPriceForm-serialNumber" name="serialNumber">
 								<a-input-number v-model:value="formData.serialNumber" placeholder="请输入序号" style="width: 100%" />
 							</a-form-item>
-						</a-col>
+						</a-col> -->
 						<a-col :span="24">
-							<a-form-item label="物料编码" v-bind="validateInfos.materialCode" id="PurSuggestedPriceForm-materialCode" name="materialCode">
-								<a-input v-model:value="formData.materialCode" placeholder="请输入物料编码"  allow-clear ></a-input>
+							<a-form-item label="年度(annual)" v-bind="validateInfos.annual" id="PurSuggestedPriceForm-annual" name="annual">
+								<a-date-picker
+                  v-model:value="formData.annual"
+                  picker="year"
+                  value-format="YYYY"
+                  format="YYYY"
+                  style="width: 100%"
+                  placeholder="请选择年度(annual)"
+                />
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="物料名称" v-bind="validateInfos.materialName" id="PurSuggestedPriceForm-materialName" name="materialName">
-								<a-input v-model:value="formData.materialName" placeholder="请输入物料名称"  allow-clear ></a-input>
+							<a-form-item label="标题(title)" v-bind="validateInfos.title" id="PurSuggestedPriceForm-title" name="title">
+								<a-input v-model:value="formData.title" placeholder="请输入标题(title)"  allow-clear ></a-input>
 							</a-form-item>
 						</a-col>
+           <!-- <a-col :span="24"> -->
+             <!-- <a-form-item label="物料" v-bind="validateInfos.materialId" id="PurSuggestedPriceForm-materialId" name="materialId">
+                <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectProductList"
+                	>
+                	选择产品(select product)</a-button>
+					
+              </a-form-item> -->
+			<!--  <a-form-item label="物料编码" v-bind="validateInfos.materialId" id="PurSuggestedPriceForm-materialId" name="materialId">
+			  	<a-input v-model:value="formData.materialId" @click="selectProductList" placeholder="点击选择" disabled allow-clear ></a-input>
+			  </a-form-item>
+            </a-col> -->
 						<a-col :span="24">
-							<a-form-item label="备件号" v-bind="validateInfos.sparePartNumber" id="PurSuggestedPriceForm-sparePartNumber" name="sparePartNumber">
-								<a-input v-model:value="formData.sparePartNumber" placeholder="请输入备件号"  allow-clear ></a-input>
+							<a-form-item label="物料编码(Material Code)" v-bind="validateInfos.materialCode" id="PurSuggestedPriceForm-materialCode" name="materialCode">
+								<a-input v-model:value="formData.materialCode" readOnly @click="selectProductList" placeholder="自动带出"  allow-clear ></a-input>
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="价格" v-bind="validateInfos.price" id="PurSuggestedPriceForm-price" name="price">
-								<a-input-number v-model:value="formData.price" placeholder="请输入价格" style="width: 100%" />
+							<a-form-item label="物料名称(Material Name)" v-bind="validateInfos.materialName" id="PurSuggestedPriceForm-materialName" name="materialName">
+								<a-input v-model:value="formData.materialName" placeholder="自动带出" disabled allow-clear ></a-input>
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="年度" v-bind="validateInfos.annual" id="PurSuggestedPriceForm-annual" name="annual">
-								<a-input v-model:value="formData.annual" placeholder="请输入年度"  allow-clear ></a-input>
+							<a-form-item label="备件号(SparePartNumber)" v-bind="validateInfos.sparePartNumber" id="PurSuggestedPriceForm-sparePartNumber" name="sparePartNumber">
+								<a-input v-model:value="formData.sparePartNumber" placeholder="请输入备件号"  allow-clear ></a-input>
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="供应商名称" v-bind="validateInfos.supplierName" id="PurSuggestedPriceForm-supplierName" name="supplierName">
-								<a-input v-model:value="formData.supplierName" placeholder="请输入供应商名称"  allow-clear ></a-input>
+							<a-form-item label="价格(Price)" v-bind="validateInfos.price" id="PurSuggestedPriceForm-price" name="price">
+								<a-input-number v-model:value="formData.price" placeholder="请输入价格" style="width: 100%" />
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="标题" v-bind="validateInfos.title" id="PurSuggestedPriceForm-title" name="title">
-								<a-input v-model:value="formData.title" placeholder="请输入标题"  allow-clear ></a-input>
+							<a-form-item label="供应商(Supplier)" v-bind="validateInfos.supplier" id="PurSuggestedPriceForm-supplier" name="supplier">
+								<ApiSelect
+                  :api="supplierOption"
+                  showSearch
+                  v-model:value="formData.supplier"
+                  optionFilterProp="label"
+                  resultField="records"
+                  labelField="name"
+                  valueField="id"
+                  :params="{ pageSize: -1, status: 1 }"
+                  @change="handleSupplierChange"
+                  placeholder="请选择供应商(Supplier)"
+                />
 							</a-form-item>
 						</a-col>
 						<a-col :span="24">
-							<a-form-item label="单位" v-bind="validateInfos.unit" id="PurSuggestedPriceForm-unit" name="unit">
-								<a-input v-model:value="formData.unit" placeholder="请输入单位"  allow-clear ></a-input>
+							<a-form-item label="单位(Unit)" v-bind="validateInfos.unit" id="PurSuggestedPriceForm-unit" name="unit">
+								<j-dict-select-tag v-model:value="formData.unit" dictCode="currency" placeholder="请选择单位" allow-clear />
 							</a-form-item>
 						</a-col>
           </a-row>
         </a-form>
+		<SelectPrpductModal ref="SelectPrpductModalRef" @select-product="addProduct" />
       </template>
     </JFormContainer>
   </a-spin>
 </template>
 
 <script lang="ts" setup>
-  import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
-  import { defHttp } from '/@/utils/http/axios';
+  import { ref, reactive, nextTick, computed } from 'vue';
   import { useMessage } from '/@/hooks/web/useMessage';
   import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
   import { getValueType } from '/@/utils';
-  import { saveOrUpdate } from '../PurSuggestedPrice.api';
+  import { saveOrUpdate, supplierOption, materialOption } from '../PurSuggestedPrice.api';
   import { Form } from 'ant-design-vue';
   import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
   import { duplicateValidate } from '/@/utils/helper/validator'
+  import { ApiSelect } from '/@/components/Form/index';
+	import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
   const props = defineProps({
     formDisabled: { type: Boolean, default: false },
     formData: { type: Object, default: () => ({})},
@@ -83,11 +114,13 @@
     id: '',
     status: 1,
     serialNumber: undefined,
+    materialId: '',
     materialCode: '',   
     materialName: '',   
     sparePartNumber: '',   
     price: undefined,
     annual: '',   
+    supplier: '',   
     supplierName: '',   
     title: '',   
     unit: '',   
@@ -96,12 +129,32 @@
   const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
   const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
   const confirmLoading = ref<boolean>(false);
+  
+  const SelectPrpductModalRef = ref();
+			function selectProductList() {
+				SelectPrpductModalRef.value.getTable();
+			}
+			
+			function addProduct(data) {
+				if(data.length > 1){
+					 createMessage.warning('产品信息不能多选');
+					 return
+				}
+				data.map((item) => {
+									formData.materialId = item.id;
+									formData.materialCode = item.code;
+									formData.materialName = item.chineseName;
+									formData.sparePartNumber = item.partno;
+								});
+			}
   //表单验证
   const validatorRules = reactive({
-    materialName: [{ required: true, message: '请输入物料名称!'}, { validator: materialNameDuplicatevalidate }],
+    materialId: [{ required: true, message: '请选择物料!'}],
+    materialCode: [{ required: true, message: '请选择物料!'}],
+    // materialName: [{ required: true, message: '请选择物料!'}, { validator: materialNameDuplicatevalidate }],
     price: [{ required: true, message: '请输入价格!'}, { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},],
-    annual: [{ required: true, message: '请输入年度!'},],
-    supplierName: [{ required: true, message: '请输入供应商名称!'},],
+    annual: [{ required: true, message: '请选择年度!'},],
+    supplier: [{ required: true, message: '请选择供应商!'},],
     title: [{ required: true, message: '请输入标题!'},],
     unit: [{ required: true, message: '请输入单位!'},],
   });
@@ -151,7 +204,8 @@
     try {
       // 触发表单验证
       await validate();
-    } catch ({ errorFields }) {
+    } catch (err: any) {
+      const errorFields = err?.errorFields;
       if (errorFields) {
         const firstField = errorFields[0];
         if (firstField) {
@@ -196,10 +250,39 @@
   async function materialNameDuplicatevalidate(_r, value) {
     return duplicateValidate('pur_suggested_price', 'material_name', value, formData.id || '')
   }
+
+  const materialOptionMap = ref<Record<string, any>>({});
+  const supplierOptionMap = ref<Record<string, any>>({});
+
+  async function handleMaterialChange(value, option) {
+    let selected = option || materialOptionMap.value[value] || {};
+    if ((!selected || !selected.code) && value) {
+      const res: any = await materialOption({ id: value, pageSize: 1 });
+      selected = res?.records?.[0] || res?.result?.records?.[0] || selected;
+    }
+    materialOptionMap.value[value] = selected || {};
+    formData.materialId = value || '';
+    formData.materialCode = selected.code || '';
+    formData.materialName = selected.chineseName || selected.materialName || '';
+    formData.sparePartNumber = selected.partno || selected.sparePartNumber || formData.sparePartNumber;
+  }
+
+  async function handleSupplierChange(value, option) {
+    let selected = option || supplierOptionMap.value[value] || {};
+    if ((!selected || !selected.name) && value) {
+      const res: any = await supplierOption({ id: value, pageSize: 1 });
+      selected = res?.records?.[0] || res?.result?.records?.[0] || selected;
+    }
+    supplierOptionMap.value[value] = selected || {};
+    formData.supplier = value || '';
+    formData.supplierName = selected.name || selected.supplierName || '';
+  }
   defineExpose({
     add,
     edit,
     submitForm,
+	addProduct,
+	SelectPrpductModalRef
   });
 </script>