Lijingyang 1 月之前
父節點
當前提交
ef2d68b415

+ 15 - 2
src/api/customer/info/index.ts

@@ -51,6 +51,18 @@ export const updateInfo = (data: InfoForm) => {
   });
 };
 
+/**
+ * SCM修改供应商信息(不走审核)
+ * @param data
+ */
+export const scmEditInfo = (data: InfoForm) => {
+  return request({
+    url: '/customer/info/scm',
+    method: 'put',
+    data: data
+  });
+};
+
 /**
  * 删除供应商信息
  * @param id
@@ -274,10 +286,11 @@ export const getSupplierAddressById = (supplierId: string | number) => {
 /**
  * 获取公司列表
  */
-export const getCompanyList = () => {
+export const getCompanyList = (params?: any) => {
   return request({
     url: '/system/company/list',
-    method: 'get'
+    method: 'get',
+    params
   });
 };
 

+ 14 - 4
src/api/supplier/area/types.ts

@@ -9,6 +9,11 @@ export interface AreaVO {
    */
   supplierId: string | number;
 
+  /**
+   * 地区id
+   */
+  areaId?: string | number;
+
   /**
    * 区域编码(如国标行政区域编码/自定义区域编码)
    */
@@ -20,9 +25,9 @@ export interface AreaVO {
   areaName: string;
 
   /**
-   * 上级区域编码(如省级编码对应市级的上级编码,顶级区域为0)
+   * 上级区域ID(顶级区域为0)
    */
-  parentCode: string;
+  parentId?: string | number;
 
   /**
    * 区域层级(1省/直辖市 2市 3区县 4街道/镇)
@@ -46,6 +51,11 @@ export interface AreaQuery extends PageQuery {
    */
   supplierId?: string | number;
 
+  /**
+   * 地区id
+   */
+  areaId?: string | number;
+
   /**
    * 区域编码(如国标行政区域编码/自定义区域编码)
    */
@@ -57,9 +67,9 @@ export interface AreaQuery extends PageQuery {
   areaName?: string;
 
   /**
-   * 上级区域编码(如省级编码对应市级的上级编码,顶级区域为0)
+   * 上级区域ID(顶级区域为0)
    */
-  parentCode?: string;
+  parentId?: string | number;
 
   /**
    * 区域层级(1省/直辖市 2市 3区县 4街道/镇)

+ 12 - 0
src/api/supplier/info/index.ts

@@ -51,6 +51,18 @@ export const updateInfo = (data: InfoForm) => {
   });
 };
 
+/**
+ * SCM修改供应商信息(不走审核)
+ * @param data
+ */
+export const scmEditInfo = (data: InfoForm) => {
+  return request({
+    url: '/supplierInfo/scm',
+    method: 'put',
+    data: data
+  });
+};
+
 /**
  * 删除供应商信息
  * @param id

+ 1 - 0
src/api/supplier/supplierauthorize/types.ts

@@ -1,4 +1,5 @@
 export interface SupplierauthorizeVO {
+  id?: string | number;
   /**
    * 供应商编号
    */

+ 8 - 1
src/api/system/addressarea/index.ts

@@ -26,12 +26,19 @@ export const listAddressarea = (query?: AddressareaQuery): AxiosPromise<Addressa
 
 export const chinaAreaList = (query?: AddressareaQuery): AxiosPromise<AddressareaVO[]> => {
   return request({
-    url: '/system/addressarea/getChinaList',
+    url: '/system/addressarea/getchina/area',
     method: 'get',
     params: query
   });
 };
 
+export const getChinaArea = (): AxiosPromise<AddressareaVO[]> => {
+  return request({
+    url: '/system/addressarea/getchina/area',
+    method: 'get'
+  });
+};
+
 /**
  * 查询地区列表详细
  * @param id

+ 11 - 3
src/components/RegionCascader/index.vue

@@ -89,7 +89,6 @@
 
 <script setup lang="ts">
 import { ref, computed, watch } from 'vue';
-import { regionData } from 'element-china-area-data';
 import { ArrowRight } from '@element-plus/icons-vue';
 
 interface RegionData {
@@ -101,6 +100,7 @@ interface RegionData {
 interface Props {
   modelValue?: string[]; // 选中的区域代码数组
   multiple?: boolean; // 是否多选模式,默认 true
+  options?: RegionData[]; // 省市区数据源(建议由后端接口提供)
 }
 
 interface Emits {
@@ -109,13 +109,14 @@ interface Emits {
 
 const props = withDefaults(defineProps<Props>(), {
   modelValue: () => [],
-  multiple: true
+  multiple: true,
+  options: () => []
 });
 
 const emit = defineEmits<Emits>();
 
 // 所有省份
-const provinces = ref<RegionData[]>(regionData as RegionData[]);
+const provinces = ref<RegionData[]>(props.options || []);
 
 // 当前选中的省份
 const currentProvince = ref<RegionData | null>(null);
@@ -141,6 +142,13 @@ watch(() => props.modelValue, (newVal) => {
   selectedRegions.value = newVal || [];
 }, { immediate: true });
 
+watch(() => props.options, (newVal) => {
+  provinces.value = (newVal || []) as RegionData[];
+  // 切换数据源后重置当前选中路径
+  currentProvince.value = null;
+  currentCity.value = null;
+}, { immediate: true });
+
 /** 判断省份是否被选中(显示箭头高亮) */
 const isProvinceSelected = (provinceCode: string) => {
   return currentProvince.value?.value === provinceCode;

File diff suppressed because it is too large
+ 140 - 760
src/views/customer/info/detail.vue


+ 53 - 17
src/views/supplier/contact/index.vue

@@ -31,31 +31,32 @@
       </template>
 
       <el-table v-loading="loading" border :data="contactList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="主键ID" align="center" prop="id" v-if="false" />
-        <el-table-column label="供应商编号" align="center" prop="supplierNo" />
-        <el-table-column label="所属供应商" align="center" prop="supplierName" />
-        <el-table-column label="用户ID" align="center" prop="userNo" />
-        <el-table-column label="员工姓名" align="center" prop="userName" />
-        <el-table-column label="手机号" align="center" prop="phone" />
-        <el-table-column label="角色" align="center" prop="roleNo" />
-        <el-table-column label="部门" align="center" prop="departmentNo" />
-        <el-table-column label="职位" align="center" prop="position" />
-        <el-table-column label="主要联系人" align="center" prop="isPrimaryContact">
+        <el-table-column label="供应商编号" align="center" prop="supplierNo" min-width="120" />
+        <el-table-column label="所属供应商" align="left" prop="supplierName" min-width="260" />
+        <el-table-column label="用户ID" align="center" prop="userNo" min-width="110" />
+        <el-table-column label="员工姓名" align="center" prop="userName" min-width="110" />
+        <el-table-column label="手机号" align="center" prop="phone" min-width="140" />
+        <el-table-column label="角色" align="center" prop="roleNo" min-width="90" />
+        <el-table-column label="部门" align="center" prop="departmentNo" min-width="90" />
+        <el-table-column label="职位" align="center" prop="position" min-width="90" />
+        <el-table-column label="主要联系人" align="center" prop="isPrimaryContact" min-width="120">
           <template #default="scope">
-            <dict-tag :options="is_primary_contack" :value="scope.row.isPrimaryContact"/>
+            <span :style="String(scope.row.isPrimaryContact) === '0' ? { color: '#409EFF' } : undefined">
+              {{ String(scope.row.isPrimaryContact) === '0' ? '是' : '否' }}
+            </span>
           </template>
         </el-table-column>
-        <el-table-column label="允许登录供应商端" align="center" prop="isRegister">
+        <el-table-column label="允许登录供应商端" align="center" prop="isRegister" min-width="160">
           <template #default="scope">
-            <dict-tag :options="is_register" :value="scope.row.isRegister"/>
+            <span :style="String(scope.row.isRegister) === '0' ? { color: '#409EFF' } : undefined">
+              {{ String(scope.row.isRegister) === '0' ? '是' : '否' }}
+            </span>
           </template>
         </el-table-column>
-        <el-table-column label="状态" align="center" prop="status" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
           <template #default="scope">
             <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['supplier:contact:edit']">编辑</el-button>
-            <br />
             <el-button link type="primary" @click="handleResetPassword(scope.row)">重置密码</el-button>
           </template>
         </el-table-column>
@@ -284,7 +285,42 @@ const data = reactive<PageData<ContactForm, ContactQuery>>({
     ],
     phone: [
       { required: true, message: '请输入电话', trigger: 'blur' },
-      { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const v = String(value || '').trim();
+          const mobile = /^1[3-9]\d{9}$/;
+          const landline = /^0\d{2,3}-?\d{7,8}(-\d{1,6})?$/;
+          if (!v) {
+            callback(new Error('请输入电话'));
+            return;
+          }
+          if (!mobile.test(v) && !landline.test(v)) {
+            callback(new Error('请输入正确的手机号或座机号'));
+            return;
+          }
+          callback();
+        },
+        trigger: 'blur'
+      }
+    ],
+    officePhone: [
+      {
+        validator: (rule: any, value: any, callback: any) => {
+          const v = String(value || '').trim();
+          const mobile = /^1[3-9]\d{9}$/;
+          const landline = /^0\d{2,3}-?\d{7,8}(-\d{1,6})?$/;
+          if (!v) {
+            callback();
+            return;
+          }
+          if (!mobile.test(v) && !landline.test(v)) {
+            callback(new Error('请输入正确的手机号或座机号'));
+            return;
+          }
+          callback();
+        },
+        trigger: 'blur'
+      }
     ],
     isPrimaryContact: [
       { required: true, message: '请选择是否为主要联系人', trigger: 'change' }

+ 22 - 1
src/views/supplier/contract/add.vue

@@ -208,6 +208,23 @@ const rules = {
   ]
 };
 
+const wanToYuanString = (value: unknown): string => {
+  const raw = String(value ?? '').trim();
+  if (!raw) return '';
+
+  const normalized = raw.replace(/,/g, '');
+  const match = normalized.match(/^(-?)(\d+)(?:\.(\d+))?$/);
+  if (!match) return '';
+
+  const sign = match[1] ? '-' : '';
+  const intPart = match[2] || '0';
+  const fracRaw = match[3] || '';
+  const fracPart = (fracRaw + '0000').slice(0, 4);
+
+  const base = BigInt(intPart) * 10000n + BigInt(fracPart);
+  return sign ? '-' + base.toString() : base.toString();
+};
+
 /** 返回上一页 */
 const goBack = () => {
   router.back();
@@ -258,7 +275,11 @@ const handleSubmit = async () => {
   formRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       try {
-        await addContract(form.value);
+        const payload = {
+          ...form.value,
+          contractAmount: wanToYuanString(form.value.contractAmount)
+        };
+        await addContract(payload);
         ElMessage.success('创建成功');
         // 返回上一页
         router.back();

+ 151 - 80
src/views/supplier/contract/detail.vue

@@ -8,54 +8,62 @@
 
     <!-- 搜索表单 -->
     <el-card shadow="hover" class="search-card">
-      <el-form :model="queryParams" :inline="true">
-        <el-form-item label="合同编号">
-          <el-input v-model="queryParams.contractNo" placeholder="请输入合同编号" clearable style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="合同名称">
-          <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="合同类型">
-          <el-select v-model="queryParams.contractType" placeholder="请选择" clearable style="width: 150px;">
-            <el-option 
-              v-for="item in contractTypeDict" 
-              :key="item.dictValue" 
-              :label="item.dictLabel" 
-              :value="item.dictValue" 
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="开始时间">
-          <el-date-picker
-            v-model="queryParams.contractStartTime"
-            type="date"
-            placeholder="请选择"
-            style="width: 150px;"
-          />
-        </el-form-item>
-        <el-form-item label="结束时间">
-          <el-date-picker
-            v-model="queryParams.contractEndTime"
-            type="date"
-            placeholder="请选择"
-            style="width: 150px;"
-          />
-        </el-form-item>
-        <el-form-item label="合同状态">
-          <el-select v-model="queryParams.contractStatus" placeholder="请选择" clearable style="width: 150px;">
-            <el-option 
-              v-for="item in contractStatusDict" 
-              :key="item.dictValue" 
-              :label="item.dictLabel" 
-              :value="item.dictValue" 
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
-          <el-button icon="Refresh" @click="handleReset">重置</el-button>
-          <el-button type="primary" @click="handleAdd">创建合同</el-button>
-        </el-form-item>
+      <el-form :model="queryParams" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="合同编号">
+              <el-input v-model="queryParams.contractNo" placeholder="请输入合同编号" clearable style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="合同名称">
+              <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="合同类型">
+              <el-select v-model="queryParams.contractType" placeholder="请选择" clearable style="width: 100%;">
+                <el-option 
+                  v-for="item in contractTypeDict" 
+                  :key="item.dictValue" 
+                  :label="item.dictLabel" 
+                  :value="item.dictValue" 
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="合同状态">
+              <el-select v-model="queryParams.contractStatus" placeholder="请选择" clearable style="width: 100%;">
+                <el-option 
+                  v-for="item in contractStatusDict" 
+                  :key="item.dictValue" 
+                  :label="item.dictLabel" 
+                  :value="item.dictValue" 
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="开始时间">
+              <el-date-picker v-model="queryParams.contractStartTime" type="date" placeholder="请选择" style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="结束时间">
+              <el-date-picker v-model="queryParams.contractEndTime" type="date" placeholder="请选择" style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label-width="0px">
+              <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
+              <el-button icon="Refresh" @click="handleReset">重置</el-button>
+              <el-button type="primary" icon="Plus" @click="handleAdd">创建合同</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
     </el-card>
 
@@ -73,7 +81,7 @@
         </el-table-column>
         <el-table-column prop="contractAmount" label="金额(万)" align="center">
           <template #default="scope">
-            <span>{{ scope.row.contractAmount || '-' }}</span>
+            <span>{{ formatWanAmount(scope.row.contractAmount) }}</span>
           </template>
         </el-table-column>
         <el-table-column prop="contractStartTime" label="起始时间" align="center">
@@ -276,8 +284,16 @@
 
       <template #footer>
         <div class="dialog-footer">
-          <el-button @click="contractDialogVisible = false">取消</el-button>
-          <el-button v-if="!contractDialogReadonly" type="primary" @click="handleContractSubmit" :loading="contractSubmitLoading">确定</el-button>
+          <el-button
+            v-if="contractDialogReadonly"
+            type="primary"
+            @click="handleApprove"
+            :loading="approveLoading"
+          >审核通过</el-button>
+          <template v-else>
+            <el-button @click="contractDialogVisible = false">取消</el-button>
+            <el-button type="primary" @click="handleContractSubmit" :loading="contractSubmitLoading">确定</el-button>
+          </template>
         </div>
       </template>
     </el-dialog>
@@ -297,6 +313,47 @@ import { listByIds } from '@/api/system/oss';
 const route = useRoute();
 const router = useRouter();
 
+const wanToYuanString = (value: unknown): string => {
+  const raw = String(value ?? '').trim();
+  if (!raw) return '';
+
+  const normalized = raw.replace(/,/g, '');
+  const match = normalized.match(/^(-?)(\d+)(?:\.(\d+))?$/);
+  if (!match) return '';
+
+  const sign = match[1] ? '-' : '';
+  const intPart = match[2] || '0';
+  const fracRaw = match[3] || '';
+  const fracPart = (fracRaw + '0000').slice(0, 4);
+
+  const base = BigInt(intPart) * 10000n + BigInt(fracPart);
+  return sign ? '-' + base.toString() : base.toString();
+};
+
+const yuanToWanString = (value: unknown): string => {
+  const raw = String(value ?? '').trim();
+  if (!raw) return '';
+
+  const normalized = raw.replace(/,/g, '');
+  const match = normalized.match(/^(-?)(\d+)$/);
+  if (!match) return '';
+
+  const sign = match[1] ? '-' : '';
+  const amount = BigInt(match[2] || '0');
+  const intPart = amount / 10000n;
+  const fracPart = amount % 10000n;
+
+  const fracPadded = fracPart.toString().padStart(4, '0');
+  const fracTrimmed = fracPadded.replace(/0+$/, '');
+  const result = fracTrimmed ? `${intPart.toString()}.${fracTrimmed}` : intPart.toString();
+  return sign ? '-' + result : result;
+};
+
+const formatWanAmount = (value: unknown) => {
+  const v = yuanToWanString(value);
+  return v ? v : '-';
+};
+
 const loading = ref(false);
 const contractList = ref<any[]>([]);
 
@@ -305,6 +362,7 @@ const contractDialogVisible = ref(false);
 const contractDialogTitle = ref('');
 const contractDialogReadonly = ref(false);
 const contractSubmitLoading = ref(false);
+const approveLoading = ref(false);
 const contractFormRef = ref();
 
 // 合同表单
@@ -486,7 +544,10 @@ const handleAdd = () => {
 
 /** 查看合同 */
 const handleView = (row: any) => {
-  contractForm.value = { ...row };
+  contractForm.value = {
+    ...row,
+    contractAmount: yuanToWanString(row?.contractAmount)
+  };
   contractDialogTitle.value = '查看合同';
   contractDialogReadonly.value = true;
   contractDialogVisible.value = true;
@@ -494,7 +555,10 @@ const handleView = (row: any) => {
 
 /** 编辑合同 */
 const handleEdit = (row: any) => {
-  contractForm.value = { ...row };
+  contractForm.value = {
+    ...row,
+    contractAmount: yuanToWanString(row?.contractAmount)
+  };
   contractDialogTitle.value = '修改合同';
   contractDialogReadonly.value = false;
   contractDialogVisible.value = true;
@@ -506,7 +570,11 @@ const handleContractSubmit = async () => {
     if (valid) {
       contractSubmitLoading.value = true;
       try {
-        await updateContract(contractForm.value);
+        const payload = {
+          ...contractForm.value,
+          contractAmount: wanToYuanString(contractForm.value.contractAmount)
+        };
+        await updateContract(payload);
         ElMessage.success('修改成功');
         contractDialogVisible.value = false;
         // 刷新列表
@@ -521,6 +589,35 @@ const handleContractSubmit = async () => {
   });
 };
 
+/** 审核通过 */
+const handleApprove = async () => {
+  try {
+    await ElMessageBox.confirm('确认审核通过该合同吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+  } catch {
+    return;
+  }
+
+  approveLoading.value = true;
+  try {
+    await updateContract({
+      id: contractForm.value?.id,
+      contractStatus: 1
+    });
+    ElMessage.success('审核通过成功');
+    contractDialogVisible.value = false;
+    getContractList();
+  } catch (e) {
+    console.error('审核通过失败:', e);
+    ElMessage.error('审核通过失败');
+  } finally {
+    approveLoading.value = false;
+  }
+};
+
 /** 查看附件 */
 const handleViewAttachment = async (row: any) => {
   if (!row.contractAttachment) {
@@ -562,32 +659,6 @@ const handleViewAttachment = async (row: any) => {
   }
 };
 
-/** 审核通过 */
-const handleApprove = async (row: any) => {
-  try {
-    await ElMessageBox.confirm('确认审核通过该合同吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    });
-    
-    // 更新合同状态为审核通过(状态改为1)
-    await updateContract({
-      ...row,
-      contractStatus: 1
-    });
-    
-    ElMessage.success('审核通过');
-    // 刷新列表
-    getContractList();
-  } catch (e: any) {
-    if (e !== 'cancel') {
-      console.error('审核失败:', e);
-      ElMessage.error('审核失败');
-    }
-  }
-};
-
 /** 格式化日期 */
 const formatDate = (date: string | Date) => {
   if (!date) return '-';

+ 0 - 1
src/views/supplier/contract/index.vue

@@ -28,7 +28,6 @@
       </template>
 
       <el-table v-loading="loading" border :data="contractList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="主键ID" align="center" prop="id" v-if="false" />
         <el-table-column label="供应商编号" align="center" prop="supplierNo" />
         <el-table-column label="供应商名称" align="center" prop="supplierName" />

+ 4 - 5
src/views/supplier/contractsupply/add.vue

@@ -90,7 +90,6 @@
         <!-- 商品列表 -->
         <div class="section-title">
           <el-button type="primary" @click="handleAddProduct">添加商品信息</el-button>
-          <el-button type="warning" @click="console.log('当前商品列表:', productList)">查看商品数据</el-button>
         </div>
 
         <el-table :data="productList" border style="width: 100%; margin-top: 20px;">
@@ -119,7 +118,7 @@
               <span>¥{{ scope.row.platformPrice || '0.00' }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="供应价(元)" align="center" width="120">
+          <el-table-column label="供应价" align="center" width="120">
             <template #default="scope">
               <el-input 
                 v-model="scope.row.offerPrice" 
@@ -127,7 +126,7 @@
               />
             </template>
           </el-table-column>
-          <el-table-column label="供应时效" align="center" width="120">
+          <el-table-column label="供应时效(天)" align="center" width="120">
             <template #default="scope">
               <el-input 
                 v-model="scope.row.supplyCycle" 
@@ -214,8 +213,8 @@ const goBack = () => {
 /** 获取公司列表 */
 const getCompanyData = async () => {
   try {
-    const res = await getCompanyList();
-    companyList.value = res.data || [];
+    const res = await getCompanyList({ pageNum: 1, pageSize: 1000 });
+    companyList.value = res.rows || res.data || [];
   } catch (e) {
     console.error('获取公司列表失败:', e);
   }

+ 6 - 4
src/views/supplier/contractsupply/components/Product.vue

@@ -54,9 +54,11 @@
         <el-table 
           v-loading="loading" 
           border 
+          :fit="true"
           :data="baseList" 
           @selection-change="handleSelectionChange"
           max-height="calc(70vh - 200px)"
+          style="width: 100%"
         >
           <el-table-column type="selection" width="50" align="center" />
           <el-table-column label="产品编号" align="center" prop="productNo" width="110" />
@@ -65,7 +67,7 @@
               <image-preview :src="scope.row.productImage" :width="60" :height="60" />
             </template>
           </el-table-column>
-          <el-table-column label="产品名称" align="center" prop="itemName" width="180" show-overflow-tooltip />
+          <el-table-column label="产品名称" align="center" prop="itemName" min-width="180" show-overflow-tooltip />
           <el-table-column label="产品类型" align="center" prop="categoryName" width="110" />
           <el-table-column label="品牌" align="center" prop="brandName" width="100" />
           <el-table-column label="单位" align="center" prop="unitName" width="70" />
@@ -114,8 +116,8 @@
 
 <script setup name="Base" lang="ts">
 // 补充必要的导入
-import { getCurrentInstance, ComponentInternalInstance, computed, ref, reactive, onMounted } from 'vue';
-import type { ElFormInstance } from 'element-plus';
+import { getCurrentInstance, ComponentInternalInstance, computed, ref, reactive, onMounted, toRefs } from 'vue';
+import type { FormInstance } from 'element-plus';
 
 // Props 定义
 interface Props {
@@ -172,7 +174,7 @@ const categoryOptions = ref<categoryTreeVO[]>([]);
 const hasMore = ref(true);
 const pageHistory = ref([]);
 
-const queryFormRef = ref<ElFormInstance>();
+const queryFormRef = ref<FormInstance>();
 
 const initFormData: BaseForm = {
   id: undefined,

+ 15 - 14
src/views/supplier/contractsupply/edit.vue

@@ -215,8 +215,8 @@ const goBack = () => {
 /** 获取公司列表 */
 const getCompanyData = async () => {
   try {
-    const res = await getCompanyList();
-    companyList.value = res.data || [];
+    const res = await getCompanyList({ pageNum: 1, pageSize: 1000 });
+    companyList.value = res.rows || res.data || [];
   } catch (e) {
     console.error('获取公司列表失败:', e);
   }
@@ -238,24 +238,25 @@ const getDetail = async () => {
   if (id) {
     try {
       const res = await getContractsupply(id);
+      const data: any = res.data;
       
       // 回显基本信息
       form.value = {
-        id: res.data.id,
-        contractSupplyNo: res.data.contractSupplyNo,
-        companyId: res.data.companyId,
-        supplierId: res.data.supplierId,
-        supplyNo: res.data.supplyNo || '',
-        supplierName: res.data.supplierName,
-        startTime: res.data.startTime,
-        endTime: res.data.endTime,
-        attachment: res.data.attachment,
-        remark: res.data.remark,
-        isSubmit: res.data.isSubmit || false
+        id: String(data.id ?? ''),
+        contractSupplyNo: String(data.contractSupplyNo ?? ''),
+        companyId: data.companyId ?? '',
+        supplierId: data.supplierId ?? '',
+        supplyNo: data.supplyNo || '',
+        supplierName: data.supplierName,
+        startTime: data.startTime,
+        endTime: data.endTime,
+        attachment: data.attachment,
+        remark: data.remark,
+        isSubmit: data.isSubmit || false
       };
       
       // 回显商品列表(关键!需要字段映射)
-      productList.value = (res.data.contractProduct || []).map((item: any) => ({
+      productList.value = (data.contractProduct || []).map((item: any) => ({
         productId: item.productId,
         productCode: item.productNo,
         productImage: item.productImage,

+ 12 - 15
src/views/supplier/contractsupply/index.vue

@@ -48,12 +48,11 @@
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="contractsupplyList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
+      <el-table v-loading="loading" border :data="contractsupplyList">
         <el-table-column label="主键ID" align="center" prop="id" v-if="false" />
         <el-table-column label="协议单号" align="center" prop="contractSupplyNo" />
         <el-table-column label="供应商编号" align="center" prop="supplyNo" />
-        <el-table-column label="供应商名称" align="center" prop="supplierName" />
+        <el-table-column label="供应商名称" align="left" prop="supplierName" min-width="220" />
         <el-table-column label="商品数量" align="center" prop="productNumber" />
         <el-table-column label="开始时间" align="center" prop="startTime" width="180">
           <template #default="scope">
@@ -128,9 +127,6 @@ const contractsupplyList = ref<ContractsupplyVO[]>([]);
 const buttonLoading = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
-const ids = ref<Array<string | number>>([]);
-const single = ref(true);
-const multiple = ref(true);
 const total = ref(0);
 
 const queryFormRef = ref<ElFormInstance>();
@@ -210,13 +206,6 @@ const resetQuery = () => {
   handleQuery();
 }
 
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: ContractsupplyVO[]) => {
-  ids.value = selection.map(item => item.id);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
-
 /** 新增按钮操作 */
 const handleAdd = () => {
   router.push('/supplier/contractsupply/add');
@@ -224,7 +213,11 @@ const handleAdd = () => {
 
 /** 修改按钮操作 */
 const handleUpdate = async (row?: ContractsupplyVO) => {
-  const _id = row?.id || ids.value[0];
+  const _id = row?.id;
+  if (!_id) {
+    proxy?.$modal.msgWarning('请选择要编辑的数据');
+    return;
+  }
   router.push(`/supplier/contractsupply/edit/${_id}`);
 }
 
@@ -279,7 +272,11 @@ const submitForm = () => {
 
 /** 删除按钮操作 */
 const handleDelete = async (row?: ContractsupplyVO) => {
-  const _ids = row?.id || ids.value;
+  const _ids = row?.id;
+  if (!_ids) {
+    proxy?.$modal.msgWarning('请选择要删除的数据');
+    return;
+  }
   await proxy?.$modal.confirm('是否确认删除协议供货编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
   await delContractsupply(_ids);
   proxy?.$modal.msgSuccess("删除成功");

+ 14 - 13
src/views/supplier/supplierauthorize/index.vue

@@ -50,10 +50,9 @@
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="supplierauthorizeList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
+      <el-table v-loading="loading" border :data="supplierauthorizeList" highlight-current-row @current-change="handleCurrentChange">
         <el-table-column label="供应商编号" align="center" prop="supplierNo" />
-        <el-table-column label="供应商名称" align="center" prop="supplierName" />
+        <el-table-column label="供应商名称" align="left" prop="supplierName" width="250" />
         <el-table-column label="供货区域(省)" align="center" prop="province">
           <template #default="scope">
             <span>{{ formatProvinceDisplay(scope.row.province) }}</span>
@@ -92,7 +91,7 @@ const supplierauthorizeList = ref<SupplierauthorizeVO[]>([]);
 const buttonLoading = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
-const ids = ref<Array<string | number>>([]);
+const currentId = ref<string | number | undefined>(undefined);
 const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
@@ -189,11 +188,11 @@ const resetQuery = () => {
   handleQuery();
 }
 
-/** 多选框选中数据 */
-const handleSelectionChange = (selection: SupplierauthorizeVO[]) => {
-  ids.value = selection.map(item => item.id);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
+/** 当前行变更 */
+const handleCurrentChange = (currentRow?: SupplierauthorizeVO) => {
+  currentId.value = currentRow?.id;
+  single.value = !currentId.value;
+  multiple.value = !currentId.value;
 }
 
 /** 查看按钮操作 */
@@ -227,7 +226,8 @@ const handleAdd = () => {
 /** 修改按钮操作 */
 const handleUpdate = async (row?: SupplierauthorizeVO) => {
   reset();
-  const _id = row?.id || ids.value[0]
+  const _id = row?.id || currentId.value;
+  if (!_id) return;
   const res = await getSupplierauthorize(_id);
   Object.assign(form.value, res.data);
   dialog.visible = true;
@@ -253,9 +253,10 @@ const submitForm = () => {
 
 /** 删除按钮操作 */
 const handleDelete = async (row?: SupplierauthorizeVO) => {
-  const _ids = row?.id || ids.value;
-  await proxy?.$modal.confirm('是否确认删除供应能力查询编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
-  await delSupplierauthorize(_ids);
+  const _id = row?.id || currentId.value;
+  if (!_id) return;
+  await proxy?.$modal.confirm('是否确认删除供应能力查询编号为"' + _id + '"的数据项?').finally(() => loading.value = false);
+  await delSupplierauthorize(_id);
   proxy?.$modal.msgSuccess("删除成功");
   await getList();
 }

+ 2 - 2
src/views/supplier/supplierlist/index.vue

@@ -505,8 +505,8 @@
 </template>
 
 <script setup name="Info" lang="ts">
-import { listInfo, getInfo, delInfo, addInfo, updateInfo } from '@/api/system/info';
-import { InfoVO, InfoQuery, InfoForm } from '@/api/system/info/types';
+import { listInfo, getInfo, delInfo, addInfo, updateInfo } from '@/api/supplier/info';
+import { InfoVO, InfoQuery, InfoForm } from '@/api/supplier/info/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

Some files were not shown because too many files changed in this diff