Lijingyang 2 mēneši atpakaļ
vecāks
revīzija
394d926d38
39 mainītis faili ar 3948 papildinājumiem un 907 dzēšanām
  1. 15 5
      src/api/customer/bank/types.ts
  2. 10 7
      src/api/customer/info/index.ts
  3. 23 3
      src/api/customer/info/types.ts
  4. 10 0
      src/api/product/category/index.ts
  5. 1 1
      src/api/product/contractproduct/index.ts
  6. 5 0
      src/api/supplier/address/types.ts
  7. 65 0
      src/api/supplier/area/index.ts
  8. 81 0
      src/api/supplier/area/types.ts
  9. 77 0
      src/api/supplier/businessInfo/index.ts
  10. 206 0
      src/api/supplier/businessInfo/types.ts
  11. 1 11
      src/api/supplier/contact/index.ts
  12. 17 0
      src/api/supplier/contract/index.ts
  13. 12 0
      src/api/supplier/contractsupply/index.ts
  14. 5 0
      src/api/supplier/contractsupply/types.ts
  15. 63 0
      src/api/supplier/infoTemporary/index.ts
  16. 930 0
      src/api/supplier/infoTemporary/types.ts
  17. 80 0
      src/api/system/addressarea/index.ts
  18. 98 0
      src/api/system/addressarea/types.ts
  19. 55 0
      src/api/system/bank/index.ts
  20. 120 0
      src/api/system/bank/types.ts
  21. 55 0
      src/api/system/invoiceType/index.ts
  22. 80 0
      src/api/system/invoiceType/types.ts
  23. 74 3
      src/components/Pagination/index.vue
  24. 1 1
      src/components/RegionCascader/index.vue
  25. 7 4
      src/enums/supplierStatus.ts
  26. 1 1
      src/layout/components/Sidebar/Logo.vue
  27. 417 193
      src/views/customer/info/detail.vue
  28. 179 45
      src/views/customer/info/index.vue
  29. 156 44
      src/views/supplier/approve/index.vue
  30. 5 1
      src/views/supplier/contact/index.vue
  31. 2 3
      src/views/supplier/contract/add.vue
  32. 361 8
      src/views/supplier/contract/detail.vue
  33. 5 14
      src/views/supplier/contract/index.vue
  34. 53 208
      src/views/supplier/contractsupply/add.vue
  35. 490 0
      src/views/supplier/contractsupply/components/Product.vue
  36. 38 216
      src/views/supplier/contractsupply/edit.vue
  37. 19 6
      src/views/supplier/contractsupply/index.vue
  38. 68 34
      src/views/supplier/none/index.vue
  39. 63 99
      src/views/supplier/supplierauthorize/index.vue

+ 15 - 5
src/api/customer/bank/types.ts

@@ -58,9 +58,9 @@ export interface BankForm extends BaseEntity {
   bankNum?: string;
 
   /**
-   * 银行信息编号(可能为内部系统编号
+   * 银行信息编号(银行ID
    */
-  bankInfoNo?: string;
+  bankInfoNo?: string | number;
 
   /**
    * 银行名称
@@ -78,7 +78,7 @@ export interface BankForm extends BaseEntity {
   isture?: string;
 
   /**
-   * 账户户名
+   * 纳税人识别号
    */
   circlesName?: string;
 
@@ -88,15 +88,25 @@ export interface BankForm extends BaseEntity {
   phone?: string;
 
   /**
-   * 发票类型编
+   * 发票类型编号(发票类型ID)
    */
-  invoiceTypeNo?: string;
+  invoiceTypeNo?: string | number;
 
   /**
    * 发票类型名称
    */
   invoiceTypeName?: string;
 
+  /**
+   * 企业工商名称(发票抬头)
+   */
+  businessName?: string;
+
+  /**
+   * 工商地址
+   */
+  businessAddress?: string;
+
 }
 
 export interface BankQuery extends PageQuery {

+ 10 - 7
src/api/customer/info/index.ts

@@ -180,12 +180,13 @@ export const getContactListById = (supplierId: string | number, params?: any) =>
 /**
  * 根据供应商ID获取已选择的品目ID列表
  * @param supplierId 供应商ID
+ * @param supplyStatus 供应商状态(可选)
  */
-export const getSupplierCategories = (supplierId: string | number) => {
+export const getSupplierCategories = (supplierId: string | number, supplyStatus?: string) => {
   return request({
     url: '/customer/info/getSupplierCategories',
     method: 'get',
-    params: { supplierId }
+    params: { supplierId, supplyStatus }
   });
 };
 
@@ -234,14 +235,14 @@ export const getBankBySupplierId = (id: string | number) => {
 };
 
 /**
- * 根据供应商ID获取授权详情列表
- * @param supplierId 供应商ID
+ * 根据供应商ID获取授权详情列表(支持分页)
+ * @param params 查询参数,包含supplierId和分页参数
  */
-export const getAuthorizeDetailList = (supplierId: string | number) => {
+export const getAuthorizeDetailList = (params: any) => {
   return request({
     url: '/customer/supplierauthorize/getAuthorizeDetailList',
     method: 'get',
-    params: { supplierId }
+    params: params
   });
 };
 
@@ -251,11 +252,13 @@ export const getAuthorizeDetailList = (supplierId: string | number) => {
  */
 export const savePurchaseInfo = (data: { supplierId: string | number; productManager: number | null; purchaser: number | null }) => {
   return request({
-    url: '/system/comStaff/saveInformation',
+    url: '/customer/procurement',
     method: 'post',
     data: data
   });
 };
+
+
 /**
  * 根据供应商ID获取地址列表
  * @param supplierId 供应商ID

+ 23 - 3
src/api/customer/info/types.ts

@@ -187,7 +187,7 @@ export interface InfoVO {
   /**
    * 供应状态(0-暂停, 1-正常...)
    */
-  supplyStatus: number;
+  supplyStatus: string;
 
   /**
    * 供应评分
@@ -499,7 +499,7 @@ export interface InfoForm extends BaseEntity {
   /**
    * 供应状态(0-暂停, 1-正常...)
    */
-  supplyStatus?: number;
+  supplyStatus?: string;
 
   /**
    * 供应评分
@@ -615,6 +615,26 @@ export interface InfoQuery extends PageQuery {
    */
   supplierNo?: string;
 
+  /**
+   * 产品经理
+   */
+  productManager?: string;
+
+  /**
+   * 采购人员
+   */
+  buyer?: string;
+
+  /**
+   * 供应区域(省)
+   */
+  province?: string;
+
+  /**
+   * 供应区域(市)
+   */
+  city?: string;
+
   /**
    * 企业名称
    */
@@ -793,7 +813,7 @@ export interface InfoQuery extends PageQuery {
   /**
    * 供应状态(0-暂停, 1-正常...)
    */
-  supplyStatus?: number;
+  supplyStatus?: string;
 
   /**
    * 供应评分

+ 10 - 0
src/api/product/category/index.ts

@@ -72,3 +72,13 @@ export const listCategoryExcludeChild = (id: string | number): AxiosPromise<Cate
     method: 'get'
   });
 };
+
+/**
+ * 获取产品分类列表
+ */
+export const getProductCategoryList = () => {
+  return request({
+    url: '/product/category/getProductCategoryList',
+    method: 'get'
+  });
+};

+ 1 - 1
src/api/product/contractproduct/index.ts

@@ -1,6 +1,6 @@
 import request from '@/utils/request';
 import { AxiosPromise } from 'axios';
-import { ContracproductVO, ContracproductForm, ContracproductQuery } from '@/api/product/contracproduct/types';
+import { ContracproductVO, ContracproductForm, ContracproductQuery } from '@/api/product/contractproduct/types';
 
 /**
  * 查询合同产品关联列表

+ 5 - 0
src/api/supplier/address/types.ts

@@ -171,6 +171,11 @@ export interface AddressForm extends BaseEntity {
 
 export interface AddressQuery extends PageQuery {
 
+  /**
+   * 供应商ID
+   */
+  supplierId?: string | number;
+
   /**
    * 供应商编号
    */

+ 65 - 0
src/api/supplier/area/index.ts

@@ -0,0 +1,65 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { AreaVO, AreaForm, AreaQuery } from '@/api/supplier/area/types';
+
+/**
+ * 查询供应区域列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listArea = (query?: AreaQuery): AxiosPromise<AreaVO[]> => {
+  return request({
+    url: '/customer/area/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询供应区域详细
+ * @param id
+ */
+export const getArea = (id: string | number): AxiosPromise<AreaVO> => {
+  return request({
+    url: '/customer/area/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增供应区域
+ * @param data
+ */
+export const addArea = (data: AreaForm) => {
+  return request({
+    url: '/customer/area',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改供应区域
+ * @param data
+ */
+export const updateArea = (data: AreaForm) => {
+  return request({
+    url: '/customer/area',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除供应区域
+ * @param id
+ */
+export const delArea = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/area/' + id,
+    method: 'delete'
+  });
+};
+
+

+ 81 - 0
src/api/supplier/area/types.ts

@@ -0,0 +1,81 @@
+export interface AreaVO {
+  /**
+   * 供应商编号(关联供应商主表)
+   */
+  supplyNo: string;
+
+  /**
+   * 供应商ID(关联供应商主表主键)
+   */
+  supplierId: string | number;
+
+  /**
+   * 区域编码(如国标行政区域编码/自定义区域编码)
+   */
+  areaCode: string;
+
+  /**
+   * 区域名称(如北京市/江苏省南京市/天河区)
+   */
+  areaName: string;
+
+  /**
+   * 上级区域编码(如省级编码对应市级的上级编码,顶级区域为0)
+   */
+  parentCode: string;
+
+  /**
+   * 区域层级(1省/直辖市 2市 3区县 4街道/镇)
+   */
+  level: string;
+
+}
+
+export interface AreaForm extends BaseEntity {
+}
+
+export interface AreaQuery extends PageQuery {
+
+  /**
+   * 供应商编号(关联供应商主表)
+   */
+  supplyNo?: string;
+
+  /**
+   * 供应商ID(关联供应商主表主键)
+   */
+  supplierId?: string | number;
+
+  /**
+   * 区域编码(如国标行政区域编码/自定义区域编码)
+   */
+  areaCode?: string;
+
+  /**
+   * 区域名称(如北京市/江苏省南京市/天河区)
+   */
+  areaName?: string;
+
+  /**
+   * 上级区域编码(如省级编码对应市级的上级编码,顶级区域为0)
+   */
+  parentCode?: string;
+
+  /**
+   * 区域层级(1省/直辖市 2市 3区县 4街道/镇)
+   */
+  level?: string;
+
+  /**
+   * 供应商状态
+   */
+  supplyStatus?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 77 - 0
src/api/supplier/businessInfo/index.ts

@@ -0,0 +1,77 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BusinessInfoVO, BusinessInfoForm, BusinessInfoQuery } from '@/api/suuplier/businessInfo/types';
+
+/**
+ * 查询供应商工商注册信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBusinessInfo = (query?: BusinessInfoQuery): AxiosPromise<BusinessInfoVO[]> => {
+  return request({
+    url: '/suuplier/sbusinessInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询供应商工商注册信息详细
+ * @param supplierId
+ */
+export const getBusinessInfo = (supplierId: string | number): AxiosPromise<BusinessInfoVO> => {
+  return request({
+    url: '/suuplier/sbusinessInfo/' + supplierId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增供应商工商注册信息
+ * @param data
+ */
+export const addBusinessInfo = (data: BusinessInfoForm) => {
+  return request({
+    url: '/suuplier/sbusinessInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改供应商工商注册信息
+ * @param data
+ */
+export const updateBusinessInfo = (data: BusinessInfoForm) => {
+  return request({
+    url: '/suuplier/sbusinessInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除供应商工商注册信息
+ * @param supplierId
+ */
+export const delBusinessInfo = (supplierId: string | number | Array<string | number>) => {
+  return request({
+    url: '/suuplier/sbusinessInfo/' + supplierId,
+    method: 'delete'
+  });
+};
+
+/**
+ * 获取工商信息
+ * @param enterpriseName 企业名称
+ */
+export const getBusinessInformation = (enterpriseName: string) => {
+  return request({
+    url: '/customer/bussineInfo/getinformation',
+    method: 'post',
+    params: {
+      enterpriseName
+    }
+  });
+};

+ 206 - 0
src/api/supplier/businessInfo/types.ts

@@ -0,0 +1,206 @@
+export interface BusinessInfoVO {
+  /**
+   * 关联客户ID
+   */
+  supplierId: string | number;
+
+  /**
+   * 工商全称
+   */
+  businessName: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode: string;
+
+  /**
+   * 法人姓名
+   */
+  legalPersonName: string;
+
+  /**
+   * 注册资本
+   */
+  registeredCapital: string;
+
+  /**
+   * 实缴资本
+   */
+  paidInCapital: string | number;
+
+  /**
+   * 成立日期
+   */
+  establishmentDate: string;
+
+  /**
+   * 吊销日期
+   */
+  revocationDate: string;
+
+  /**
+   * 登记状态
+   */
+  registrationStatus: string;
+
+  /**
+   * 登记机关
+   */
+  registrationAuthority: string;
+
+  /**
+   * 经营范围
+   */
+  bussinessRange: string;
+
+  /**
+   * 营业执照路径
+   */
+  businessLicense: string;
+
+  /**
+   * 工商地址-详细地址
+   */
+  businessAddress: string;
+
+}
+
+export interface BusinessInfoForm extends BaseEntity {
+  /**
+   * 关联客户ID
+   */
+  supplierId?: string | number;
+
+  /**
+   * 工商全称
+   */
+  businessName?: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode?: string;
+
+  /**
+   * 法人姓名
+   */
+  legalPersonName?: string;
+
+  /**
+   * 注册资本
+   */
+  registeredCapital?: string;
+
+  /**
+   * 实缴资本
+   */
+  paidInCapital?: string | number;
+
+  /**
+   * 成立日期
+   */
+  establishmentDate?: string;
+
+  /**
+   * 吊销日期
+   */
+  revocationDate?: string;
+
+  /**
+   * 登记状态
+   */
+  registrationStatus?: string;
+
+  /**
+   * 登记机关
+   */
+  registrationAuthority?: string;
+
+  /**
+   * 经营范围
+   */
+  bussinessRange?: string;
+
+  /**
+   * 营业执照路径
+   */
+  businessLicense?: string;
+
+  /**
+   * 工商地址-详细地址
+   */
+  businessAddress?: string;
+
+}
+
+export interface BusinessInfoQuery extends PageQuery {
+
+  /**
+   * 工商全称
+   */
+  businessName?: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode?: string;
+
+  /**
+   * 法人姓名
+   */
+  legalPersonName?: string;
+
+  /**
+   * 注册资本
+   */
+  registeredCapital?: string;
+
+  /**
+   * 实缴资本
+   */
+  paidInCapital?: string | number;
+
+  /**
+   * 成立日期
+   */
+  establishmentDate?: string;
+
+  /**
+   * 吊销日期
+   */
+  revocationDate?: string;
+
+  /**
+   * 登记状态
+   */
+  registrationStatus?: string;
+
+  /**
+   * 登记机关
+   */
+  registrationAuthority?: string;
+
+  /**
+   * 经营范围
+   */
+  bussinessRange?: string;
+
+  /**
+   * 营业执照路径
+   */
+  businessLicense?: string;
+
+  /**
+   * 工商地址-详细地址
+   */
+  businessAddress?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 1 - 11
src/api/supplier/contact/index.ts

@@ -62,14 +62,4 @@ export const delContact = (id: string | number | Array<string | number>) => {
   });
 };
 
-/**
- * 重置联系人密码
- * @param data
- */
-export const resetContactPassword = (data: { userId: string | number; newPassword: string }) => {
-  return request({
-    url: '/customer/contact/resetPassword',
-    method: 'put',
-    data: data
-  });
-};
+

+ 17 - 0
src/api/supplier/contract/index.ts

@@ -16,6 +16,23 @@ export const listContract = (query?: ContractQuery): AxiosPromise<ContractVO[]>
   });
 };
 
+/**
+ * 根据供应商ID查询合同列表(支持分页)
+ * @param supplierId 供应商ID
+ * @param query 查询参数(包含分页参数)
+ * @returns {*}
+ */
+export const getSupplierContractsById = (supplierId: string | number, query?: any): AxiosPromise<any> => {
+  return request({
+    url: '/customer/supplierContract/supplierContractsById',
+    method: 'get',
+    params: {
+      supplierId,
+      ...query
+    }
+  });
+};
+
 /**
  * 查询合同管理详细
  * @param id

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

@@ -61,3 +61,15 @@ export const delContractsupply = (id: string | number | Array<string | number>)
     method: 'delete'
   });
 };
+
+/**
+ * 审核协议供货
+ * @param data
+ */
+export const auditContractsupply = (data: { id: string | number; status: number }) => {
+  return request({
+    url: '/customer/contractsupply/edit',
+    method: 'put',
+    data: data
+  });
+};

+ 5 - 0
src/api/supplier/contractsupply/types.ts

@@ -110,6 +110,11 @@ export interface ContractsupplyQuery extends PageQuery {
    */
   contractSupplyNo?: number;
 
+  /**
+   * 供应商名称
+   */
+  supplierName?: string;
+
   /**
    * 开始时间
    */

+ 63 - 0
src/api/supplier/infoTemporary/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { InfoTemporaryVO, InfoTemporaryForm, InfoTemporaryQuery } from '@/api/supplier/infoTemporary/types';
+
+/**
+ * 查询供应商临时信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listInfoTemporary = (query?: InfoTemporaryQuery): AxiosPromise<InfoTemporaryVO[]> => {
+  return request({
+    url: '/customer/infoTemporary/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询供应商临时信息详细
+ * @param id
+ */
+export const getInfoTemporary = (id: string | number): AxiosPromise<InfoTemporaryVO> => {
+  return request({
+    url: '/customer/infoTemporary/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增供应商临时信息
+ * @param data
+ */
+export const addInfoTemporary = (data: InfoTemporaryForm) => {
+  return request({
+    url: '/customer/infoTemporary',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改供应商临时信息
+ * @param data
+ */
+export const updateInfoTemporary = (data: InfoTemporaryForm) => {
+  return request({
+    url: '/customer/infoTemporary',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除供应商临时信息
+ * @param id
+ */
+export const delInfoTemporary = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/infoTemporary/' + id,
+    method: 'delete'
+  });
+};

+ 930 - 0
src/api/supplier/infoTemporary/types.ts

@@ -0,0 +1,930 @@
+export interface InfoTemporaryVO {
+  /**
+   * 对应supplier_info.id 
+   */
+  id: string | number;
+
+  /**
+   * 供应商ID(关联supplier_info表的主键)
+   */
+  supplierId?: string | number;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo: string;
+
+  /**
+   * 供应商名称
+   */
+  enterpriseName: string;
+
+  /**
+   * 企业规模
+   */
+  membershipSize: number;
+
+  /**
+   * 供应商类型(如生产厂家/经销商/代理商)
+   */
+  supplierType: number;
+
+  /**
+   * 合作类型(如框架合作/项目合作/一次性合作)
+   */
+  cooperationType: number;
+
+  /**
+   * 固定电话(多个号码用分隔符区分)
+   */
+  fixedPhone: string;
+
+  /**
+   * 传真号码
+   */
+  fax: string;
+
+  /**
+   * 企业官网地址
+   */
+  url: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode: string;
+
+  /**
+   * 企业邮箱
+   */
+  mailbox: string;
+
+  /**
+   * 办公地址-省份
+   */
+  officeProvince: string;
+
+  /**
+   * 办公地址-城市
+   */
+  officeCity: string;
+
+  /**
+   * 办公地址-区县
+   */
+  officeCounty: string;
+
+  /**
+   * 办公地址-详细地址
+   */
+  officeAddress: string;
+
+  /**
+   * 工商注册名称(与营业执照一致)
+   */
+  businessName: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode: string;
+
+  /**
+   * 法定代表人姓名
+   */
+  legalPersonName: string;
+
+  /**
+   * 法定代表人身份证号(加密存储)
+   */
+  legalPersonId: string | number;
+
+  /**
+   * 注册资本(如500万/1000万元人民币)
+   */
+  registeredCapital: string;
+
+  /**
+   * 经营地址-省份
+   */
+  businessProvince: string;
+
+  /**
+   * 经营地址-城市
+   */
+  businessCity: string;
+
+  /**
+   * 经营地址-区县
+   */
+  businessCounty: string;
+
+  /**
+   * 经营地址-详细地址
+   */
+  businessAddress: string;
+
+  /**
+   * 营业执照图片存储地址(多个地址用分隔符区分)
+   */
+  businessLicense: string;
+
+  /**
+   * 发票类型(如增值税专票/普票/电子发票)
+   */
+  invoiceType: string;
+
+  /**
+   * 发票抬头
+   */
+  invoiceHeader: string;
+
+  /**
+   * 纳税人识别号
+   */
+  taxpayerIdentifier: string | number;
+
+  /**
+   * 开户银行
+   */
+  depositaryBank: string;
+
+  /**
+   * 行号(开户银行行号)
+   */
+  rowNum: string;
+
+  /**
+   * 银行账号
+   */
+  bankAccounts: string;
+
+  /**
+   * 开票地址
+   */
+  invoiceAddress: string;
+
+  /**
+   * 开票固定电话
+   */
+  invoiceLandline: string;
+
+  /**
+   * 供货范围(经营品类/产品范围)
+   */
+  scopeSupply: string;
+
+  /**
+   * 合作方式(0线下 1线上 2混合)
+   */
+  cooperateWay: string;
+
+  /**
+   * 合作等级(如A级/B级/C级)
+   */
+  cooperateLevel: number;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime: string;
+
+  /**
+   * 供货状态(0未供货 1供货中 2暂停供货 3终止供货)
+   */
+  supplyStatus: string;
+
+  /**
+   * 供货评分(如1-100分)
+   */
+  supplyScore: number;
+
+  /**
+   * 年销售额(单位:万元)
+   */
+  yearSales: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone: string;
+
+  /**
+   * 供应商登录密码(加密存储)
+   */
+  supplierPassword: string;
+
+  /**
+   * 经营品类(多个品类用分隔符区分)
+   */
+  operatingCategory: string;
+
+  /**
+   * 经营品牌(多个品牌用分隔符区分)
+   */
+  operatingBrand: string;
+
+  /**
+   * 其他合作客户(客户名称列表)
+   */
+  otherCustomers: string;
+
+  /**
+   * 企业简称
+   */
+  shortName: string;
+
+  /**
+   * 行业分类(如电子/建材/食品)
+   */
+  industrCategory: number;
+
+  /**
+   * 补充类型(预留字段)
+   */
+  type: string;
+
+  /**
+   * 所属集团公司(如有)
+   */
+  ownedCompany: number;
+
+  /**
+   * 数据推送状态(0未推送 1已推送 2推送失败)
+   */
+  pushStatus: string;
+
+  /**
+   * 有效期起始时间
+   */
+  validityFromDate: string | number;
+
+  /**
+   * 有效期截止时间
+   */
+  validityToDate: string | number;
+
+  /**
+   * 行序号(导入数据用)
+   */
+  rowNo: number;
+
+  /**
+   * 经办人身份证/授权书图片地址
+   */
+  personImage: string;
+
+  /**
+   * 经办人身份证/授权书图片地址Url
+   */
+  personImageUrl: string;
+  /**
+   * 对接人编号
+   */
+  abutmentNo: number;
+
+  /**
+   * 是否合作(0否 1是)
+   */
+  cooperative: number;
+
+  /**
+   * 覆盖区域列表(JSON格式,如省份/城市列表)
+   */
+  areaListJson: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注信息
+   */
+  remark: string;
+
+}
+
+export interface InfoTemporaryForm extends BaseEntity {
+  /**
+   * 对应supplier_info.id 
+   */
+  id?: string | number;
+
+  /**
+   * 供应商ID(关联supplier_info表的主键)
+   */
+  supplierId?: string | number;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 供应商名称
+   */
+  enterpriseName?: string;
+
+  /**
+   * 企业规模
+   */
+  membershipSize?: number;
+
+  /**
+   * 供应商类型(如生产厂家/经销商/代理商)
+   */
+  supplierType?: number;
+
+  /**
+   * 合作类型(如框架合作/项目合作/一次性合作)
+   */
+  cooperationType?: number;
+
+  /**
+   * 固定电话(多个号码用分隔符区分)
+   */
+  fixedPhone?: string;
+
+  /**
+   * 传真号码
+   */
+  fax?: string;
+
+  /**
+   * 企业官网地址
+   */
+  url?: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode?: string;
+
+  /**
+   * 企业邮箱
+   */
+  mailbox?: string;
+
+  /**
+   * 办公地址-省份
+   */
+  officeProvince?: string;
+
+  /**
+   * 办公地址-城市
+   */
+  officeCity?: string;
+
+  /**
+   * 办公地址-区县
+   */
+  officeCounty?: string;
+
+  /**
+   * 办公地址-详细地址
+   */
+  officeAddress?: string;
+
+  /**
+   * 工商注册名称(与营业执照一致)
+   */
+  businessName?: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode?: string;
+
+  /**
+   * 法定代表人姓名
+   */
+  legalPersonName?: string;
+
+  /**
+   * 法定代表人身份证号(加密存储)
+   */
+  legalPersonId?: string | number;
+
+  /**
+   * 注册资本(如500万/1000万元人民币)
+   */
+  registeredCapital?: string;
+
+  /**
+   * 经营地址-省份
+   */
+  businessProvince?: string;
+
+  /**
+   * 经营地址-城市
+   */
+  businessCity?: string;
+
+  /**
+   * 经营地址-区县
+   */
+  businessCounty?: string;
+
+  /**
+   * 经营地址-详细地址
+   */
+  businessAddress?: string;
+
+  /**
+   * 营业执照图片存储地址(多个地址用分隔符区分)
+   */
+  businessLicense?: string;
+
+  /**
+   * 发票类型(如增值税专票/普票/电子发票)
+   */
+  invoiceType?: string;
+
+  /**
+   * 发票抬头
+   */
+  invoiceHeader?: string;
+
+  /**
+   * 纳税人识别号
+   */
+  taxpayerIdentifier?: string | number;
+
+  /**
+   * 开户银行
+   */
+  depositaryBank?: string;
+
+  /**
+   * 行号(开户银行行号)
+   */
+  rowNum?: string;
+
+  /**
+   * 银行账号
+   */
+  bankAccounts?: string;
+
+  /**
+   * 开票地址
+   */
+  invoiceAddress?: string;
+
+  /**
+   * 开票固定电话
+   */
+  invoiceLandline?: string;
+
+  /**
+   * 供货范围(经营品类/产品范围)
+   */
+  scopeSupply?: string;
+
+  /**
+   * 合作方式(0线下 1线上 2混合)
+   */
+  cooperateWay?: string;
+
+  /**
+   * 合作等级(如A级/B级/C级)
+   */
+  cooperateLevel?: number;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime?: string;
+
+  /**
+   * 供货状态(0未供货 1供货中 2暂停供货 3终止供货)
+   */
+  supplyStatus?: string;
+
+  /**
+   * 供货评分(如1-100分)
+   */
+  supplyScore?: number;
+
+  /**
+   * 年销售额(单位:万元)
+   */
+  yearSales?: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName?: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone?: string;
+
+  /**
+   * 供应商登录密码(加密存储)
+   */
+  supplierPassword?: string;
+
+  /**
+   * 经营品类(多个品类用分隔符区分)
+   */
+  operatingCategory?: string;
+
+  /**
+   * 经营品牌(多个品牌用分隔符区分)
+   */
+  operatingBrand?: string;
+
+  /**
+   * 其他合作客户(客户名称列表)
+   */
+  otherCustomers?: string;
+
+  /**
+   * 企业简称
+   */
+  shortName?: string;
+
+  /**
+   * 行业分类(如电子/建材/食品)
+   */
+  industrCategory?: number;
+
+  /**
+   * 补充类型(预留字段)
+   */
+  type?: string;
+
+  /**
+   * 所属集团公司(如有)
+   */
+  ownedCompany?: number;
+
+  /**
+   * 数据推送状态(0未推送 1已推送 2推送失败)
+   */
+  pushStatus?: string;
+
+  /**
+   * 有效期起始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 有效期截止时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 行序号(导入数据用)
+   */
+  rowNo?: number;
+
+  /**
+   * 经办人身份证/授权书图片地址
+   */
+  personImage?: string;
+
+  /**
+   * 对接人编号
+   */
+  abutmentNo?: number;
+
+  /**
+   * 是否合作(0否 1是)
+   */
+  cooperative?: number;
+
+  /**
+   * 覆盖区域列表(JSON格式,如省份/城市列表)
+   */
+  areaListJson?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注信息
+   */
+  remark?: string;
+
+}
+
+export interface InfoTemporaryQuery extends PageQuery {
+
+  /**
+   * 供应商ID(关联supplier_info表的主键)
+   */
+  supplierId?: string | number;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 供应商名称
+   */
+  enterpriseName?: string;
+
+  /**
+   * 企业规模
+   */
+  membershipSize?: number;
+
+  /**
+   * 供应商类型(如生产厂家/经销商/代理商)
+   */
+  supplierType?: number;
+
+  /**
+   * 合作类型(如框架合作/项目合作/一次性合作)
+   */
+  cooperationType?: number;
+
+  /**
+   * 固定电话(多个号码用分隔符区分)
+   */
+  fixedPhone?: string;
+
+  /**
+   * 传真号码
+   */
+  fax?: string;
+
+  /**
+   * 企业官网地址
+   */
+  url?: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode?: string;
+
+  /**
+   * 企业邮箱
+   */
+  mailbox?: string;
+
+  /**
+   * 办公地址-省份
+   */
+  officeProvince?: string;
+
+  /**
+   * 办公地址-城市
+   */
+  officeCity?: string;
+
+  /**
+   * 办公地址-区县
+   */
+  officeCounty?: string;
+
+  /**
+   * 办公地址-详细地址
+   */
+  officeAddress?: string;
+
+  /**
+   * 工商注册名称(与营业执照一致)
+   */
+  businessName?: string;
+
+  /**
+   * 统一社会信用代码
+   */
+  socialCreditCode?: string;
+
+  /**
+   * 法定代表人姓名
+   */
+  legalPersonName?: string;
+
+  /**
+   * 法定代表人身份证号(加密存储)
+   */
+  legalPersonId?: string | number;
+
+  /**
+   * 注册资本(如500万/1000万元人民币)
+   */
+  registeredCapital?: string;
+
+  /**
+   * 经营地址-省份
+   */
+  businessProvince?: string;
+
+  /**
+   * 经营地址-城市
+   */
+  businessCity?: string;
+
+  /**
+   * 经营地址-区县
+   */
+  businessCounty?: string;
+
+  /**
+   * 经营地址-详细地址
+   */
+  businessAddress?: string;
+
+  /**
+   * 营业执照图片存储地址(多个地址用分隔符区分)
+   */
+  businessLicense?: string;
+
+  /**
+   * 发票类型(如增值税专票/普票/电子发票)
+   */
+  invoiceType?: string;
+
+  /**
+   * 发票抬头
+   */
+  invoiceHeader?: string;
+
+  /**
+   * 纳税人识别号
+   */
+  taxpayerIdentifier?: string | number;
+
+  /**
+   * 开户银行
+   */
+  depositaryBank?: string;
+
+  /**
+   * 行号(开户银行行号)
+   */
+  rowNum?: string;
+
+  /**
+   * 银行账号
+   */
+  bankAccounts?: string;
+
+  /**
+   * 开票地址
+   */
+  invoiceAddress?: string;
+
+  /**
+   * 开票固定电话
+   */
+  invoiceLandline?: string;
+
+  /**
+   * 供货范围(经营品类/产品范围)
+   */
+  scopeSupply?: string;
+
+  /**
+   * 合作方式(0线下 1线上 2混合)
+   */
+  cooperateWay?: string;
+
+  /**
+   * 合作等级(如A级/B级/C级)
+   */
+  cooperateLevel?: number;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime?: string;
+
+  /**
+   * 供货状态(0未供货 1供货中 2暂停供货 3终止供货)
+   */
+  supplyStatus?: string;
+
+  /**
+   * 供货评分(如1-100分)
+   */
+  supplyScore?: number;
+
+  /**
+   * 年销售额(单位:万元)
+   */
+  yearSales?: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName?: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone?: string;
+
+  /**
+   * 供应商登录密码(加密存储)
+   */
+  supplierPassword?: string;
+
+  /**
+   * 经营品类(多个品类用分隔符区分)
+   */
+  operatingCategory?: string;
+
+  /**
+   * 经营品牌(多个品牌用分隔符区分)
+   */
+  operatingBrand?: string;
+
+  /**
+   * 其他合作客户(客户名称列表)
+   */
+  otherCustomers?: string;
+
+  /**
+   * 企业简称
+   */
+  shortName?: string;
+
+  /**
+   * 行业分类(如电子/建材/食品)
+   */
+  industrCategory?: number;
+
+  /**
+   * 补充类型(预留字段)
+   */
+  type?: string;
+
+  /**
+   * 所属集团公司(如有)
+   */
+  ownedCompany?: number;
+
+  /**
+   * 数据推送状态(0未推送 1已推送 2推送失败)
+   */
+  pushStatus?: string;
+
+  /**
+   * 有效期起始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 有效期截止时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 行序号(导入数据用)
+   */
+  rowNo?: number;
+
+  /**
+   * 经办人身份证/授权书图片地址
+   */
+  personImage?: string;
+
+  /**
+   * 对接人编号
+   */
+  abutmentNo?: number;
+
+  /**
+   * 是否合作(0否 1是)
+   */
+  cooperative?: number;
+
+  /**
+   * 覆盖区域列表(JSON格式,如省份/城市列表)
+   */
+  areaListJson?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注信息
+   */
+  remark?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 80 - 0
src/api/system/addressarea/index.ts

@@ -0,0 +1,80 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { AddressareaVO, AddressareaForm, AddressareaQuery } from '@/api/system/addressarea/types';
+
+// API functions for address area management
+
+/**
+ * 查询地区列表列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listAddressarea = (query?: AddressareaQuery): AxiosPromise<AddressareaVO[]> => {
+  return request({
+    url: '/system/addressarea/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询省市列表列表
+ * @param query
+ * @returns {*}
+ */
+
+export const chinaAreaList = (query?: AddressareaQuery): AxiosPromise<AddressareaVO[]> => {
+  return request({
+    url: '/system/addressarea/getChinaList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询地区列表详细
+ * @param id
+ */
+export const getAddressarea = (id: string | number): AxiosPromise<AddressareaVO> => {
+  return request({
+    url: '/system/addressarea/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增地区列表
+ * @param data
+ */
+export const addAddressarea = (data: AddressareaForm) => {
+  return request({
+    url: '/system/addressarea',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改地区列表
+ * @param data
+ */
+export const updateAddressarea = (data: AddressareaForm) => {
+  return request({
+    url: '/system/addressarea',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除地区列表
+ * @param id
+ */
+export const delAddressarea = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/addressarea/' + id,
+    method: 'delete'
+  });
+};
+

+ 98 - 0
src/api/system/addressarea/types.ts

@@ -0,0 +1,98 @@
+export interface AddressareaVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 地区编码
+   */
+  areaCode: string;
+
+  /**
+   * 地区名称
+   */
+  areaName: string;
+
+  /**
+   * 父类ID
+   */
+  parentCode: number;
+
+  /**
+   * 地区简称
+   */
+  simpleName: string;
+
+  /**
+   * 地区等级省 1 市 2
+   */
+  level: number;
+
+  /**
+   * 拼英
+   */
+  pinYin: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  children: AddressareaVO[];
+
+}
+
+export interface AddressareaForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 地区编码
+   */
+  areaCode?: string;
+
+  /**
+   * 地区名称
+   */
+  areaName?: string;
+
+  /**
+   * 父类ID
+   */
+  parentCode?: number;
+
+  /**
+   * 地区简称
+   */
+  simpleName?: string;
+
+  /**
+   * 地区等级省 1 市 2
+   */
+  level?: number;
+
+  /**
+   * 拼英
+   */
+  pinYin?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+}
+
+export interface AddressareaQuery extends PageQuery {
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 55 - 0
src/api/system/bank/index.ts

@@ -0,0 +1,55 @@
+import request from '@/utils/request';
+import { BankVO, BankQuery, BankForm } from './types';
+
+/**
+ * 查询银行列表
+ */
+export function listBank(query: BankQuery) {
+  return request<any>({
+    url: '/system/bank/list',
+    method: 'get',
+    params: query
+  });
+}
+
+/**
+ * 查询银行详细
+ */
+export function getBank(id: string | number) {
+  return request<any>({
+    url: '/system/bank/' + id,
+    method: 'get'
+  });
+}
+
+/**
+ * 新增银行
+ */
+export function addBank(data: BankForm) {
+  return request<any>({
+    url: '/system/bank',
+    method: 'post',
+    data: data
+  });
+}
+
+/**
+ * 修改银行
+ */
+export function updateBank(data: BankForm) {
+  return request<any>({
+    url: '/system/bank',
+    method: 'put',
+    data: data
+  });
+}
+
+/**
+ * 删除银行
+ */
+export function delBank(id: string | number | Array<string | number>) {
+  return request<any>({
+    url: '/system/bank/' + id,
+    method: 'delete'
+  });
+}

+ 120 - 0
src/api/system/bank/types.ts

@@ -0,0 +1,120 @@
+export interface BankVO {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 网点编号
+   */
+  bnId?: string;
+
+  /**
+   * 网点名称
+   */
+  bnName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 网点地址
+   */
+  bnAddr?: string;
+
+  /**
+   * 网点分类ID
+   */
+  bnCatgId?: string;
+
+  /**
+   * 传真号码
+   */
+  faxNo?: string;
+
+  /**
+   * 联系电话
+   */
+  telNo?: string;
+
+  /**
+   * 是否显示(0-是,1-否)
+   */
+  isShow?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface BankQuery extends PageQuery {
+  /**
+   * 网点编号
+   */
+  bnId?: string;
+
+  /**
+   * 网点名称
+   */
+  bnName?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}
+
+export interface BankForm {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 网点编号
+   */
+  bnId?: string;
+
+  /**
+   * 网点名称
+   */
+  bnName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 网点地址
+   */
+  bnAddr?: string;
+
+  /**
+   * 网点分类ID
+   */
+  bnCatgId?: string;
+
+  /**
+   * 传真号码
+   */
+  faxNo?: string;
+
+  /**
+   * 联系电话
+   */
+  telNo?: string;
+
+  /**
+   * 是否显示(0-是,1-否)
+   */
+  isShow?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}

+ 55 - 0
src/api/system/invoiceType/index.ts

@@ -0,0 +1,55 @@
+import request from '@/utils/request';
+import { InvoiceTypeVO, InvoiceTypeQuery, InvoiceTypeForm } from './types';
+
+/**
+ * 查询发票类型列表
+ */
+export function listInvoiceType(query: InvoiceTypeQuery) {
+  return request<any>({
+    url: '/system/invoiceType/list',
+    method: 'get',
+    params: query
+  });
+}
+
+/**
+ * 查询发票类型详细
+ */
+export function getInvoiceType(id: string | number) {
+  return request<any>({
+    url: '/system/invoiceType/' + id,
+    method: 'get'
+  });
+}
+
+/**
+ * 新增发票类型
+ */
+export function addInvoiceType(data: InvoiceTypeForm) {
+  return request<any>({
+    url: '/system/invoiceType',
+    method: 'post',
+    data: data
+  });
+}
+
+/**
+ * 修改发票类型
+ */
+export function updateInvoiceType(data: InvoiceTypeForm) {
+  return request<any>({
+    url: '/system/invoiceType',
+    method: 'put',
+    data: data
+  });
+}
+
+/**
+ * 删除发票类型
+ */
+export function delInvoiceType(id: string | number | Array<string | number>) {
+  return request<any>({
+    url: '/system/invoiceType/' + id,
+    method: 'delete'
+  });
+}

+ 80 - 0
src/api/system/invoiceType/types.ts

@@ -0,0 +1,80 @@
+export interface InvoiceTypeVO {
+  /**
+   * ID
+   */
+  id?: string | number;
+
+  /**
+   * 发票类型编号
+   */
+  invoiceTypeNo?: string;
+
+  /**
+   * 发票类型名称
+   */
+  invoiceTypeName?: string;
+
+  /**
+   * 是否显示:0-显示,1-隐藏
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface InvoiceTypeQuery extends PageQuery {
+  /**
+   * 发票类型编号
+   */
+  invoiceTypeNo?: string;
+
+  /**
+   * 发票类型名称
+   */
+  invoiceTypeName?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}
+
+export interface InvoiceTypeForm {
+  /**
+   * ID
+   */
+  id?: string | number;
+
+  /**
+   * 发票类型编号
+   */
+  invoiceTypeNo?: string;
+
+  /**
+   * 发票类型名称
+   */
+  invoiceTypeName?: string;
+
+  /**
+   * 是否显示:0-显示,1-隐藏
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}

+ 74 - 3
src/components/Pagination/index.vue

@@ -1,6 +1,33 @@
 <template>
   <div :class="{ hidden: hidden }" class="pagination-container">
+    <!-- 游标分页模式 -->
+    <div v-if="cursorMode" class="cursor-pagination">
+      <el-button
+        :disabled="currentPage === 1"
+        @click="handlePrevPage"
+      >
+        上一页
+      </el-button>
+      <span class="page-info">第 {{ currentPage }} 页</span>
+      <el-button
+        :disabled="!hasMore"
+        @click="handleNextPage"
+      >
+        下一页
+      </el-button>
+      <el-select v-model="pageSize" @change="handleSizeChange" style="width: 100px" class="ml-2">
+        <el-option
+          v-for="size in pageSizes"
+          :key="size"
+          :label="`${size}条/页`"
+          :value="size"
+        />
+      </el-select>
+    </div>
+
+    <!-- 传统分页模式 -->
     <el-pagination
+      v-else
       v-model:current-page="currentPage"
       v-model:page-size="pageSize"
       :background="background"
@@ -22,6 +49,7 @@ const props = defineProps({
   total: propTypes.number,
   page: propTypes.number.def(1),
   limit: propTypes.number.def(20),
+  way: propTypes.number.def(1),
   pageSizes: { type: Array<number>, default: () => [10, 20, 30, 50] },
   // 移动端页码按钮的数量端默认值5
   pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7),
@@ -29,10 +57,14 @@ const props = defineProps({
   background: propTypes.bool.def(true),
   autoScroll: propTypes.bool.def(true),
   hidden: propTypes.bool.def(false),
-  float: propTypes.string.def('right')
+  float: propTypes.string.def('right'),
+  // 游标分页模式
+  cursorMode: propTypes.bool.def(false),
+  // 是否还有更多数据(游标分页使用)
+  hasMore: propTypes.bool.def(true)
 });
 
-const emit = defineEmits(['update:page', 'update:limit', 'pagination']);
+const emit = defineEmits(['update:page', 'update:limit', 'update:way', 'pagination']);
 const currentPage = computed({
   get() {
     return props.page;
@@ -50,7 +82,7 @@ const pageSize = computed({
   }
 });
 function handleSizeChange(val: number) {
-  if (currentPage.value * val > props.total) {
+  if (!props.cursorMode && currentPage.value * val > props.total) {
     currentPage.value = 1;
   }
   emit('pagination', { page: currentPage.value, limit: val });
@@ -64,6 +96,28 @@ function handleCurrentChange(val: number) {
     scrollTo(0, 800);
   }
 }
+// 游标分页:下一页
+function handleNextPage() {
+  if (props.hasMore) {
+    currentPage.value += 1;
+    emit('update:way', 1);
+    emit('pagination', { page: currentPage.value, limit: pageSize.value, way: 1 });
+    if (props.autoScroll) {
+      scrollTo(0, 800);
+    }
+  }
+}
+// 游标分页:上一页
+function handlePrevPage() {
+  if (currentPage.value > 1) {
+    currentPage.value -= 1;
+    emit('update:way', 0);
+    emit('pagination', { page: currentPage.value, limit: pageSize.value, way: 0 });
+    if (props.autoScroll) {
+      scrollTo(0, 800);
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
@@ -71,6 +125,23 @@ function handleCurrentChange(val: number) {
   .el-pagination {
     float: v-bind(float);
   }
+
+  .cursor-pagination {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 16px;
+    float: v-bind(float);
+
+    .page-info {
+      font-size: 14px;
+      color: #606266;
+    }
+
+    .ml-2 {
+      margin-left: 8px;
+    }
+  }
 }
 .pagination-container.hidden {
   display: none;

+ 1 - 1
src/components/RegionCascader/index.vue

@@ -408,4 +408,4 @@ defineExpose({
 .list-body::-webkit-scrollbar-track {
   background: transparent;
 }
-</style>
+</style>

+ 7 - 4
src/enums/supplierStatus.ts

@@ -46,10 +46,13 @@ export const SUPPLIER_STATUS_CONFIG = {
  * @param useOriginalName 是否使用原始名称,true=显示originalName,false=显示displayName
  */
 export const getSupplierStatusOptions = (useOriginalName = false) => {
-  return Object.values(SUPPLIER_STATUS_CONFIG).map(item => ({
-    label: useOriginalName ? item.originalName : item.displayName,
-    value: item.code
-  }));
+  // 过滤掉状态4(待修改审核),只保留0、1、2、3
+  return Object.values(SUPPLIER_STATUS_CONFIG)
+    .filter(item => item.code !== 4)
+    .map(item => ({
+      label: useOriginalName ? item.originalName : item.displayName,
+      value: item.code
+    }));
 };
 
 /**

+ 1 - 1
src/layout/components/Sidebar/Logo.vue

@@ -20,7 +20,7 @@
       <router-link key="collapse" class="sidebar-logo-link" to="/">
         <!-- <img v-if="logo" :src="logo" class="sidebar-logo" /> -->
         <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">
-          优易达-OMS订单管理系统
+          优易达-SCM智能化供应链管理平台
         </h1>
       </router-link>
     </transition>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 417 - 193
src/views/customer/info/detail.vue


+ 179 - 45
src/views/customer/info/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item label="供应商类型" prop="supplierType">
               <el-select v-model="queryParams.supplierType" placeholder="请选择供应商类型" clearable>
-                <el-option v-for="item in supplierTypeList" :key="item.id" :label="item.supplierTypeName" :value="item.supplierTypeName" />
+                <el-option v-for="item in supplierTypeList" :key="item.id" :label="item.supplierTypeName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="供应品牌" prop="operatingBrand">
@@ -20,7 +20,7 @@
             </el-form-item>
             <el-form-item label="供应类别" prop="operatingCategory">
               <el-select v-model="queryParams.operatingCategory" placeholder="请选择供应类别" clearable>
-                <el-option v-for="item in productCategoryList" :key="item.categoryNo" :label="item.categoryName" :value="item.categoryNo" />
+                <el-option v-for="item in productCategoryList" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="供应区域" prop="province">
@@ -31,12 +31,12 @@
             </el-form-item>
             <el-form-item label="产品经理" prop="productManager">
               <el-select v-model="queryParams.productManager" placeholder="请选择产品经理" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item label="采购人员" prop="buyer">
               <el-select v-model="queryParams.buyer" placeholder="请选择采购人员" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item label="状态" prop="supplyStatus">
@@ -67,39 +67,63 @@
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="infoList" @selection-change="handleSelectionChange">
+      <el-table v-loading="loading" border :data="infoList" class="no-resize-table" @selection-change="handleSelectionChange">
+        <el-table-column label="供应商编号" align="center" prop="supplierNo" width="150" fixed="left" />
+        <el-table-column label="供应商名称" align="left" prop="enterpriseName" width="250" fixed="left" />
+        <el-table-column label="供应商类型" align="center" prop="supplierTypeName" width="150">
         
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="供应商编号" align="center" prop="supplierNo" />
-        <el-table-column label="供应商名称" align="center" prop="enterpriseName" />
-        <el-table-column label="供应商类型" align="center" prop="supplierType">
+        </el-table-column>
+        
+        <el-table-column label="产品经理" align="center" prop="productManager" width="120" />
+        <el-table-column label="采购人员" align="center" prop="buyer" width="120" />
+        <el-table-column label="供应品牌" align="center" prop="brandName" width="200" />
+        <el-table-column label="供应区域(省)" align="left" prop="province" width="250">
           <template #default="scope">
-            <span>{{ getSupplierTypeName(scope.row.supplierType) }}</span>
+            <el-tooltip :content="scope.row.province" placement="top" :disabled="!scope.row.province || scope.row.province.split(',').filter(p => p.trim()).length <= 3">
+              <span>{{ formatProvinceDisplay(scope.row.province) }}</span>
+            </el-tooltip>
           </template>
         </el-table-column>
+        <el-table-column label="供应区域(市)" align="left" prop="city" width="300">
+          <template #default="scope">
+            <el-tooltip :content="scope.row.city" placement="top" :disabled="!scope.row.city || scope.row.city.split(',').filter(c => c.trim()).length <= 10">
+              <span>{{ formatCityDisplay(scope.row.city) }}</span>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <el-table-column label="合同到期时间" align="center" prop="contractEndTime" width="150" />
         
-        <el-table-column label="产品经理" align="center" prop="productManager" />
-        <el-table-column label="采购人员" align="center" prop="buyer" />
-        <el-table-column label="供应品牌" align="center" prop="operatingBrand" />
-        <el-table-column label="供应区域(省)" align="center" prop="province" />
-        <el-table-column label="供应区域(市)" align="center" prop="city" />
-        <el-table-column label="合同到期时间" align="center" prop="contractEndTime" />
-        
-        <el-table-column label="合作情况" align="center" prop="cooperative">
+        <el-table-column label="合作情况" align="center" prop="cooperative" width="120">
           <template #default="scope">
             <span>{{ getCooperationStatusDisplayName(scope.row.cooperative) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="审核状态" align="center" prop="supplyStatus">
+        <el-table-column label="审核状态" align="center" prop="supplyStatus" width="120">
           <template #default="scope">
             <span>{{ getStatusDisplayName(scope.row.supplyStatus) }}</span>
           </template>
         </el-table-column>  
-        <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="250" fixed="right">
           <template #default="scope">
-            <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
-            <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
-            <el-button link type="primary" @click="handleStopCooperation(scope.row)" v-hasPermi="['customer:info:edit']">停止合作</el-button>
+            <!-- 状态 0、3、4:待审核、审核未通过、待修改审核 -->
+            <template v-if="scope.row.supplyStatus === '0' || scope.row.supplyStatus === 0 || scope.row.supplyStatus === '3' || scope.row.supplyStatus === 3 || scope.row.supplyStatus === '4' || scope.row.supplyStatus === 4">
+              <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
+              <el-button link type="primary" @click="handleApprove(scope.row)" v-hasPermi="['customer:info:edit']">审核通过</el-button>
+              <el-button link type="danger" @click="handleReject(scope.row)" v-hasPermi="['customer:info:edit']">驳回</el-button>
+            </template>
+            
+            <!-- 状态 1:正式供应商 -->
+            <template v-else-if="scope.row.supplyStatus === '1' || scope.row.supplyStatus === 1">
+              <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
+              <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
+              <el-button link type="primary" @click="handleStopCooperation(scope.row)" v-hasPermi="['customer:info:edit']">停止合作</el-button>
+            </template>
+            
+            <!-- 状态 2:停用 -->
+            <template v-else-if="scope.row.supplyStatus === '2' || scope.row.supplyStatus === 2">
+              <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
+              <el-button link type="primary" @click="handleResumeCooperation(scope.row)" v-hasPermi="['customer:info:edit']">恢复合作</el-button>
+            </template>
           </template>
         </el-table-column>
       </el-table>
@@ -325,7 +349,7 @@ const multiple = ref(true);
 const total = ref(0);
 const supplierTypeList = ref<TypeVO[]>([]);
 const productCategoryList = ref<{ categoryNo: string; categoryName: string; id?: number }[]>([]);
-const comStaffList = ref<{ staffCode: string; staffName: string }[]>([]);
+const comStaffList = ref<{ staffId: string; staffName: string }[]>([]);
 // 使用枚举获取供应商状态选项,搜索框显示原始名称
 const supplierStatusOptions = getSupplierStatusOptions(true);
 console.log('供应商状态选项:', supplierStatusOptions);
@@ -333,7 +357,7 @@ console.log('供应商状态选项:', supplierStatusOptions);
 const queryFormRef = ref<ElFormInstance>();
 const infoFormRef = ref<ElFormInstance>();
 
-const dialog = reactive<DialogOption>({
+const dialog = reactive<DialogOption & { readonly?: boolean }>({
   visible: false,
   title: '',
   readonly: false
@@ -739,13 +763,55 @@ const handleView = (row: InfoVO) => {
 /** 停止合作按钮操作 */
 const handleStopCooperation = async (row: InfoVO) => {
   await proxy?.$modal.confirm('是否确认停止与供应商"' + row.enterpriseName + '"的合作?');
-  // 这里调用停止合作的API,暂时使用更新接口
-  const updateData = { ...row, cooperative: 0 }; // 0表示未合作
+  // 只传id和supplyStatus
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '2' 
+  };
   await updateInfo(updateData);
   proxy?.$modal.msgSuccess("操作成功");
   await getList();
 }
 
+/** 审核通过按钮操作 */
+const handleApprove = async (row: InfoVO) => {
+  await proxy?.$modal.confirm('是否确认审核通过供应商"' + row.enterpriseName + '"?');
+  // 只传id和supplyStatus,避免将后端返回的名字字段传回去
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '1' 
+  };
+  await updateInfo(updateData);
+  proxy?.$modal.msgSuccess("审核通过");
+  await getList();
+}
+
+/** 驳回按钮操作 */
+const handleReject = async (row: InfoVO) => {
+  await proxy?.$modal.confirm('是否确认驳回供应商"' + row.enterpriseName + '"的审核?');
+  // 只传id和supplyStatus
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '3' 
+  };
+  await updateInfo(updateData);
+  proxy?.$modal.msgSuccess("已驳回");
+  await getList();
+}
+
+/** 恢复合作按钮操作 */
+const handleResumeCooperation = async (row: InfoVO) => {
+  await proxy?.$modal.confirm('是否确认恢复与供应商"' + row.enterpriseName + '"的合作?');
+  // 只传id和supplyStatus
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '1' 
+  };
+  await updateInfo(updateData);
+  proxy?.$modal.msgSuccess("已恢复合作");
+  await getList();
+}
+
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download('customer/info/export', {
@@ -760,7 +826,7 @@ const getSupplierTypeList = async () => {
       pageNum: 1,
       pageSize: 1000
     } as any);
-    supplierTypeList.value = res.data || [];
+    supplierTypeList.value = res.rows || [];
   } catch (e) {
     console.error('获取供应商类型失败', e);
   }
@@ -791,10 +857,19 @@ const getComStaffData = async () => {
   }
 }
 
-/** 根据供应商类型名称获取显示名称 */
-const getSupplierTypeName = (typeName: string) => {
-  const item = supplierTypeList.value.find(t => t.supplierTypeName === typeName);
-  return item ? item.supplierTypeName : typeName;
+/** 根据供应商类型ID或名称获取显示名称 */
+const getSupplierTypeName = (typeValue: string | number) => {
+  if (!typeValue) return '';
+  
+  // 先尝试按 ID 匹配
+  let item = supplierTypeList.value.find(t => t.id === typeValue);
+  
+  // 如果按 ID 没找到,再尝试按名称匹配
+  if (!item) {
+    item = supplierTypeList.value.find(t => t.supplierTypeName === typeValue);
+  }
+  
+  return item ? item.supplierTypeName : String(typeValue);
 };
 
 /** 根据categoryNo获取categoryName */
@@ -803,10 +878,10 @@ const getCategoryName = (categoryNo: string) => {
   return item ? item.categoryName : categoryNo;
 }
 
-/** 根据staffCode获取staffName */
-const getStaffName = (staffCode: string) => {
-  const item = comStaffList.value.find(s => s.staffCode === staffCode);
-  return item ? item.staffName : staffCode;
+/** 根据staffId获取staffName */
+const getStaffName = (staffId: string) => {
+  const item = comStaffList.value.find(s => s.staffId === staffId);
+  return item ? item.staffName : staffId;
 }
 
 /** 根据状态码获取状态显示名称 */
@@ -819,6 +894,24 @@ const getCooperationStatusDisplayName = (statusCode: number) => {
   return getSupplierCooperationStatusDisplayName(statusCode);
 }
 
+/** 格式化省份显示:显示前3个省份,其余用...表示 */
+const formatProvinceDisplay = (province: string) => {
+  if (!province) return '';
+  const provinces = province.split(',').filter(p => p.trim());
+  if (provinces.length === 0) return '';
+  if (provinces.length <= 3) return provinces.join(',');
+  return `${provinces.slice(0, 3).join(',')}...`;
+};
+
+/** 格式化城市显示:显示前10个城市,其余用...表示 */
+const formatCityDisplay = (city: string) => {
+  if (!city) return '';
+  const cities = city.split(',').filter(c => c.trim());
+  if (cities.length === 0) return '';
+  if (cities.length <= 10) return cities.join(',');
+  return `${cities.slice(0, 10).join(',')}...`;
+};
+
 onMounted(async () => {
   getSupplierTypeList();
   getProductCategoryData();
@@ -837,13 +930,29 @@ onMounted(async () => {
   }
   
   getList();
+  
+  // 禁用表格列宽调整
+  nextTick(() => {
+    const table = document.querySelector('.no-resize-table');
+    if (table) {
+      table.addEventListener('mousedown', (e: any) => {
+        const target = e.target as HTMLElement;
+        // 阻止在表头边界处的鼠标按下事件
+        if (target.classList.contains('el-table__column-resize-proxy') || 
+            target.closest('.el-table__column-resize-proxy')) {
+          e.preventDefault();
+          e.stopPropagation();
+          return false;
+        }
+      }, true);
+    }
+  });
 });
 </script>
 
 <style scoped>
 :deep(.el-form-item__label) {
   text-align: left !important;
-  font-size: 16px;
 }
 
 :deep(.el-form-item) {
@@ -851,20 +960,45 @@ onMounted(async () => {
   margin-bottom: 20px;
 }
 
-:deep(.el-input__wrapper) {
-  font-size: 15px;
+/* 禁用表格列宽拖动 */
+.no-resize-table :deep(th.el-table__cell) {
+  user-select: none !important;
+  resize: none !important;
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper th) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper .el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper) {
+  cursor: default !important;
+}
+
+/* 隐藏列宽调整的分隔线悬停效果 */
+.no-resize-table :deep(th.el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header th.el-table__cell) {
+  border-right: 1px solid #EBEEF5;
 }
 
-:deep(.el-input__inner) {
-  font-size: 15px;
+/* 禁用拖动事件 */
+.no-resize-table :deep(.el-table__header-wrapper) {
+  pointer-events: auto;
 }
 
-:deep(.el-select) {
-  font-size: 15px;
+.no-resize-table :deep(.el-table__header th) {
+  pointer-events: auto;
 }
 
-:deep(.el-select .el-input__inner) {
-  font-size: 15px;
+.no-resize-table :deep(.el-table__header .cell) {
+  pointer-events: auto;
 }
 </style>
 

+ 156 - 44
src/views/supplier/approve/index.vue

@@ -12,7 +12,7 @@
             </el-form-item>
             <el-form-item label="供应商类型" prop="supplierType">
               <el-select v-model="queryParams.supplierType" placeholder="请选择供应商类型" clearable>
-                <el-option v-for="item in supplierTypeList" :key="item.id" :label="item.supplierTypeName" :value="item.supplierTypeName" />
+                <el-option v-for="item in supplierTypeList" :key="item.id" :label="item.supplierTypeName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="供应品牌" prop="operatingBrand">
@@ -20,7 +20,7 @@
             </el-form-item>
             <el-form-item label="供应类别" prop="operatingCategory">
               <el-select v-model="queryParams.operatingCategory" placeholder="请选择供应类别" clearable>
-                <el-option v-for="item in productCategoryList" :key="item.categoryNo" :label="item.categoryName" :value="item.categoryNo" />
+                <el-option v-for="item in productCategoryList" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="供应区域" prop="province">
@@ -31,12 +31,12 @@
             </el-form-item>
             <el-form-item label="产品经理" prop="productManager">
               <el-select v-model="queryParams.productManager" placeholder="请选择产品经理" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item label="采购人员" prop="buyer">
               <el-select v-model="queryParams.buyer" placeholder="请选择采购人员" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item label="状态" prop="supplyStatus">
@@ -57,53 +57,73 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5" >
-           供应商信息列表
-          </el-col>
-
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['customer:info:add']">新增供应商</el-button>
+           供应商审核信息列表
           </el-col>
 
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="infoList" @selection-change="handleSelectionChange">
-
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="供应商编号" align="center" prop="supplierNo" />
-        <el-table-column label="供应商名称" align="center" prop="enterpriseName" />
+      <el-table v-loading="loading" border :data="infoList" class="no-resize-table" @selection-change="handleSelectionChange">
+        <el-table-column label="供应商编号" align="center" prop="supplierNo" width="150" fixed="left" />
+        <el-table-column label="供应商名称" align="left" prop="enterpriseName" width="250" fixed="left" />
 
-        <el-table-column label="企业规模" align="center" prop="membershipSize">
+        <el-table-column label="企业规模" align="center" prop="enterpriseScaleName" width="120">
+          
+        </el-table-column>
+        <el-table-column label="注册时间" align="center" prop="createTime" width="150">
+          <template #default="scope">
+            <span>{{ formatDate(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="经营类目" align="center" prop="operatingCategory" width="150" />
+        <el-table-column label="供应品牌" align="center" prop="brandName" width="200" />
+        <el-table-column label="供应区域(省)" align="left" prop="province" width="250">
           <template #default="scope">
-            <span>{{ getMembershipSizeLabel(scope.row.membershipSize) }}</span>
+            <el-tooltip :content="scope.row.province" placement="top" :disabled="!scope.row.province || scope.row.province.split(',').filter(p => p.trim()).length <= 3">
+              <span>{{ formatProvinceDisplay(scope.row.province) }}</span>
+            </el-tooltip>
           </template>
         </el-table-column>
-        <el-table-column label="注册时间" align="center" prop="createTime">
+        <el-table-column label="供应区域(市)" align="left" prop="city" width="300">
           <template #default="scope">
-            <span>{{ formatDate(scope.row.createTime) }}</span>
+            <el-tooltip :content="scope.row.city" placement="top" :disabled="!scope.row.city || scope.row.city.split(',').filter(c => c.trim()).length <= 10">
+              <span>{{ formatCityDisplay(scope.row.city) }}</span>
+            </el-tooltip>
           </template>
         </el-table-column>
-        <el-table-column label="经营类目" align="center" prop="operatingCategory" />
-        <el-table-column label="供应品牌" align="center" prop="operatingBrand" />
-        <el-table-column label="供应区域(省)" align="center" prop="province" />
-        <el-table-column label="供应区域(市)" align="center" prop="city" />
-        <el-table-column label="合同到期时间" align="center" prop="contractEndTime" />
+        <el-table-column label="合同到期时间" align="center" prop="contractEndTime" width="180" />
 
-        <el-table-column label="合作情况" align="center" prop="cooperative">
+        <el-table-column label="合作情况" align="center" prop="cooperative" width="120">
           <template #default="scope">
             <span>{{ getCooperationStatusDisplayName(scope.row.cooperative) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="审核状态" align="center" prop="supplyStatus">
+        <el-table-column label="审核状态" align="center" prop="supplyStatus" width="180">
           <template #default="scope">
             <span>{{ getStatusDisplayName(scope.row.supplyStatus) }}</span>
           </template>
         </el-table-column>
-        <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="250" fixed="right">
           <template #default="scope">
-            <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
-            <el-button link type="primary" @click="handleApprove(scope.row)" v-hasPermi="['customer:info:edit']">审核通过</el-button>
-            <el-button link type="primary" @click="handleReject(scope.row)" v-hasPermi="['customer:info:edit']">驳回</el-button>
+            <!-- 状态 0、3、4:待审核、审核未通过、待修改审核 -->
+            <template v-if="scope.row.supplyStatus === '0' || scope.row.supplyStatus === 0 || scope.row.supplyStatus === '3' || scope.row.supplyStatus === 3 || scope.row.supplyStatus === '4' || scope.row.supplyStatus === 4">
+              <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
+              <el-button link type="primary" @click="handleApprove(scope.row)" v-hasPermi="['customer:info:edit']">审核通过</el-button>
+              <el-button link type="danger" @click="handleReject(scope.row)" v-hasPermi="['customer:info:edit']">驳回</el-button>
+            </template>
+            
+            <!-- 状态 1:正式供应商 -->
+            <template v-else-if="scope.row.supplyStatus === '1' || scope.row.supplyStatus === 1">
+              <el-button link type="primary" @click="handleView(scope.row)" v-hasPermi="['customer:info:query']">查看</el-button>
+              <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
+              <el-button link type="primary" @click="handleStopCooperation(scope.row)" v-hasPermi="['customer:info:edit']">停止合作</el-button>
+            </template>
+            
+            <!-- 状态 2:停用 -->
+            <template v-else-if="scope.row.supplyStatus === '2' || scope.row.supplyStatus === 2">
+              <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
+              <el-button link type="primary" @click="handleResumeCooperation(scope.row)" v-hasPermi="['customer:info:edit']">恢复合作</el-button>
+            </template>
           </template>
         </el-table-column>
       </el-table>
@@ -329,7 +349,7 @@ const multiple = ref(true);
 const total = ref(0);
 const supplierTypeList = ref<TypeVO[]>([]);
 const productCategoryList = ref<{ categoryNo: string; categoryName: string; id?: number }[]>([]);
-const comStaffList = ref<{ staffCode: string; staffName: string }[]>([]);
+const comStaffList = ref<{ staffId: string; staffName: string }[]>([]);
 const membershipSizeDict = ref<any[]>([]); // 企业规模字典
 // 使用枚举获取供应商状态选项,搜索框显示原始名称
 const supplierStatusOptions = getSupplierStatusOptions(true);
@@ -338,7 +358,7 @@ console.log('供应商状态选项:', supplierStatusOptions);
 const queryFormRef = ref<ElFormInstance>();
 const infoFormRef = ref<ElFormInstance>();
 
-const dialog = reactive<DialogOption>({
+const dialog = reactive<DialogOption & { readonly?: boolean }>({
   visible: false,
   title: '',
   readonly: false
@@ -761,9 +781,10 @@ const handleView = (row: InfoVO) => {
 const handleApprove = async (row: InfoVO) => {
   await proxy?.$modal.confirm('是否确认审核通过供应商"' + row.enterpriseName + '"?');
   try {
+    // 只传id和supplyStatus,避免将后端返回的名字字段传回去
     await updateInfo({ 
-      ...row,
-      supplyStatus: 1 
+      id: row.id,
+      supplyStatus: '1' 
     });
     proxy?.$modal.msgSuccess("审核通过成功");
     await getList();
@@ -776,9 +797,10 @@ const handleApprove = async (row: InfoVO) => {
 const handleReject = async (row: InfoVO) => {
   await proxy?.$modal.confirm('是否确认驳回供应商"' + row.enterpriseName + '"?');
   try {
+    // 只传id和supplyStatus
     await updateInfo({ 
-      ...row,
-      supplyStatus: 3 
+      id: row.id,
+      supplyStatus: '3' 
     });
     proxy?.$modal.msgSuccess("驳回成功");
     await getList();
@@ -790,13 +812,29 @@ const handleReject = async (row: InfoVO) => {
 /** 停止合作按钮操作 */
 const handleStopCooperation = async (row: InfoVO) => {
   await proxy?.$modal.confirm('是否确认停止与供应商"' + row.enterpriseName + '"的合作?');
-  // 这里调用停止合作的API,暂时使用更新接口
-  const updateData = { ...row, cooperative: 0 }; // 0表示未合作
+  // 只传id和supplyStatus
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '2' 
+  };
   await updateInfo(updateData);
   proxy?.$modal.msgSuccess("操作成功");
   await getList();
 }
 
+/** 恢复合作按钮操作 */
+const handleResumeCooperation = async (row: InfoVO) => {
+  await proxy?.$modal.confirm('是否确认恢复与供应商"' + row.enterpriseName + '"的合作?');
+  // 只传id和supplyStatus
+  const updateData = { 
+    id: row.id, 
+    supplyStatus: '1' 
+  };
+  await updateInfo(updateData);
+  proxy?.$modal.msgSuccess("已恢复合作");
+  await getList();
+}
+
 /** 导出按钮操作 */
 const handleExport = () => {
   proxy?.download('customer/info/export', {
@@ -804,7 +842,6 @@ const handleExport = () => {
   }, `info_${new Date().getTime()}.xlsx`)
 }
 
-/** 获取供应商类型列表 */
 /** 获取供应商类型列表 */
 const getSupplierTypeList = async () => {
   try {
@@ -812,7 +849,7 @@ const getSupplierTypeList = async () => {
       pageNum: 1,
       pageSize: 1000
     } as any);
-    supplierTypeList.value = res.data || [];
+    supplierTypeList.value = res.rows || [];
   } catch (e) {
     console.error('获取供应商类型失败', e);
   }
@@ -855,10 +892,10 @@ const getCategoryName = (categoryNo: string) => {
   return item ? item.categoryName : categoryNo;
 }
 
-/** 根据staffCode获取staffName */
-const getStaffName = (staffCode: string) => {
-  const item = comStaffList.value.find(s => s.staffCode === staffCode);
-  return item ? item.staffName : staffCode;
+/** 根据staffId获取staffName */
+const getStaffName = (staffId: string) => {
+  const item = comStaffList.value.find(s => s.staffId === staffId);
+  return item ? item.staffName : staffId;
 }
 
 /** 根据状态码获取状态显示名称 */
@@ -871,6 +908,24 @@ const getCooperationStatusDisplayName = (statusCode: number) => {
   return getSupplierCooperationStatusDisplayName(statusCode);
 }
 
+/** 格式化省份显示:只显示第一个省份,其余用...表示 */
+const formatProvinceDisplay = (province: string) => {
+  if (!province) return '';
+  const provinces = province.split(',').filter(p => p.trim());
+  if (provinces.length === 0) return '';
+  if (provinces.length === 1) return provinces[0];
+  return `${provinces[0]}...`;
+};
+
+/** 格式化城市显示:显示前10个城市,其余用...表示 */
+const formatCityDisplay = (city: string) => {
+  if (!city) return '';
+  const cities = city.split(',').filter(c => c.trim());
+  if (cities.length === 0) return '';
+  if (cities.length <= 10) return cities.join(',');
+  return `${cities.slice(0, 10).join(',')}...`;
+};
+
 onMounted(async () => {
   getSupplierTypeList();
   getProductCategoryData();
@@ -890,13 +945,29 @@ onMounted(async () => {
   }
 
   getList();
+  
+  // 禁用表格列宽调整
+  nextTick(() => {
+    const table = document.querySelector('.no-resize-table');
+    if (table) {
+      table.addEventListener('mousedown', (e: any) => {
+        const target = e.target as HTMLElement;
+        // 阻止在表头边界处的鼠标按下事件
+        if (target.classList.contains('el-table__column-resize-proxy') || 
+            target.closest('.el-table__column-resize-proxy')) {
+          e.preventDefault();
+          e.stopPropagation();
+          return false;
+        }
+      }, true);
+    }
+  });
 });
 </script>
 
 <style scoped>
 :deep(.el-form-item__label) {
   text-align: left !important;
-  font-size: 16px;
 }
 
 :deep(.el-form-item) {
@@ -904,6 +975,47 @@ onMounted(async () => {
   margin-bottom: 20px;
 }
 
+/* 禁用表格列宽拖动 */
+.no-resize-table :deep(th.el-table__cell) {
+  user-select: none !important;
+  resize: none !important;
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper th) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper .el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper) {
+  cursor: default !important;
+}
+
+/* 隐藏列宽调整的分隔线悬停效果 */
+.no-resize-table :deep(th.el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header th.el-table__cell) {
+  border-right: 1px solid #EBEEF5;
+}
+
+/* 禁用拖动事件 */
+.no-resize-table :deep(.el-table__header-wrapper) {
+  pointer-events: auto;
+}
+
+.no-resize-table :deep(.el-table__header th) {
+  pointer-events: auto;
+}
+
+.no-resize-table :deep(.el-table__header .cell) {
+  pointer-events: auto;
+}
+
 :deep(.el-input__wrapper) {
   font-size: 15px;
 }

+ 5 - 1
src/views/supplier/contact/index.vue

@@ -3,7 +3,7 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
             <el-form-item label="供应商编号" prop="supplierNo">
               <el-input v-model="queryParams.supplierNo" placeholder="请输入供应商编号" clearable @keyup.enter="handleQuery" />
             </el-form-item>
@@ -444,3 +444,7 @@ onMounted(() => {
   getSupplierList();
 });
 </script>
+
+<style scoped>
+
+</style>

+ 2 - 3
src/views/supplier/contract/add.vue

@@ -128,7 +128,7 @@
                 v-model="form.contractAttachment" 
                 :file-type="['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'pdf']"
                 :file-size="50"
-                :limit="10"
+                :limit="1"
               />
             </el-form-item>
           </el-col>
@@ -148,7 +148,7 @@
         </el-row>
 
         <el-row>
-          <el-col :span="24" style="text-align: left;">
+          <el-col :span="24" style="text-align: center;">
             <el-button type="primary" @click="handleSubmit">提交</el-button>
           </el-col>
         </el-row>
@@ -313,7 +313,6 @@ onMounted(() => {
 }
 
 .header-title {
-  font-size: 16px;
   font-weight: 500;
   color: #333;
 }

+ 361 - 8
src/views/supplier/contract/detail.vue

@@ -54,7 +54,7 @@
         <el-form-item>
           <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
           <el-button icon="Refresh" @click="handleReset">重置</el-button>
-          <el-button type="success" @click="handleAdd">创建合同</el-button>
+          <el-button type="primary" @click="handleAdd">创建合同</el-button>
         </el-form-item>
       </el-form>
     </el-card>
@@ -102,15 +102,185 @@
             <span>{{ getContractStatusText(scope.row.contractStatus) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="120">
+        <el-table-column label="操作" align="center" width="150">
           <template #default="scope">
+            <!-- 待审核状态:可以修改和查看 -->
+            <template v-if="scope.row.contractStatus === 0 || scope.row.contractStatus === '0'">
+              <el-button link type="primary" @click="handleEdit(scope.row)">修改</el-button>
+              <el-button link type="success" @click="handleView(scope.row)">查看</el-button>
+            </template>
             
+            <!-- 已生效状态:只能查看 -->
+            <template v-if="scope.row.contractStatus === 1 || scope.row.contractStatus === '1'">
+              <el-button link type="primary" @click="handleView(scope.row)">查看</el-button>
+            </template>
+            
+            <!-- 已过期状态:无操作按钮 -->
+            <template v-if="scope.row.contractStatus === 3 || scope.row.contractStatus === '3'">
+              <span style="color: #999;">-</span>
+            </template>
           </template>
         </el-table-column>
       </el-table>
       
       
     </el-card>
+
+    <!-- 合同管理对话框 -->
+    <el-dialog
+      v-model="contractDialogVisible"
+      :title="contractDialogTitle"
+      width="900px"
+      :close-on-click-modal="false"
+    >
+      <el-form
+        ref="contractFormRef"
+        :model="contractForm"
+        :rules="contractFormRules"
+        label-width="140px"
+        :disabled="contractDialogReadonly"
+      >
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="合同名称:" prop="contractName">
+              <el-input v-model="contractForm.contractName" placeholder="请输入合同名称" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="合同类型:" prop="contractType">
+              <el-select v-model="contractForm.contractType" placeholder="请选择" 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="12">
+            <el-form-item label="提醒时间:" prop="demandReminderTime">
+              <el-input-number
+                v-model="contractForm.demandReminderTime"
+                :min="1"
+                :max="365"
+                style="width: 150px;"
+              />
+              <span style="margin-left: 10px;">天</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="开始时间:" prop="contractStartTime">
+              <el-date-picker
+                v-model="contractForm.contractStartTime"
+                type="date"
+                placeholder="请选择"
+                style="width: 100%;"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="截止时间:" prop="contractEndTime">
+              <el-date-picker
+                v-model="contractForm.contractEndTime"
+                type="date"
+                placeholder="请选择"
+                style="width: 100%;"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="开票类型:" prop="invoiceType">
+              <el-select v-model="contractForm.invoiceType" placeholder="请选择" style="width: 100%;">
+                <el-option
+                  v-for="item in invoiceTypeList"
+                  :key="item.id"
+                  :label="item.invoiceTypeName"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="合同金额:" prop="contractAmount">
+              <el-input v-model="contractForm.contractAmount" placeholder="请输入">
+                <template #append>万元</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="税率:" prop="taxRate">
+              <el-select v-model="contractForm.taxRate" placeholder="请选择" style="width: 100%;">
+                <el-option
+                  v-for="item in taxRateList"
+                  :key="item.id"
+                  :label="item.taxrateName"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="结算方式:" prop="settlementMethod">
+              <el-select v-model="contractForm.settlementMethod" placeholder="请选择" style="width: 100%;">
+                <el-option
+                  v-for="item in settlementMethodList"
+                  :key="item.id"
+                  :label="item.settlementName"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="合同附件:" prop="contractAttachment">
+              <FileUpload
+                v-model="contractForm.contractAttachment"
+                :limit="1"
+                :file-size="50"
+                :file-type="['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'pdf']"
+                :disabled="contractDialogReadonly"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="合同说明:" prop="contractDescription">
+              <el-input
+                v-model="contractForm.contractDescription"
+                type="textarea"
+                :rows="4"
+                placeholder="请输入合同说明"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <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>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -118,7 +288,11 @@
 import { ref, onMounted, nextTick } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { ArrowLeft } from '@element-plus/icons-vue';
-import { getContractListById, getDictData } from '@/api/customer/info';
+import { getContractListById, getDictData, getTaxRateList, getSettlementMethodList, getInvoiceTypeList } from '@/api/customer/info';
+import { updateContract } from '@/api/supplier/contract';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import FileUpload from '@/components/FileUpload/index.vue';
+import { listByIds } from '@/api/system/oss';
 
 const route = useRoute();
 const router = useRouter();
@@ -126,9 +300,51 @@ const router = useRouter();
 const loading = ref(false);
 const contractList = ref<any[]>([]);
 
+// 对话框相关
+const contractDialogVisible = ref(false);
+const contractDialogTitle = ref('');
+const contractDialogReadonly = ref(false);
+const contractSubmitLoading = ref(false);
+const contractFormRef = ref();
+
+// 合同表单
+const contractForm = ref({
+  id: '',
+  contractName: '',
+  contractType: '',
+  demandReminderTime: 4,
+  contractStartTime: '',
+  contractEndTime: '',
+  invoiceType: '',
+  contractAmount: '',
+  taxRate: '',
+  settlementMethod: '',
+  contractAttachment: '',
+  contractDescription: ''
+});
+
+// 表单验证规则
+const contractFormRules = {
+  contractName: [
+    { required: true, message: '请输入合同名称', trigger: 'blur' }
+  ],
+  contractType: [
+    { required: true, message: '请选择合同类型', trigger: 'change' }
+  ],
+  contractStartTime: [
+    { required: true, message: '请选择开始时间', trigger: 'change' }
+  ],
+  contractEndTime: [
+    { required: true, message: '请选择截止时间', trigger: 'change' }
+  ]
+};
+
 // 数据字典
 const contractStatusDict = ref<any[]>([]);
 const contractTypeDict = ref<any[]>([]);
+const taxRateList = ref<any[]>([]);
+const settlementMethodList = ref<any[]>([]);
+const invoiceTypeList = ref<any[]>([]);
 
 const queryParams = ref({
   contractNo: '',
@@ -170,6 +386,36 @@ const getContractTypeDict = async () => {
   }
 };
 
+/** 获取税率列表 */
+const getTaxRateData = async () => {
+  try {
+    const res = await getTaxRateList();
+    taxRateList.value = res.rows || res.data || [];
+  } catch (e) {
+    console.error('获取税率列表失败:', e);
+  }
+};
+
+/** 获取结算方式列表 */
+const getSettlementMethodData = async () => {
+  try {
+    const res = await getSettlementMethodList();
+    settlementMethodList.value = res.rows || res.data || [];
+  } catch (e) {
+    console.error('获取结算方式列表失败:', e);
+  }
+};
+
+/** 获取发票类型列表 */
+const getInvoiceTypeData = async () => {
+  try {
+    const res = await getInvoiceTypeList();
+    invoiceTypeList.value = res.rows || res.data || [];
+  } catch (e) {
+    console.error('获取发票类型列表失败:', e);
+  }
+};
+
 /** 根据字典值获取标签 */
 const getDictLabel = (dictList: any[], dictValue: string | number) => {
   if (!dictValue && dictValue !== 0) return '-';
@@ -240,17 +486,106 @@ const handleAdd = () => {
 
 /** 查看合同 */
 const handleView = (row: any) => {
-  console.log('查看合同:', row);
+  contractForm.value = { ...row };
+  contractDialogTitle.value = '查看合同';
+  contractDialogReadonly.value = true;
+  contractDialogVisible.value = true;
 };
 
 /** 编辑合同 */
 const handleEdit = (row: any) => {
-  console.log('编辑合同:', row);
+  contractForm.value = { ...row };
+  contractDialogTitle.value = '修改合同';
+  contractDialogReadonly.value = false;
+  contractDialogVisible.value = true;
+};
+
+/** 提交合同表单 */
+const handleContractSubmit = async () => {
+  contractFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      contractSubmitLoading.value = true;
+      try {
+        await updateContract(contractForm.value);
+        ElMessage.success('修改成功');
+        contractDialogVisible.value = false;
+        // 刷新列表
+        getContractList();
+      } catch (e) {
+        console.error('修改合同失败:', e);
+        ElMessage.error('修改失败');
+      } finally {
+        contractSubmitLoading.value = false;
+      }
+    }
+  });
 };
 
 /** 查看附件 */
-const handleViewAttachment = (row: any) => {
-  console.log('查看附件:', row);
+const handleViewAttachment = async (row: any) => {
+  if (!row.contractAttachment) {
+    ElMessage.warning('暂无附件可下载');
+    return;
+  }
+
+  try {
+    // 通过文件ID获取文件信息
+    const res = await listByIds(row.contractAttachment);
+    if (res.data && res.data.length > 0) {
+      const file = res.data[0];
+      
+      // 使用fetch获取文件并强制下载
+      const response = await fetch(file.url);
+      const blob = await response.blob();
+      
+      // 创建下载链接
+      const url = window.URL.createObjectURL(blob);
+      const link = document.createElement('a');
+      link.href = url;
+      link.download = file.originalName || (row.contractName ? `${row.contractName}_合同附件` : '合同附件');
+      link.style.display = 'none';
+      
+      document.body.appendChild(link);
+      link.click();
+      document.body.removeChild(link);
+      
+      // 清理URL对象
+      window.URL.revokeObjectURL(url);
+      
+      ElMessage({ message: '开始下载', type: 'info' });
+    } else {
+      ElMessage.warning('未找到附件文件');
+    }
+  } catch (e) {
+    console.error('下载附件失败:', e);
+    ElMessage.error('下载失败');
+  }
+};
+
+/** 审核通过 */
+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('审核失败');
+    }
+  }
 };
 
 /** 格式化日期 */
@@ -281,6 +616,9 @@ onMounted(async () => {
   await nextTick();
   getContractStatusDict();
   getContractTypeDict();
+  getTaxRateData();
+  getSettlementMethodData();
+  getInvoiceTypeData();
   getContractList();
 });
 </script>
@@ -313,7 +651,6 @@ onMounted(async () => {
 }
 
 .header-title {
-  font-size: 16px;
   font-weight: 500;
   color: #333;
 }
@@ -334,4 +671,20 @@ onMounted(async () => {
   padding-bottom: 12px;
   border-bottom: 1px solid #e8e8e8;
 }
+
+.contract-detail {
+  padding: 20px 0;
+}
+
+.contract-detail h4 {
+  margin: 20px 0 10px 0;
+  color: #333;
+  font-weight: 500;
+}
+
+.contract-detail p {
+  margin: 0;
+  color: #666;
+  line-height: 1.6;
+}
 </style>

+ 5 - 14
src/views/supplier/contract/index.vue

@@ -3,7 +3,7 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
             <el-form-item label="供应商编号" prop="supplierNo">
               <el-input v-model="queryParams.supplierNo" placeholder="请输入供应商编号" clearable @keyup.enter="handleQuery" />
             </el-form-item>
@@ -23,19 +23,7 @@
     <el-card shadow="never">
       <template #header>
         <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['supplier:contract:add']">新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['supplier:contract:edit']">修改</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['supplier:contract:remove']">删除</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['supplier:contract:export']">导出</el-button>
-          </el-col>
-          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+          合同管理信息列表
         </el-row>
       </template>
 
@@ -218,3 +206,6 @@ onMounted(() => {
   getList();
 });
 </script>
+
+<style scoped>
+</style>

+ 53 - 208
src/views/supplier/contractsupply/add.vue

@@ -90,8 +90,7 @@
         <!-- 商品列表 -->
         <div class="section-title">
           <el-button type="primary" @click="handleAddProduct">添加商品信息</el-button>
-          <el-button type="success" @click="handleImport">导入</el-button>
-          <el-button type="warning" @click="handleExport">导出</el-button>
+          <el-button type="warning" @click="console.log('当前商品列表:', productList)">查看商品数据</el-button>
         </div>
 
         <el-table :data="productList" border style="width: 100%; margin-top: 20px;">
@@ -110,16 +109,30 @@
           <el-table-column prop="productType" label="产品类型" align="center" width="120" />
           <el-table-column prop="brand" label="品牌" align="center" width="100" />
           <el-table-column prop="unit" label="单位" align="center" width="80" />
-          <el-table-column prop="marketPrice" label="市场价" align="center" width="100" />
-          <el-table-column prop="platformPrice" label="平台价" align="center" width="100" />
+          <el-table-column label="市场价" align="center" width="100">
+            <template #default="scope">
+              <span>¥{{ scope.row.marketPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="平台价" align="center" width="100">
+            <template #default="scope">
+              <span>¥{{ scope.row.platformPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="供应价(元)" align="center" width="120">
             <template #default="scope">
-              <el-input v-model="scope.row.offerPrice" placeholder="请输入" />
+              <el-input 
+                v-model="scope.row.offerPrice" 
+                placeholder="请输入"
+              />
             </template>
           </el-table-column>
           <el-table-column label="供应时效" align="center" width="120">
             <template #default="scope">
-              <el-input v-model="scope.row.supplyCycle" placeholder="请输入" />
+              <el-input 
+                v-model="scope.row.supplyCycle" 
+                placeholder="请输入"
+              />
             </template>
           </el-table-column>
           <el-table-column label="上架状态" align="center" width="100">
@@ -134,9 +147,6 @@
           </el-table-column>
         </el-table>
 
-        <div style="text-align: center; margin-top: 20px;">
-          <el-checkbox v-model="form.isSubmit">提交</el-checkbox>
-        </div>
 
         <el-row style="margin-top: 20px;">
           <el-col :span="24" style="text-align: center;">
@@ -147,82 +157,11 @@
     </el-card>
 
     <!-- 添加商品对话框 -->
-    <el-dialog title="添加商品报价" v-model="productDialog.visible" width="90%" append-to-body>
-      <div class="mb-4">
-        <el-form :inline="true" :model="productQuery">
-          <el-form-item label="产品编号">
-            <el-input v-model="productQuery.productNo" placeholder="请输入产品编号" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="产品名称">
-            <el-input v-model="productQuery.itemName" placeholder="请输入产品名称" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="品牌名称">
-            <el-input v-model="productQuery.brandName" placeholder="请输入品牌名称" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="上架状态">
-            <el-select v-model="productQuery.productStatus" placeholder="请选择" clearable style="width: 150px;">
-              <el-option label="上架" :value="1" />
-              <el-option label="下架" :value="0" />
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleProductQuery">搜索</el-button>
-            <el-button icon="Refresh" @click="resetProductQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-
-      <el-table 
-        :data="productListData" 
-        border 
-        style="width: 100%;"
-        @selection-change="handleProductSelectionChange"
-      >
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column prop="productNo" label="产品编号" align="center" width="120" />
-        <el-table-column label="产品图片" align="center" width="100">
-          <template #default="scope">
-            <el-image 
-              v-if="scope.row.productImage" 
-              :src="scope.row.productImage" 
-              style="width: 60px; height: 60px;"
-              fit="cover"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column prop="itemName" label="产品名称" align="center" show-overflow-tooltip />
-        <el-table-column prop="brandName" label="品牌" align="center" width="120" />
-        <el-table-column prop="unitName" label="单位" align="center" width="80" />
-        <el-table-column prop="marketPrice" label="市场价" align="center" width="100" />
-        <el-table-column prop="memberPrice" label="平台价" align="center" width="100" />
-        <el-table-column prop="minOrderQuantity" label="起订量" align="center" width="100" />
-        <el-table-column label="上架状态" align="center" width="100">
-          <template #default="scope">
-            <span>{{ scope.row.productStatus === 1 ? '上架' : '下架' }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" width="100">
-          <template #default="scope">
-            <el-button link type="primary" @click="handleAddToList(scope.row)">加入清单</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination 
-        v-show="productTotal > 0" 
-        :total="productTotal" 
-        v-model:page="productQuery.pageNum" 
-        v-model:limit="productQuery.pageSize"
-        @pagination="getProductList" 
-      />
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleBatchAdd">批量加入清单</el-button>
-          <el-button @click="productDialog.visible = false">关 闭</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    <Product 
+      v-model:visible="productDialog.visible"
+      v-model:modelValue="productList"
+      @confirm="handleProductConfirm"
+    />
   </div>
 </template>
 
@@ -232,9 +171,10 @@ import { useRouter } from 'vue-router';
 import { ArrowLeft } from '@element-plus/icons-vue';
 import { addContractsupply } from '@/api/supplier/contractsupply';
 import { getCompanyList, listInfo } from '@/api/customer/info';
-import { listBase } from '@/api/product/base';
 import { ElMessage } from 'element-plus';
 import FileUpload from '@/components/FileUpload/index.vue';
+import Product from './components/Product.vue';
+import type { BaseVO } from '@/api/product/base/types';
 
 const router = useRouter();
 
@@ -248,19 +188,6 @@ const productDialog = reactive({
   visible: false
 });
 
-const productListData = ref<any[]>([]);
-const productTotal = ref(0);
-const selectedProducts = ref<any[]>([]);
-
-const productQuery = reactive({
-  pageNum: 1,
-  pageSize: 10,
-  productNo: '',
-  itemName: '',
-  brandName: '',
-  productStatus: undefined as number | undefined
-});
-
 const form = ref({
   companyId: '',
   supplierId: '',
@@ -268,6 +195,7 @@ const form = ref({
   startTime: '',
   endTime: '',
   attachment: '',
+  proFile: '',
   remark: '',
   isSubmit: false
 });
@@ -314,117 +242,17 @@ const handleSupplierChange = (value: any) => {
 /** 添加商品 */
 const handleAddProduct = () => {
   productDialog.visible = true;
-  // 不再重新获取商品列表,使用已加载的数据
 };
 
-/** 获取商品列表 */
-const getProductList = async () => {
-  try {
-    const res = await listBase(productQuery);
-    productListData.value = res.rows || [];
-    productTotal.value = res.total || 0;
-  } catch (e) {
-    console.error('获取商品列表失败:', e);
-    ElMessage.error('获取商品列表失败');
-  }
-};
-
-/** 商品查询 */
-const handleProductQuery = () => {
-  productQuery.pageNum = 1;
-  getProductList();
-};
-
-/** 重置商品查询 */
-const resetProductQuery = () => {
-  productQuery.productNo = '';
-  productQuery.itemName = '';
-  productQuery.brandName = '';
-  productQuery.productStatus = undefined;
-  handleProductQuery();
-};
-
-/** 商品多选 */
-const handleProductSelectionChange = (selection: any[]) => {
-  selectedProducts.value = selection;
-};
-
-/** 加入清单 */
-const handleAddToList = (row: any) => {
-  // 检查是否已存在
-  const exists = productList.value.some(item => item.productId === row.id);
-  if (exists) {
-    ElMessage.warning('该商品已在清单中');
-    return;
-  }
-  
-  // 添加到本地清单(不调用API)
-  productList.value.push({
-    productId: row.id,
-    productCode: row.productNo,
-    productImage: row.productImage,
-    productName: row.itemName,
-    productType: row.categoryName,
-    brand: row.brandName,
-    unit: row.unitName,
-    basePrice: row.purchasingPrice || 0,
-    marketPrice: row.marketPrice || 0,
-    platformPrice: row.memberPrice || 0,
-    supplyPrice: '',
-    supplyCycle: '',
-    upPrice: row.productStatus === 1 ? '上架' : '下架'
-  });
-  
-  ElMessage.success('添加成功');
-};
-
-/** 批量加入清单 */
-const handleBatchAdd = () => {
-  if (selectedProducts.value.length === 0) {
+/** 处理商品选择确认 */
+const handleProductConfirm = (selectedProducts: BaseVO[]) => {
+  if (selectedProducts.length === 0) {
     ElMessage.warning('请选择要添加的商品');
     return;
   }
   
-  let successCount = 0;
-  
-  selectedProducts.value.forEach(row => {
-    const exists = productList.value.some(item => item.productId === row.id);
-    if (!exists) {
-      // 添加到本地清单(不调用API)
-      productList.value.push({
-        productId: row.id,
-        productCode: row.productNo,
-        productImage: row.productImage,
-        productName: row.itemName,
-        productType: row.categoryName,
-        brand: row.brandName,
-        unit: row.unitName,
-        basePrice: row.purchasingPrice || 0,
-        marketPrice: row.marketPrice || 0,
-        platformPrice: row.memberPrice || 0,
-        supplyPrice: '',
-        supplyCycle: '',
-        upPrice: row.productStatus === 1 ? '上架' : '下架'
-      });
-      
-      successCount++;
-    }
-  });
-  
-  ElMessage.success(`成功添加${successCount}个商品`);
-  productDialog.visible = false;
-};
-
-/** 导入 */
-const handleImport = () => {
-  console.log('导入');
-  // TODO: 实现导入功能
-};
-
-/** 导出 */
-const handleExport = () => {
-  console.log('导出');
-  // TODO: 实现导出功能
+  productList.value = selectedProducts;
+  ElMessage.success(`成功添加${selectedProducts.length}个商品`);
 };
 
 /** 删除商品 */
@@ -437,17 +265,36 @@ const handleSubmit = async () => {
   formRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       try {
+        // 从表格中收集最新的数据
+        const tableInputs = document.querySelectorAll('.el-table input');
+        let inputIndex = 0;
+        
+        productList.value.forEach((item, index) => {
+          // 每行有两个输入框:供应价和供应时效
+          if (tableInputs[inputIndex]) {
+            item.offerPrice = (tableInputs[inputIndex] as HTMLInputElement).value;
+            inputIndex++;
+          }
+          if (tableInputs[inputIndex]) {
+            item.supplyCycle = (tableInputs[inputIndex] as HTMLInputElement).value;
+            inputIndex++;
+          }
+        });
+        
         // 组装提交数据,包含表单数据和商品列表
         const submitData = {
           ...form.value,
           contractProduct: productList.value.map(item => ({
             productId: item.productId,
             productNo: item.productCode,
-            offerPrice: item.supplyPrice,
-            supplyCycle: item.supplyCycle
+            offerPrice: item.offerPrice || '',
+            supplyCycle: item.supplyCycle || ''
           }))
         };
         
+        console.log('提交的数据:', submitData);
+        console.log('商品列表:', productList.value);
+        
         await addContractsupply(submitData);
         ElMessage.success('新增成功');
         router.back();
@@ -462,7 +309,6 @@ const handleSubmit = async () => {
 onMounted(() => {
   getCompanyData();
   getSupplierData();
-  getProductList(); // 页面加载时获取商品列表
 });
 </script>
 
@@ -494,7 +340,6 @@ onMounted(() => {
 }
 
 .header-title {
-  font-size: 16px;
   font-weight: 500;
   color: #333;
 }

+ 490 - 0
src/views/supplier/contractsupply/components/Product.vue

@@ -0,0 +1,490 @@
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    title="添加商品报价"
+    width="90%"
+    :close-on-click-modal="false"
+    @close="handleClose"
+    class="product-dialog"
+    :modal-append-to-body="false"
+    :append-to-body="true"
+  >
+    <div class="dialog-content">
+      <!-- 搜索表单区域 - 固定 -->
+      <div class="search-container">
+        <el-form ref="queryFormRef" :model="queryParams" label-width="80px">
+          <el-row :gutter="16" class="first-row">
+            <el-col :span="6"> <!-- 调整为6列,均分24列,避免宽度不足 -->
+              <el-form-item label="产品编号:" prop="productNo">
+                <el-input v-model="queryParams.productNo" placeholder="请输入产品编号" clearable @keyup.enter="handleQuery" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="产品名称:" prop="itemName">
+                <el-input v-model="queryParams.itemName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="品牌名称:" prop="brandName">
+                <el-input v-model="queryParams.brandName" placeholder="请选择" clearable @keyup.enter="handleQuery" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="上架状态:" prop="productStatus">
+                <el-select v-model="queryParams.productStatus" placeholder="请选择" clearable style="width: 100%">
+                  <el-option label="已上架" :value="1" />
+                  <el-option label="下架" :value="0" />
+                  <el-option label="上架中" :value="2" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="16" class="second-row">
+            <el-col :span="24" style="text-align: left;">
+              <el-button type="primary" icon="Plus" @click="handleBatchAddToList">批量加入清单</el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+
+      <!-- 表格区域 - 可滚动 -->
+      <div class="table-wrapper">
+        <el-table 
+          v-loading="loading" 
+          border 
+          :data="baseList" 
+          @selection-change="handleSelectionChange"
+          max-height="calc(70vh - 200px)"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="产品编号" align="center" prop="productNo" width="110" />
+          <el-table-column label="产品图片" align="center" prop="productImage" width="90">
+            <template #default="scope">
+              <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="categoryName" width="110" />
+          <el-table-column label="品牌" align="center" prop="brandName" width="100" />
+          <el-table-column label="单位" align="center" prop="unitName" width="70" />
+          <el-table-column label="市场价" align="center" width="90">
+            <template #default="scope">
+              <span>¥{{ scope.row.marketPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="平台售价" align="center" width="90">
+            <template #default="scope">
+              <span>¥{{ scope.row.memberPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="起订量" align="center" prop="minOrderQuantity" width="70" />
+          <el-table-column label="上架状态" align="center" prop="productStatus" width="90">
+            <template #default="scope">
+              <el-tag v-if="scope.row.productStatus === 1" type="success">已上架</el-tag>
+              <el-tag v-else-if="scope.row.productStatus === 0" type="warning">下架</el-tag>
+              <el-tag v-else-if="scope.row.productStatus === 2" type="info">上架中</el-tag>
+              <el-tag v-else type="info">未知</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="100" fixed="right"> <!-- 固定右侧,避免空白 -->
+            <template #default="scope">
+              <el-button link type="primary" @click="handleAddToList(scope.row)">加入清单</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <!-- 分页 -->
+        <div class="pagination-container">
+          <Pagination
+            v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize"
+            v-model:way="queryParams.way"
+            :cursor-mode="true"
+            :has-more="hasMore"
+            :total="total"
+            @pagination="getList"
+          />
+        </div>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script setup name="Base" lang="ts">
+// 补充必要的导入
+import { getCurrentInstance, ComponentInternalInstance, computed, ref, reactive, onMounted } from 'vue';
+import type { ElFormInstance } from 'element-plus';
+
+// Props 定义
+interface Props {
+  visible: boolean;
+  modelValue: any[];
+}
+
+const props = withDefaults(defineProps<Props>(), {
+  visible: false,
+  modelValue: () => []
+});
+
+// Emits 定义
+const emit = defineEmits<{
+  'update:visible': [value: boolean];
+  'update:modelValue': [value: any[]];
+  'confirm': [selectedProducts: any[]];
+}>();
+
+// 控制 dialog 显示
+const dialogVisible = computed({
+  get: () => props.visible,
+  set: (val) => emit('update:visible', val)
+});
+
+// 关闭对话框
+const handleClose = () => {
+  emit('update:visible', false);
+};
+
+// 模拟接口(如果实际项目有,可替换)
+import { listBase, categoryTree } from '@/api/product/base';
+import { BaseVO, BaseQuery, BaseForm } from '@/api/product/base/types';
+import { categoryTreeVO } from '@/api/product/category/types';
+import Pagination from '@/components/Pagination/index.vue';
+
+// 类型补充
+interface PageData<F, Q> {
+  form: F;
+  queryParams: Q;
+  rules: Record<string, any>;
+}
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const baseList = ref<BaseVO[]>([]);
+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 categoryOptions = ref<categoryTreeVO[]>([]);
+const hasMore = ref(true);
+const pageHistory = ref([]);
+
+const queryFormRef = ref<ElFormInstance>();
+
+const initFormData: BaseForm = {
+  id: undefined,
+  productNo: undefined,
+  itemName: undefined,
+  brandId: undefined,
+  topCategoryId: undefined,
+  mediumCategoryId: undefined,
+  bottomCategoryId: undefined,
+  unitId: undefined,
+  productImage: undefined,
+  isSelf: undefined,
+  productReviewStatus: undefined,
+  homeRecommended: undefined,
+  categoryRecommendation: undefined,
+  cartRecommendation: undefined,
+  recommendedProductOrder: undefined,
+  isPopular: undefined,
+  isNew: undefined,
+  productStatus: undefined,
+  remark: undefined
+};
+
+const data = reactive<PageData<BaseForm, BaseQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    productNo: undefined,
+    itemName: undefined,
+    brandName: undefined,
+    productTag: undefined,
+    purchaseNature: undefined,
+    supplierType: undefined,
+    supplierNature: undefined,
+    projectOrg: undefined,
+    topCategoryId: undefined,
+    mediumCategoryId: undefined,
+    bottomCategoryId: undefined,
+    isSelf: undefined,
+    productReviewStatus: undefined,
+    productStatus: undefined,
+    lastSeenId: undefined,
+    way: undefined,
+    params: {}
+  },
+  rules: {
+    productNo: [{ required: true, message: '产品编号不能为空', trigger: 'blur' }],
+    itemName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
+    brandId: [{ required: true, message: '品牌id不能为空', trigger: 'blur' }],
+    topCategoryId: [{ required: true, message: '顶级分类id不能为空', trigger: 'blur' }],
+    mediumCategoryId: [{ required: true, message: '中级分类id不能为空', trigger: 'blur' }],
+    bottomCategoryId: [{ required: true, message: '底层分类id不能为空', trigger: 'blur' }],
+    unitId: [{ required: true, message: '单位id不能为空', trigger: 'blur' }],
+    productImage: [{ required: true, message: '产品图片URL不能为空', trigger: 'blur' }],
+    productReviewStatus: [{ required: true, message: '产品审核状态不能为空', trigger: 'change' }],
+    homeRecommended: [{ required: true, message: '首页推荐不能为空', trigger: 'blur' }],
+    categoryRecommendation: [{ required: true, message: '分类推荐不能为空', trigger: 'blur' }],
+    cartRecommendation: [{ required: true, message: '购物车推荐不能为空', trigger: 'blur' }],
+    recommendedProductOrder: [{ required: true, message: '推荐产品顺序不能为空', trigger: 'blur' }],
+    isPopular: [{ required: true, message: '是否热门不能为空', trigger: 'blur' }],
+    isNew: [{ required: true, message: '是否新品不能为空', trigger: 'blur' }],
+    remark: [{ required: true, message: '备注不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams } = toRefs(data);
+
+/** 查询产品基础信息列表 */
+const getList = async () => {
+  loading.value = true;
+  try {
+    const params = { ...queryParams.value };
+    const currentPageNum = queryParams.value.pageNum;
+
+    if (currentPageNum === 1) {
+      delete params.lastSeenId;
+      delete params.way;
+    } else {
+      if (queryParams.value.way === 0) {
+        const nextPageHistory = pageHistory.value[currentPageNum];
+        if (nextPageHistory) {
+          params.firstSeenId = nextPageHistory.firstId;
+          params.way = 0;
+        }
+      } else {
+        const prevPageHistory = pageHistory.value[currentPageNum - 1];
+        if (prevPageHistory) {
+          params.lastSeenId = prevPageHistory.lastId;
+          params.way = 1;
+        }
+      }
+    }
+
+    const res = await listBase(params);
+    baseList.value = res.rows || [];
+    hasMore.value = baseList.value.length === queryParams.value.pageSize;
+
+    if (baseList.value.length > 0) {
+      const firstItem = baseList.value[0];
+      const lastItem = baseList.value[baseList.value.length - 1];
+      if (pageHistory.value.length <= currentPageNum) {
+        pageHistory.value[currentPageNum] = {
+          firstId: firstItem.id,
+          lastId: lastItem.id
+        };
+      }
+    }
+
+    total.value = res.total || 0;
+  } catch (error) {
+    console.error('获取列表失败:', error);
+  } finally {
+    loading.value = false;
+  }
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value = {
+    ...queryParams.value,
+    pageNum: 1,
+    productNo: queryParams.value.productNo,
+    itemName: queryParams.value.itemName,
+    brandName: queryParams.value.brandName,
+    bottomCategoryId: queryParams.value.bottomCategoryId,
+    isSelf: queryParams.value.isSelf,
+    productReviewStatus: queryParams.value.productReviewStatus,
+    productStatus: queryParams.value.productStatus,
+    lastSeenId: undefined
+  };
+  pageHistory.value = [];
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  queryParams.value.lastSeenId = undefined;
+  pageHistory.value = [];
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: BaseVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 加入清单 */
+const handleAddToList = (row: BaseVO) => {
+  const existsInModelValue = props.modelValue.some(item => item.productId === row.id);
+  if (existsInModelValue) {
+    proxy?.$modal.msgWarning('该商品已在清单中');
+    return;
+  }
+  
+  const newProduct = {
+    productId: row.id,
+    productCode: row.productNo,
+    productImage: row.productImage,
+    productName: row.itemName,
+    productType: row.categoryName,
+    brand: row.brandName,
+    unit: row.unitName,
+    basePrice: row.purchasingPrice || 0,
+    marketPrice: row.marketPrice || 0,
+    platformPrice: row.memberPrice || 0,
+    offerPrice: '',
+    supplyCycle: '',
+    upPrice: Number(row.productStatus) === 1 ? '上架' : '下架'
+  };
+  
+  emit('update:modelValue', [...props.modelValue, newProduct]);
+  proxy?.$modal.msgSuccess('添加成功');
+  emit('update:visible', false);
+};
+
+/** 批量加入清单 */
+const handleBatchAddToList = () => {
+  const selectedProducts = baseList.value.filter(item => ids.value.includes(item.id));
+  
+  if (selectedProducts.length === 0) {
+    proxy?.$modal.msgWarning('请选择要添加的商品');
+    return;
+  }
+  
+  const newProducts: any[] = [];
+  
+  selectedProducts.forEach(row => {
+    const exists = props.modelValue.some(item => item.productId === row.id);
+    if (!exists) {
+      newProducts.push({
+        productId: row.id,
+        productCode: row.productNo,
+        productImage: row.productImage,
+        productName: row.itemName,
+        productType: row.categoryName,
+        brand: row.brandName,
+        unit: row.unitName,
+        basePrice: row.purchasingPrice || 0,
+        marketPrice: row.marketPrice || 0,
+        platformPrice: row.memberPrice || 0,
+        offerPrice: '',
+        supplyCycle: '',
+        upPrice: Number(row.productStatus) === 1 ? '上架' : '下架'
+      });
+    }
+  });
+  
+  if (newProducts.length === 0) {
+    proxy?.$modal.msgWarning('所选商品已在清单中');
+    return;
+  }
+  
+  emit('update:modelValue', [...props.modelValue, ...newProducts]);
+  proxy?.$modal.msgSuccess(`成功添加${newProducts.length}个商品`);
+  emit('update:visible', false);
+};
+
+/** 查询分类树 */
+const getCategoryTree = async () => {
+  const res = await categoryTree();
+  categoryOptions.value = res.data || [];
+};
+
+onMounted(() => {
+  getList();
+  getCategoryTree();
+});
+</script>
+
+<style scoped>
+/* 核心:禁止外层滚动,仅表格内部滚动 */
+.product-dialog {
+  overflow: hidden !important;
+}
+
+.product-dialog :deep(.el-dialog__body) {
+  padding: 0;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden !important; /* 禁止对话框主体滚动 */
+  height: calc(90vh); /* 限制对话框主体高度,避免超出视口 */
+}
+
+.dialog-content {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+  overflow: hidden !important; /* 禁止内容容器滚动 */
+}
+
+.search-container {
+  flex-shrink: 0;
+  padding: 16px;
+  background: #f5f7fa;
+  border-bottom: 1px solid #e4e7ed;
+  box-sizing: border-box; /* 内边距不影响宽度 */
+  width: 100%;
+}
+
+.search-container :deep(.el-form) {
+  margin-bottom: 0;
+  width: 100%;
+}
+
+.search-container :deep(.el-row) {
+  display: flex;
+  align-items: center;
+  width: 100%;
+}
+
+.search-container .first-row {
+  margin-bottom: 16px;
+}
+
+.search-container :deep(.el-form-item) {
+  margin-bottom: 0;
+}
+
+.search-container :deep(.el-form-item__label) {
+  font-weight: normal;
+  white-space: nowrap;
+}
+
+.search-container :deep(.el-input),
+.search-container :deep(.el-select) {
+  width: 100%;
+}
+
+/* 表格容器:仅让表格内部滚动,外层不滚动 */
+.table-wrapper {
+  flex: 1; /* 占满剩余高度 */
+  padding: 16px;
+  box-sizing: border-box;
+  width: 100%;
+  overflow: hidden !important; /* 禁止表格容器滚动 */
+}
+
+.pagination-container {
+  margin-top: 16px;
+  display: flex;
+  justify-content: flex-end;
+  width: 100%;
+  flex-shrink: 0; /* 分页栏不压缩 */
+}
+
+/* 修复固定列样式 */
+.product-dialog :deep(.el-table__fixed-right) {
+  height: calc(100% - 17px) !important; /* 匹配表格高度 */
+}
+</style>

+ 38 - 216
src/views/supplier/contractsupply/edit.vue

@@ -8,16 +8,16 @@
 
     <!-- 表单卡片 -->
     <el-card shadow="never" class="form-card">
-      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="large-form">
         <el-row :gutter="20">
           <el-col :span="8">
             <el-form-item label="协议编号" prop="contractSupplyNo">
-              <span>{{ form.contractSupplyNo }}</span>
+              <span class="form-text">{{ form.contractSupplyNo }}</span>
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="所属公司" prop="companyId">
-              <el-select v-model="form.companyId" placeholder="请选择" style="width: 100%;">
+              <el-select v-model="form.companyId" placeholder="请选择" style="width: 100%;" size="large">
                 <el-option
                   v-for="item in companyList"
                   :key="item.id"
@@ -29,7 +29,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="供应商" prop="supplierId">
-              <el-select v-model="form.supplierId" placeholder="请选择" style="width: 100%;">
+              <el-select v-model="form.supplierId" placeholder="请选择" style="width: 100%;" size="large">
                 <el-option
                   v-for="item in supplierList"
                   :key="item.id"
@@ -50,6 +50,7 @@
                 placeholder="请选择"
                 value-format="YYYY-MM-DD"
                 style="width: 100%;"
+                size="large"
               />
             </el-form-item>
           </el-col>
@@ -61,6 +62,7 @@
                 placeholder="请选择"
                 value-format="YYYY-MM-DD"
                 style="width: 100%;"
+                size="large"
               />
             </el-form-item>
           </el-col>
@@ -87,6 +89,7 @@
                 type="textarea" 
                 :rows="4"
                 placeholder="请输入内容"
+                size="large"
               />
             </el-form-item>
           </el-col>
@@ -94,9 +97,7 @@
 
         <!-- 商品列表 -->
         <div class="section-title">
-          <el-button type="primary" @click="handleAddProduct">添加商品信息</el-button>
-          <el-button type="success" @click="handleImport">导入</el-button>
-          <el-button type="warning" @click="handleExport">导出</el-button>
+          <el-button type="primary" @click="handleAddProduct">添加商品报价</el-button>
         </div>
 
         <el-table :data="productList" border style="width: 100%; margin-top: 20px;">
@@ -115,8 +116,16 @@
           <el-table-column prop="productType" label="产品类型" align="center" width="120" />
           <el-table-column prop="brand" label="品牌" align="center" width="100" />
           <el-table-column prop="unit" label="单位" align="center" width="80" />
-          <el-table-column prop="marketPrice" label="市场价" align="center" width="100" />
-          <el-table-column prop="platformPrice" label="平台价" align="center" width="100" />
+          <el-table-column label="市场价" align="center" width="100">
+            <template #default="scope">
+              <span>¥{{ scope.row.marketPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="平台价" align="center" width="100">
+            <template #default="scope">
+              <span>¥{{ scope.row.platformPrice || '0.00' }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="供应价(元)" align="center" width="120">
             <template #default="scope">
               <el-input v-model="scope.row.supplyPrice" placeholder="请输入" />
@@ -139,9 +148,7 @@
           </el-table-column>
         </el-table>
 
-        <div style="text-align: center; margin-top: 20px;">
-          <el-checkbox v-model="form.isSubmit">提交</el-checkbox>
-        </div>
+      
 
         <el-row style="margin-top: 20px;">
           <el-col :span="24" style="text-align: center;">
@@ -152,82 +159,10 @@
     </el-card>
 
     <!-- 添加商品对话框 -->
-    <el-dialog title="添加商品报价" v-model="productDialog.visible" width="90%" append-to-body>
-      <div class="mb-4">
-        <el-form :inline="true" :model="productQuery">
-          <el-form-item label="产品编号">
-            <el-input v-model="productQuery.productNo" placeholder="请输入产品编号" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="产品名称">
-            <el-input v-model="productQuery.itemName" placeholder="请输入产品名称" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="品牌名称">
-            <el-input v-model="productQuery.brandName" placeholder="请输入品牌名称" clearable style="width: 200px;" />
-          </el-form-item>
-          <el-form-item label="上架状态">
-            <el-select v-model="productQuery.productStatus" placeholder="请选择" clearable style="width: 150px;">
-              <el-option label="上架" :value="1" />
-              <el-option label="下架" :value="0" />
-            </el-select>
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleProductQuery">搜索</el-button>
-            <el-button icon="Refresh" @click="resetProductQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-
-      <el-table 
-        :data="productListData" 
-        border 
-        style="width: 100%;"
-        @selection-change="handleProductSelectionChange"
-      >
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column prop="productNo" label="产品编号" align="center" width="120" />
-        <el-table-column label="产品图片" align="center" width="100">
-          <template #default="scope">
-            <el-image 
-              v-if="scope.row.productImage" 
-              :src="scope.row.productImage" 
-              style="width: 60px; height: 60px;"
-              fit="cover"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column prop="itemName" label="产品名称" align="center" show-overflow-tooltip />
-        <el-table-column prop="brandName" label="品牌" align="center" width="120" />
-        <el-table-column prop="unitName" label="单位" align="center" width="80" />
-        <el-table-column prop="marketPrice" label="市场价" align="center" width="100" />
-        <el-table-column prop="memberPrice" label="平台价" align="center" width="100" />
-        <el-table-column prop="minOrderQuantity" label="起订量" align="center" width="100" />
-        <el-table-column label="上架状态" align="center" width="100">
-          <template #default="scope">
-            <span>{{ scope.row.productStatus === 1 ? '上架' : '下架' }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" width="100">
-          <template #default="scope">
-            <el-button link type="primary" @click="handleAddToList(scope.row)">加入清单</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination 
-        v-show="productTotal > 0" 
-        :total="productTotal" 
-        v-model:page="productQuery.pageNum" 
-        v-model:limit="productQuery.pageSize"
-        @pagination="getProductList" 
-      />
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleBatchAdd">批量加入清单</el-button>
-          <el-button @click="productDialog.visible = false">关 闭</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    <Product 
+      v-model:visible="productDialog.visible"
+      v-model:modelValue="productList"
+    />
   </div>
 </template>
 
@@ -237,9 +172,9 @@ import { useRoute, useRouter } from 'vue-router';
 import { ArrowLeft } from '@element-plus/icons-vue';
 import { getContractsupply, updateContractsupply } from '@/api/supplier/contractsupply';
 import { getCompanyList, listInfo } from '@/api/customer/info';
-import { listBase } from '@/api/product/base';
 import { ElMessage } from 'element-plus';
 import FileUpload from '@/components/FileUpload/index.vue';
+import Product from './components/Product.vue';
 
 const route = useRoute();
 const router = useRouter();
@@ -254,19 +189,6 @@ const productDialog = reactive({
   visible: false
 });
 
-const productListData = ref<any[]>([]);
-const productTotal = ref(0);
-const selectedProducts = ref<any[]>([]);
-
-const productQuery = reactive({
-  pageNum: 1,
-  pageSize: 10,
-  productNo: '',
-  itemName: '',
-  brandName: '',
-  productStatus: undefined as number | undefined
-});
-
 const form = ref({
   id: '',
   contractSupplyNo: '',
@@ -360,115 +282,6 @@ const handleAddProduct = () => {
   productDialog.visible = true;
 };
 
-/** 获取商品列表 */
-const getProductList = async () => {
-  try {
-    const res = await listBase(productQuery);
-    productListData.value = res.rows || [];
-    productTotal.value = res.total || 0;
-  } catch (e) {
-    console.error('获取商品列表失败:', e);
-    ElMessage.error('获取商品列表失败');
-  }
-};
-
-/** 商品查询 */
-const handleProductQuery = () => {
-  productQuery.pageNum = 1;
-  getProductList();
-};
-
-/** 重置商品查询 */
-const resetProductQuery = () => {
-  productQuery.productNo = '';
-  productQuery.itemName = '';
-  productQuery.brandName = '';
-  productQuery.productStatus = undefined;
-  handleProductQuery();
-};
-
-/** 商品多选 */
-const handleProductSelectionChange = (selection: any[]) => {
-  selectedProducts.value = selection;
-};
-
-/** 加入清单 */
-const handleAddToList = (row: any) => {
-  // 检查是否已存在
-  const exists = productList.value.some(item => item.productId === row.id);
-  if (exists) {
-    ElMessage.warning('该商品已在清单中');
-    return;
-  }
-  
-  // 添加到本地清单
-  productList.value.push({
-    productId: row.id,
-    productCode: row.productNo,
-    productImage: row.productImage,
-    productName: row.itemName,
-    productType: row.categoryName,
-    brand: row.brandName,
-    unit: row.unitName,
-    basePrice: row.purchasingPrice || 0,
-    marketPrice: row.marketPrice || 0,
-    platformPrice: row.memberPrice || 0,
-    supplyPrice: '',
-    supplyCycle: '',
-    upPrice: row.productStatus === 1 ? '上架' : '下架'
-  });
-  
-  ElMessage.success('添加成功');
-};
-
-/** 批量加入清单 */
-const handleBatchAdd = () => {
-  if (selectedProducts.value.length === 0) {
-    ElMessage.warning('请选择要添加的商品');
-    return;
-  }
-  
-  let successCount = 0;
-  
-  selectedProducts.value.forEach(row => {
-    const exists = productList.value.some(item => item.productId === row.id);
-    if (!exists) {
-      productList.value.push({
-        productId: row.id,
-        productCode: row.productNo,
-        productImage: row.productImage,
-        productName: row.itemName,
-        productType: row.categoryName,
-        brand: row.brandName,
-        unit: row.unitName,
-        basePrice: row.purchasingPrice || 0,
-        marketPrice: row.marketPrice || 0,
-        platformPrice: row.memberPrice || 0,
-        supplyPrice: '',
-        supplyCycle: '',
-        upPrice: row.productStatus === 1 ? '上架' : '下架'
-      });
-      
-      successCount++;
-    }
-  });
-  
-  ElMessage.success(`成功添加${successCount}个商品`);
-  productDialog.visible = false;
-};
-
-/** 导入 */
-const handleImport = () => {
-  console.log('导入');
-  // TODO: 实现导入功能
-};
-
-/** 导出 */
-const handleExport = () => {
-  console.log('导出');
-  // TODO: 实现导出功能
-};
-
 /** 删除商品 */
 const handleDeleteProduct = (index: number) => {
   productList.value.splice(index, 1);
@@ -485,11 +298,14 @@ const handleSubmit = async () => {
           contractProduct: productList.value.map(item => ({
             productId: item.productId,
             productNo: item.productCode,
-            offerPrice: item.supplyPrice,
-            supplyCycle: item.supplyCycle
+            offerPrice: item.supplyPrice || '',
+            supplyCycle: item.supplyCycle || ''
           }))
         };
         
+        console.log('提交的数据:', submitData);
+        console.log('商品列表:', productList.value);
+        
         await updateContractsupply(submitData);
         ElMessage.success('保存成功');
         router.back();
@@ -502,10 +318,9 @@ const handleSubmit = async () => {
 };
 
 onMounted(() => {
-  getSupplierData(); // 先加载供应商列表
+  getSupplierData();
   getDetail();
   getCompanyData();
-  getProductList(); // 页面加载时获取商品列表
 });
 </script>
 
@@ -537,7 +352,6 @@ onMounted(() => {
 }
 
 .header-title {
-  font-size: 16px;
   font-weight: 500;
   color: #333;
 }
@@ -547,6 +361,14 @@ onMounted(() => {
   padding: 24px;
 }
 
+.large-form :deep(.el-form-item__label) {
+  font-weight: 500;
+}
+
+.form-text {
+  color: #303133;
+}
+
 .section-title {
   margin: 20px 0;
   padding-bottom: 12px;

+ 19 - 6
src/views/supplier/contractsupply/index.vue

@@ -3,10 +3,15 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
             <el-form-item label="协议单号" prop="contractSupplyNo">
               <el-input v-model="queryParams.contractSupplyNo" placeholder="请输入协议单号" clearable @keyup.enter="handleQuery" />
             </el-form-item>
+
+            <el-form-item label="供应商名称" prop="supplierName">
+              <el-input v-model="queryParams.supplierName" placeholder="供应商名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+
             <el-form-item label="开始时间" prop="startTime">
               <el-date-picker clearable
                 v-model="queryParams.startTime"
@@ -26,8 +31,11 @@
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
               <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-              <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['supplier:contractsupply:add']">新增</el-button>
+              <el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['supplier:contractsupply:add']">新增</el-button>
             </el-form-item>
+           
+              
+            
           </el-form>
         </el-card>
       </div>
@@ -107,7 +115,7 @@
 </template>
 
 <script setup name="Contractsupply" lang="ts">
-import { listContractsupply, getContractsupply, delContractsupply, addContractsupply, updateContractsupply } from '@/api/supplier/contractsupply';
+import { listContractsupply, getContractsupply, delContractsupply, addContractsupply, updateContractsupply, auditContractsupply } from '@/api/supplier/contractsupply';
 import { ContractsupplyVO, ContractsupplyQuery, ContractsupplyForm } from '@/api/supplier/contractsupply/types';
 import { useRouter } from 'vue-router';
 
@@ -157,6 +165,7 @@ const data = reactive<PageData<ContractsupplyForm, ContractsupplyQuery>>({
     pageNum: 1,
     pageSize: 10,
     contractSupplyNo: undefined,
+    supplierName: undefined,
     startTime: undefined,
     endTime: undefined,
     params: {
@@ -231,9 +240,9 @@ const submitAudit = () => {
   auditFormRef.value?.validate(async (valid: boolean) => {
     if (valid && auditDialog.currentRow) {
       try {
-        await updateContractsupply({
-          ...auditDialog.currentRow,
-          status: auditForm.value.status
+        await auditContractsupply({
+          id: auditDialog.currentRow.id!,
+          status: auditForm.value.status!
         });
         proxy?.$modal.msgSuccess("审核成功");
         auditDialog.visible = false;
@@ -288,3 +297,7 @@ onMounted(() => {
   getList();
 });
 </script>
+
+<style scoped>
+
+</style>

+ 68 - 34
src/views/supplier/none/index.vue

@@ -20,7 +20,7 @@
             </el-form-item>
             <el-form-item label="供应类别" prop="operatingCategory">
               <el-select v-model="queryParams.operatingCategory" placeholder="请选择供应类别" clearable>
-                <el-option v-for="item in productCategoryList" :key="item.categoryNo" :label="item.categoryName" :value="item.categoryNo" />
+                <el-option v-for="item in productCategoryList" :key="item.id" :label="item.categoryName" :value="item.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="供应区域" prop="province">
@@ -31,12 +31,12 @@
             </el-form-item>
             <el-form-item label="产品经理" prop="productManager">
               <el-select v-model="queryParams.productManager" placeholder="请选择产品经理" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item label="采购人员" prop="buyer">
               <el-select v-model="queryParams.buyer" placeholder="请选择采购人员" clearable>
-                <el-option v-for="item in comStaffList" :key="item.staffCode" :label="item.staffName" :value="item.staffCode" />
+                <el-option v-for="item in comStaffList" :key="item.staffId" :label="item.staffName" :value="item.staffId" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -55,39 +55,31 @@
            供应商信息列表
           </el-col>
           
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['customer:info:add']">新增供应商</el-button>
-          </el-col>
           
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="infoList" @selection-change="handleSelectionChange">
-        
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="供应商编号" align="center" prop="supplierNo" />
-        <el-table-column label="供应商名称" align="center" prop="enterpriseName" />
-        <el-table-column label="供应商类型" align="center" prop="supplierType">
-          <template #default="scope">
-            <span>{{ getSupplierTypeName(scope.row.supplierType) }}</span>
-          </template>
+      <el-table v-loading="loading" border :data="infoList" class="no-resize-table" @selection-change="handleSelectionChange">
+        <el-table-column label="供应商编号" align="center" prop="supplierNo" width="150" fixed="left" />
+        <el-table-column label="供应商名称" align="left" prop="enterpriseName" width="250" fixed="left" />
+        <el-table-column label="供应商类型" align="center" prop="supplierTypeName" width="200">
         </el-table-column>
         
-        <el-table-column label="产品经理" align="center" prop="productManager" />
-        <el-table-column label="采购人员" align="center" prop="buyer" />
-        <el-table-column label="上架产品数" align="center" prop="listedNum" />
-        <el-table-column label="供应品牌" align="center" prop="operatingBrand" />
-        <el-table-column label="供应区域(省)" align="center" prop="province" />
-        <el-table-column label="供应区域(市)" align="center" prop="city" />
+        <el-table-column label="产品经理" align="center" prop="productManager" width="150" />
+        <el-table-column label="采购人员" align="center" prop="buyer" width="150" />
+        <el-table-column label="上架产品数" align="center" prop="listedNum" width="150" />
+        <el-table-column label="供应品牌" align="center" prop="brandName" width="200" />
+        <el-table-column label="供应区域(省)" align="left" prop="province" width="250" />
+        <el-table-column label="供应区域(市)" align="left" prop="city" width="300" />
         
         
         
-        <el-table-column label="审核状态" align="center" prop="supplyStatus">
+        <el-table-column label="审核状态" align="center" prop="supplyStatus" width="150">
           <template #default="scope">
             <span>{{ getStatusDisplayName(scope.row.supplyStatus) }}</span>
           </template>
         </el-table-column>  
-        <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="250" fixed="right">
           <template #default="scope">
             
             <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:info:edit']">编辑</el-button>
@@ -119,7 +111,7 @@ const multiple = ref(true);
 const total = ref(0);
 const supplierTypeList = ref<{ typeId: string; typeName: string }[]>([]);
 const productCategoryList = ref<{ categoryNo: string; categoryName: string; id?: number }[]>([]);
-const comStaffList = ref<{ staffCode: string; staffName: string }[]>([]);
+const comStaffList = ref<{ staffId: string; staffName: string }[]>([]);
 
 const queryFormRef = ref<ElFormInstance>();
 
@@ -209,8 +201,9 @@ const handleView = (row: InfoVO) => {
 const handleStopCooperation = async (row: InfoVO) => {
   await proxy?.$modal.confirm('是否确认恢复与供应商"' + row.enterpriseName + '"的合作?');
   try {
+    // 只传id和supplyStatus
     await updateInfo({ 
-      ...row,
+      id: row.id,
       supplyStatus: 1 
     });
     proxy?.$modal.msgSuccess("恢复合作成功");
@@ -268,13 +261,29 @@ onMounted(async () => {
   }
   
   getList();
+  
+  // 禁用表格列宽调整
+  nextTick(() => {
+    const table = document.querySelector('.no-resize-table');
+    if (table) {
+      table.addEventListener('mousedown', (e: any) => {
+        const target = e.target as HTMLElement;
+        // 阻止在表头边界处的鼠标按下事件
+        if (target.classList.contains('el-table__column-resize-proxy') || 
+            target.closest('.el-table__column-resize-proxy')) {
+          e.preventDefault();
+          e.stopPropagation();
+          return false;
+        }
+      }, true);
+    }
+  });
 });
 </script>
 
 <style scoped>
 :deep(.el-form-item__label) {
   text-align: left !important;
-  font-size: 16px;
 }
 
 :deep(.el-form-item) {
@@ -282,19 +291,44 @@ onMounted(async () => {
   margin-bottom: 20px;
 }
 
-:deep(.el-input__wrapper) {
-  font-size: 15px;
+/* 禁用表格列宽拖动 */
+.no-resize-table :deep(th.el-table__cell) {
+  user-select: none !important;
+  resize: none !important;
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper th) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper .el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header-wrapper) {
+  cursor: default !important;
+}
+
+/* 隐藏列宽调整的分隔线悬停效果 */
+.no-resize-table :deep(th.el-table__cell:hover) {
+  cursor: default !important;
+}
+
+.no-resize-table :deep(.el-table__header th.el-table__cell) {
+  border-right: 1px solid #EBEEF5;
 }
 
-:deep(.el-input__inner) {
-  font-size: 15px;
+/* 禁用拖动事件 */
+.no-resize-table :deep(.el-table__header-wrapper) {
+  pointer-events: auto;
 }
 
-:deep(.el-select) {
-  font-size: 15px;
+.no-resize-table :deep(.el-table__header th) {
+  pointer-events: auto;
 }
 
-:deep(.el-select .el-input__inner) {
-  font-size: 15px;
+.no-resize-table :deep(.el-table__header .cell) {
+  pointer-events: auto;
 }
 </style>

+ 63 - 99
src/views/supplier/supplierauthorize/index.vue

@@ -3,12 +3,12 @@
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
             <el-form-item label="供应商编号" prop="supplierNo">
-              <el-input v-model="queryParams.supplierNo" placeholder="请输入供应商编号" clearable @keyup.enter="handleQuery" />
+              <el-input v-model="queryParams.supplierNo" placeholder="供应商编号" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="供应商名称" prop="supplierName">
-              <el-input v-model="queryParams.supplierName" placeholder="请输入供应商编号" clearable @keyup.enter="handleQuery" />
+              <el-input v-model="queryParams.supplierName" placeholder="供应商名称" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="供货区域(省)" prop="province">
               <el-input v-model="queryParams.province" placeholder="供货区域(省)" clearable @keyup.enter="handleQuery" />
@@ -16,23 +16,12 @@
             <el-form-item label="供货区域(市)" prop="city">
               <el-input v-model="queryParams.city" placeholder="供货区域(市)" clearable @keyup.enter="handleQuery" />
             </el-form-item>
-            <el-form-item label="可供货品牌" prop="brandName">
-              <el-input v-model="queryParams.supplyBrand" placeholder="请输入可供货品牌" clearable @keyup.enter="handleQuery" />
+            <el-form-item label="可供货品牌" prop="supplyBrand">
+              <el-input v-model="queryParams.supplyBrand" placeholder="可供货品牌" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="授权品牌" prop="brandName">
-              <el-input v-model="queryParams.brandName" placeholder="请输入品牌名称" clearable @keyup.enter="handleQuery" />
+              <el-input v-model="queryParams.brandName" placeholder="授权品牌" clearable @keyup.enter="handleQuery" />
             </el-form-item>
-            <el-form-item label="授权品类" prop="authorizationCategory">
-              <el-input v-model="queryParams.authorizationCategory" placeholder="请输入授权品类" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="授权品牌" prop="brandLicensor">
-              <el-input v-model="queryParams.brandLicensor" placeholder="请输入品牌授权方" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            
-            <el-form-item label="授权区域" prop="authorizedArea">
-              <el-input v-model="queryParams.authorizedArea" placeholder="请输入授权区域" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-          
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
               <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -63,101 +52,32 @@
 
       <el-table v-loading="loading" border :data="supplierauthorizeList" @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="供货区域(省)" align="center" prop="province" />
-        <el-table-column label="供货区域(市)" align="center" prop="city" />
+        <el-table-column label="供货区域(省)" align="center" prop="province">
+          <template #default="scope">
+            <span>{{ formatProvinceDisplay(scope.row.province) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="供货区域(市)" align="center" prop="city">
+          <template #default="scope">
+            <span>{{ formatCityDisplay(scope.row.city) }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="供货类目" align="center" prop="supplyProCate" />
-        <el-table-column label="可供货品牌" align="center" prop="supplyBrand" />
+        <el-table-column label="可供货品牌" align="center" prop="brandName" />
         <el-table-column label="有授权品牌" align="center" prop="authBrand" />
         
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['supplier:supplierauthorize:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['supplier:supplierauthorize:remove']"></el-button>
-            </el-tooltip>
+            <el-button link type="primary" @click="handleView(scope.row)">查看</el-button>
+            <el-button link type="primary" @click="handleEdit(scope.row)" v-hasPermi="['supplier:supplierauthorize:edit']">编辑</el-button>
           </template>
         </el-table-column>
       </el-table>
 
       <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
-    <!-- 添加或修改供应能力查询对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
-      <el-form ref="supplierauthorizeFormRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="供应商编号" prop="supplierNo">
-          <el-input v-model="form.supplierNo" placeholder="请输入供应商编号" />
-        </el-form-item>
-        <el-form-item label="供应商ID" prop="supplierId">
-          <el-input v-model="form.supplierId" placeholder="请输入供应商ID" />
-        </el-form-item>
-        <el-form-item label="授权单编号" prop="authorizeNo">
-          <el-input v-model="form.authorizeNo" placeholder="请输入授权单编号" />
-        </el-form-item>
-        <el-form-item label="品牌编号" prop="brandNo">
-          <el-input v-model="form.brandNo" placeholder="请输入品牌编号" />
-        </el-form-item>
-        <el-form-item label="品牌名称" prop="brandName">
-          <el-input v-model="form.brandName" placeholder="请输入品牌名称" />
-        </el-form-item>
-        <el-form-item label="品牌英文名称" prop="brandEnglishName">
-          <el-input v-model="form.brandEnglishName" placeholder="请输入品牌英文名称" />
-        </el-form-item>
-        <el-form-item label="品牌LOGO图片地址" prop="brandLogo">
-          <el-input v-model="form.brandLogo" placeholder="请输入品牌LOGO图片地址" />
-        </el-form-item>
-        <el-form-item label="授权品类" prop="authorizationCategory">
-          <el-input v-model="form.authorizationCategory" placeholder="请输入授权品类" />
-        </el-form-item>
-        <el-form-item label="品牌授权方" prop="brandLicensor">
-            <el-input v-model="form.brandLicensor" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="授权关系文件存储地址" prop="authorizationRelationshipFile">
-          <file-upload v-model="form.authorizationRelationshipFile"/>
-        </el-form-item>
-        <el-form-item label="授权开始时间" prop="authorizationStartTime">
-          <el-date-picker clearable
-            v-model="form.authorizationStartTime"
-            type="datetime"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            placeholder="请选择授权开始时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="授权结束时间" prop="authorizationEndTime">
-          <el-date-picker clearable
-            v-model="form.authorizationEndTime"
-            type="datetime"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            placeholder="请选择授权结束时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="授权区域" prop="authorizedArea">
-            <el-input v-model="form.authorizedArea" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-        <el-form-item label="授权层级" prop="authorizeLevel">
-          <el-input v-model="form.authorizeLevel" placeholder="请输入授权层级" />
-        </el-form-item>
-        <el-form-item label="授权关系文件原文件名" prop="authorizationRelationshipFileName">
-          <el-input v-model="form.authorizationRelationshipFileName" placeholder="请输入授权关系文件原文件名" />
-        </el-form-item>
-        <el-form-item label="品牌注册人" prop="brandRegistrant">
-          <el-input v-model="form.brandRegistrant" placeholder="请输入品牌注册人" />
-        </el-form-item>
-        <el-form-item label="审核反馈意见" prop="reviewFeedback">
-            <el-input v-model="form.reviewFeedback" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
   </div>
 </template>
 
@@ -166,6 +86,7 @@ import { listSupplierauthorize, getSupplierauthorize, delSupplierauthorize, addS
 import { SupplierauthorizeVO, SupplierauthorizeQuery, SupplierauthorizeForm } from '@/api/supplier/supplierauthorize/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const router = useRouter();
 
 const supplierauthorizeList = ref<SupplierauthorizeVO[]>([]);
 const buttonLoading = ref(false);
@@ -275,6 +196,27 @@ const handleSelectionChange = (selection: SupplierauthorizeVO[]) => {
   multiple.value = !selection.length;
 }
 
+/** 查看按钮操作 */
+const handleView = (row: SupplierauthorizeVO) => {
+  router.push({
+    path: '/customer/info/detail',
+    query: {
+      id: row.supplierId
+    }
+  });
+}
+
+/** 编辑按钮操作 */
+const handleEdit = (row: SupplierauthorizeVO) => {
+  router.push({
+    path: '/customer/info/detail',
+    query: {
+      id: row.supplierId,
+      mode: 'edit'
+    }
+  });
+}
+
 /** 新增按钮操作 */
 const handleAdd = () => {
   reset();
@@ -325,7 +267,29 @@ const handleExport = () => {
   }, `supplierauthorize_${new Date().getTime()}.xlsx`)
 }
 
+/** 格式化省份显示:只显示第一个省份,其余用...表示 */
+const formatProvinceDisplay = (province: string) => {
+  if (!province) return '';
+  const provinces = province.split(',').filter(p => p.trim());
+  if (provinces.length === 0) return '';
+  if (provinces.length === 1) return provinces[0];
+  return `${provinces[0]}...`;
+};
+
+/** 格式化城市显示:显示前10个城市,其余用...表示 */
+const formatCityDisplay = (city: string) => {
+  if (!city) return '';
+  const cities = city.split(',').filter(c => c.trim());
+  if (cities.length === 0) return '';
+  if (cities.length <= 10) return cities.join(',');
+  return `${cities.slice(0, 10).join(',')}...`;
+};
+
 onMounted(() => {
   getList();
 });
 </script>
+
+<style scoped>
+
+</style>

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels