Просмотр исходного кода

feat(product): 更新商品基础信息页面功能

- 添加UPC条码输入限制,只允许输入数字
- 实现品牌搜索功能,支持远程搜索和防抖处理
- 将税率字段改为下拉选择,支持税率选项
- 添加商品轮播图上传功能,支持多选和预览
- 优化价格输入,添加价格格式化为两位小数功能
- 更改主供应商字段为实际供应商选择,支持搜索
- 将产品经理和采购人员字段改为员工选择下拉框
- 修复商品详情表单验证规则,优化提示信息
- 添加格式化价格功能,确保价格为两位小数格式
- 重构API导入路径,统一使用新的产品模块API
- 添加轮播图选择器组件,支持批量选择图片
- 优化表单提交逻辑,添加轮播图URL处理
- 实现商品编辑时轮播图回显功能
- 添加供应商和员工选项加载功能
- 优化品牌选择器,支持搜索和分页加载
- 修复一些样式和布局问题,提升用户体验
肖路 1 месяц назад
Родитель
Сommit
ff456761b4
97 измененных файлов с 9380 добавлено и 298 удалено
  1. 133 0
      src/api/customer/customerInfo/index.ts
  2. 452 0
      src/api/customer/customerInfo/types.ts
  3. 355 0
      src/api/customer/supplierInfo/index.ts
  4. 910 0
      src/api/customer/supplierInfo/types.ts
  5. 63 0
      src/api/product/afterSales/index.ts
  6. 71 0
      src/api/product/afterSales/types.ts
  7. 63 0
      src/api/product/associate/index.ts
  8. 101 0
      src/api/product/associate/types.ts
  9. 63 0
      src/api/product/attributes/index.ts
  10. 166 0
      src/api/product/attributes/types.ts
  11. 0 38
      src/api/product/base.ts
  12. 211 0
      src/api/product/base/index.ts
  13. 766 0
      src/api/product/base/types.ts
  14. 63 0
      src/api/product/blacklist/index.ts
  15. 86 0
      src/api/product/blacklist/types.ts
  16. 63 0
      src/api/product/brand/index.ts
  17. 315 0
      src/api/product/brand/types.ts
  18. 87 0
      src/api/product/category/index.ts
  19. 402 0
      src/api/product/category/types.ts
  20. 63 0
      src/api/product/classification/index.ts
  21. 86 0
      src/api/product/classification/types.ts
  22. 63 0
      src/api/product/customization/index.ts
  23. 161 0
      src/api/product/customization/types.ts
  24. 63 0
      src/api/product/ensure/index.ts
  25. 71 0
      src/api/product/ensure/types.ts
  26. 63 0
      src/api/product/extend/index.ts
  27. 626 0
      src/api/product/extend/types.ts
  28. 63 0
      src/api/product/lable/index.ts
  29. 86 0
      src/api/product/lable/types.ts
  30. 63 0
      src/api/product/pool/index.ts
  31. 236 0
      src/api/product/pool/types.ts
  32. 132 0
      src/api/product/poolLink/index.ts
  33. 267 0
      src/api/product/poolLink/types.ts
  34. 63 0
      src/api/product/priceInventory/index.ts
  35. 206 0
      src/api/product/priceInventory/types.ts
  36. 33 13
      src/api/product/productBase.ts
  37. 90 0
      src/api/product/products/index.ts
  38. 189 0
      src/api/product/products/types.ts
  39. 63 0
      src/api/product/programLink/index.ts
  40. 71 0
      src/api/product/programLink/types.ts
  41. 65 0
      src/api/product/protocolInfo/index.ts
  42. 311 0
      src/api/product/protocolInfo/types.ts
  43. 63 0
      src/api/product/recommend/index.ts
  44. 116 0
      src/api/product/recommend/types.ts
  45. 63 0
      src/api/product/recommendLink/index.ts
  46. 71 0
      src/api/product/recommendLink/types.ts
  47. 63 0
      src/api/product/specs/index.ts
  48. 86 0
      src/api/product/specs/types.ts
  49. 63 0
      src/api/product/taxrate/index.ts
  50. 116 0
      src/api/product/taxrate/types.ts
  51. 5 0
      src/api/product/topics/types.ts
  52. 63 0
      src/api/product/unit/index.ts
  53. 101 0
      src/api/product/unit/types.ts
  54. 63 0
      src/api/product/volumeUnit/index.ts
  55. 71 0
      src/api/product/volumeUnit/types.ts
  56. 63 0
      src/api/product/weightUnit/index.ts
  57. 71 0
      src/api/product/weightUnit/types.ts
  58. 75 0
      src/api/system/comStaff/index.ts
  59. 215 0
      src/api/system/comStaff/types.ts
  60. 6 0
      src/router/index.ts
  61. 1 1
      src/views/platform/customerOperation/vipSite/styleDesign.vue
  62. 3 3
      src/views/platform/decoration/floor/manage.vue
  63. 14 13
      src/views/platform/decoration/guide/index.vue
  64. 4 4
      src/views/platform/decoration/special/index.vue
  65. 6 6
      src/views/platform/gift/category/index.vue
  66. 6 6
      src/views/platform/gift/floorAd/index.vue
  67. 1 1
      src/views/platform/gift/forYou/index.vue
  68. 1 1
      src/views/platform/gift/hotCustom/index.vue
  69. 5 5
      src/views/platform/industrial/booth/index.vue
  70. 3 3
      src/views/platform/industrial/brandFloor/index.vue
  71. 2 2
      src/views/product/afterSales/index.vue
  72. 2 2
      src/views/product/associate/index.vue
  73. 14 14
      src/views/product/attributes/edit.vue
  74. 12 12
      src/views/product/attributes/index.vue
  75. 297 87
      src/views/product/base/add.vue
  76. 61 17
      src/views/product/base/index.vue
  77. 4 4
      src/views/product/base/review.vue
  78. 4 4
      src/views/product/base/shelfReview.vue
  79. 2 2
      src/views/product/blacklist/index.vue
  80. 9 9
      src/views/product/brand/edit.vue
  81. 2 2
      src/views/product/brand/index.vue
  82. 3 3
      src/views/product/category/index.vue
  83. 2 2
      src/views/product/classification/index.vue
  84. 2 2
      src/views/product/customization/index.vue
  85. 2 2
      src/views/product/ensure/index.vue
  86. 2 2
      src/views/product/extend/index.vue
  87. 2 2
      src/views/product/lable/index.vue
  88. 10 10
      src/views/product/pool/index.vue
  89. 2 2
      src/views/product/pool/review.vue
  90. 2 2
      src/views/product/pool/review1.vue
  91. 5 5
      src/views/product/pool/reviewDetail.vue
  92. 4 4
      src/views/product/poolLink/index.vue
  93. 5 5
      src/views/product/poolLink/index1.vue
  94. 2 2
      src/views/product/priceInventory/index.vue
  95. 2 2
      src/views/product/unit/index.vue
  96. 2 2
      src/views/product/volumeUnit/index.vue
  97. 2 2
      src/views/product/weightUnit/index.vue

+ 133 - 0
src/api/customer/customerInfo/index.ts

@@ -0,0 +1,133 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CustomerInfoVO, CustomerInfoForm, CustomerInfoQuery } from '@/api/customer/customerInfo/types';
+
+/**
+ * 查询客户信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCustomerInfo = (query?: CustomerInfoQuery): AxiosPromise<CustomerInfoVO[]> => {
+  return request({
+    url: '/customer/customerInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户信息详细
+ * @param id
+ */
+export const getCustomerInfo = (id: string | number): AxiosPromise<CustomerInfoVO> => {
+  return request({
+    url: '/customer/customerInfo/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户信息
+ * @param data
+ */
+export const addCustomerInfo = (data: CustomerInfoForm) => {
+  return request({
+    url: '/customer/customerInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户信息
+ * @param data
+ */
+export const updateCustomerInfo = (data: CustomerInfoForm) => {
+  return request({
+    url: '/customer/customerInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户信息
+ * @param id
+ */
+export const delCustomerInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/customerInfo/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 状态修改
+ * @param id 客户id
+ * @param status 状态
+ */
+export function changeStatus(id: string, status: string) {
+  const data = {
+    id,
+    status
+  };
+  return request({
+    url: '/customer/customerInfo/changeStatus',
+    method: 'put',
+    data: data
+  });
+}
+
+/**
+ * 修改临时额度
+ * @param customerIds 客户id
+ * @param creditAmount 额度
+ */
+export function updateCreditAmount(customerIds: number[], creditAmount: number) {
+  const data = {
+    customerIds,
+    creditAmount
+  };
+  return request({
+    url: '/customer/customerInfo/updateCreditAmount',
+    method: 'put',
+    data: data
+  });
+}
+
+/**
+ * 修改临时额度
+ * @param customerIds 客户id
+ * @param tagIds 标签id
+ */
+export function setCustomerInfoTag(customerIds: number[], tagIds: number[]) {
+  const data = {
+    customerIds,
+    tagIds
+  };
+  return request({
+    url: '/customer/customerInfo/setCustomerInfoTag',
+    method: 'put',
+    data: data
+  });
+}
+
+export const listContractList = (query?: CustomerInfoQuery): AxiosPromise<CustomerInfoVO[]> => {
+  return request({
+    url: '/customer/customerInfo/contractList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 根据名称模糊查询客户信息
+ * @param customerName
+ */
+export const getListBycustomerName = (customerName: string): AxiosPromise<CustomerInfoVO[]> => {
+  return request({
+    url: '/customer/customerInfo/selectByCustomerName/' + customerName,
+    method: 'get'
+  });
+};

+ 452 - 0
src/api/customer/customerInfo/types.ts

@@ -0,0 +1,452 @@
+import type { BusinessInfoVO, BusinessInfoForm } from '@/api/customer/businessInfo/types';
+import type { CustomerContactVO, CustomerContactForm } from '@/api/customer/customerContact/types';
+import type { SalesInfoVO, SalesInfoForm } from '@/api/customer/salesInfo/types';
+import type { InvoiceInfoVO, InvoiceInfoForm } from '@/api/customer/invoiceInfo/types';
+
+export interface CustomerInfoVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 所属公司
+   */
+  belongCompanyId: string | number;
+
+  /**
+   * 公司名称
+   */
+  companyName: string;
+
+  /**
+   * 客户名称
+   */
+  customerName: string;
+
+  /**
+   * 工商名称
+   */
+  businessCustomerName: string;
+
+  /**
+   * 企业简称
+   */
+  shortName: string;
+
+  /**
+   * 开票类型
+   */
+  invoiceTypeId: string | number;
+
+  /**
+   * 企业规模
+   */
+  enterpriseScaleId: string | number;
+
+  enterpriseScale: string;
+
+  /**
+   * 客户类别
+   */
+  customerTypeId: string | number;
+
+  /**
+   * 行业类别
+   */
+  industryCategoryId: string | number;
+
+  industryCategory: string;
+
+  /**
+   * 客户等级
+   */
+  customerLevelId: string | number;
+
+  /**
+   * 固定电话
+   */
+  landline: string;
+
+  /**
+   * 传真
+   */
+  fax: string;
+
+  /**
+   * 网址
+   */
+  url: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode: string;
+
+  /**
+   * 开始时间
+   */
+  validityFromDate: string | number;
+
+  /**
+   * 结束时间
+   */
+  validityToDate: string | number;
+
+  /**
+   * 发票抬头
+   */
+  invoiceTop: string;
+
+  /**
+   * 详细地址(注册地址)
+   */
+  address: string;
+
+  /**
+   * 省份编码
+   */
+  regProvincialNo: string;
+
+  /**
+   * 城市编码
+   */
+  regCityNo: string;
+
+  /**
+   * 区县编码
+   */
+  regCountyNo: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 工商信息
+   */
+  customerBusinessInfoVo?: BusinessInfoVO;
+
+  /**
+   * 销售信息
+   */
+  customerSalesInfoVo?: SalesInfoVO;
+
+  /**
+   * 联系人列表
+   */
+  customerContactVoList?: CustomerContactVO[];
+
+  /**
+   * 开票信息列表
+   */
+  customerInvoiceInfoVoList?: InvoiceInfoVO[];
+}
+
+export interface CustomerInfoForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 所属公司
+   */
+  belongCompanyId?: string | number;
+
+  /**
+   * 公司名称
+   */
+  companyName?: string;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 工商名称
+   */
+  businessCustomerName?: string;
+
+  /**
+   * 企业简称
+   */
+  shortName?: string;
+
+  /**
+   * 开票类型
+   */
+  invoiceTypeId?: string | number;
+
+  /**
+   * 企业规模
+   */
+  enterpriseScaleId?: string | number;
+
+  /**
+   * 客户类别
+   */
+  customerTypeId?: string | number;
+
+  /**
+   * 行业类别
+   */
+  industryCategoryId?: string | number;
+
+  /**
+   * 客户等级
+   */
+  customerLevelId?: string | number;
+
+  /**
+   * 固定电话
+   */
+  landline?: string;
+
+  /**
+   * 传真
+   */
+  fax?: string;
+
+  /**
+   * 网址
+   */
+  url?: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode?: string;
+
+  /**
+   * 开始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 结束时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 发票抬头
+   */
+  invoiceTop?: string;
+
+  /**
+   * 详细地址(注册地址)
+   */
+  address?: string;
+
+  /**
+   * 省份编码
+   */
+  regProvincialNo?: string;
+
+  /**
+   * 城市编码
+   */
+  regCityNo?: string;
+
+  /**
+   * 区县编码
+   */
+  regCountyNo?: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  /**
+   * 工商信息
+   */
+  customerBusinessBo?: BusinessInfoForm;
+
+  /**
+   * 销售信息
+   */
+  customerSalesInfoBo?: SalesInfoForm;
+
+  /**
+   * 联系人列表
+   */
+  customerContactBoList?: CustomerContactForm[];
+
+  /**
+   * 开票信息列表
+   */
+  customerInvoiceInfoBoList?: InvoiceInfoForm[];
+}
+
+export interface CustomerInfoQuery extends PageQuery {
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 所属公司
+   */
+  belongCompanyId?: string | number;
+
+  /**
+   * 公司名称
+   */
+  companyName?: string;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 工商名称
+   */
+  businessCustomerName?: string;
+
+  /**
+   * 企业简称
+   */
+  shortName?: string;
+
+  /**
+   * 开票类型
+   */
+  invoiceTypeId?: string | number;
+
+  /**
+   * 企业规模
+   */
+  enterpriseScaleId?: string | number;
+
+  /**
+   * 客户类别
+   */
+  customerTypeId?: string | number;
+
+  /**
+   * 行业类别
+   */
+  industryCategoryId?: string | number;
+
+  /**
+   * 客户等级
+   */
+  customerLevelId?: string | number;
+
+  salesPersonId?: string | number;
+
+  serviceStaffId?: string | number;
+
+  belongingDepartmentId?: string | number;
+
+  /**
+   * 固定电话
+   */
+  landline?: string;
+
+  /**
+   * 传真
+   */
+  fax?: string;
+
+  /**
+   * 网址
+   */
+  url?: string;
+
+  /**
+   * 邮政编码
+   */
+  postCode?: string;
+
+  /**
+   * 开始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 结束时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 发票抬头
+   */
+  invoiceTop?: string;
+
+  /**
+   * 详细地址(注册地址)
+   */
+  address?: string;
+
+  /**
+   * 省份编码
+   */
+  regProvincialNo?: string;
+
+  /**
+   * 城市编码
+   */
+  regCityNo?: string;
+
+  /**
+   * 区县编码
+   */
+  regCountyNo?: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  customerTag?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 355 - 0
src/api/customer/supplierInfo/index.ts

@@ -0,0 +1,355 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { InfoVO, InfoForm, InfoQuery } from '@/api/customer/supplierInfo/types';
+
+/**
+ * 查询供应商信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listInfo = (query?: InfoQuery): AxiosPromise<InfoVO[]> => {
+  return request({
+    url: '/customer/info/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询供应商信息详细
+ * @param id
+ */
+export const getInfo = (id: string | number): AxiosPromise<InfoVO> => {
+  return request({
+    url: '/customer/info/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增供应商信息
+ * @param data
+ */
+export const addInfo = (data: InfoForm) => {
+  return request({
+    url: '/customer/info',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改供应商信息
+ * @param data
+ */
+export const updateInfo = (data: InfoForm) => {
+  return request({
+    url: '/customer/info',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除供应商信息
+ * @param id
+ */
+export const delInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/info/' + id,
+    method: 'delete'
+  });
+};
+
+
+/**
+ * 获取供应商类型列表
+ */
+export const getComSupTyList = () => {
+  return request({
+    url: '/system/type/getComSupTyList',
+    method: 'get'
+  });
+};
+/**
+ * 获取产品分类列表
+ */
+export const getProductCategoryList = () => {
+  return request({
+    url: '/product/category/getProductCategoryList',
+    method: 'get'
+  });
+};
+/**
+ * 获取人员信息列表
+ */
+export const getComStaffList = (params?: any) => {
+  return request({
+    url: '/system/comStaff/list',
+    method: 'get',
+    params: params
+  });
+};
+/**
+ * 获取字典数据
+ */
+export const getDictData = (dictType: string) => {
+  return request({
+    url: `/system/dict/data/type/${dictType}`,
+    method: 'get'
+  });
+};
+
+/**
+ * 查询供应商信息列表(新接口,包含产品经理和采购员)
+ * @param query
+ * @returns {*}
+ */
+export const getInfoList = (query?: InfoQuery): AxiosPromise<InfoVO[]> => {
+  return request({
+    url: '/customer/info/getList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询待审核供应商信息列表
+ * @param query
+ * @returns {*}
+ */
+export const getApproveList = (query?: InfoQuery): AxiosPromise<InfoVO[]> => {
+  return request({
+    url: '/customer/info/getApproveList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 根据供应商ID获取人员信息
+ * @param supplierId 供应商ID
+ */
+export const getStaffInfoById = (supplierId: string | number) => {
+  return request({
+    url: '/system/comStaff/informationById',
+    method: 'get',
+    params: { supplierId }
+  });
+};
+
+/**
+ * 获取所有人员信息(用于下拉框)
+ */
+export const getStaffListSplice = () => {
+  return request({
+    url: '/system/comStaff/listSplice',
+    method: 'get'
+  });
+};
+
+/**
+ * 根据供应商ID获取产品经理和采购员ID
+ * @param supplierId 供应商ID
+ */
+export const getSupplierStaffIds = (supplierId: string | number) => {
+  return request({
+    url: '/system/comStaff/informationById',
+    method: 'get',
+    params: { supplierId: supplierId }
+  });
+};
+
+/**
+ * 根据供应商ID获取联系人列表
+ * @param supplierId 供应商ID
+ * @param params 分页参数
+ */
+export const getContactListById = (supplierId: string | number, params?: any) => {
+  return request({
+    url: '/customer/contact/getSupplierContactlistById',
+    method: 'get',
+    params: {
+      supplierId: supplierId,
+      ...params
+    }
+  });
+};
+
+/**
+ * 根据供应商ID获取已选择的品目ID列表
+ * @param supplierId 供应商ID
+ */
+export const getSupplierCategories = (supplierId: string | number) => {
+  return request({
+    url: '/customer/info/getSupplierCategories',
+    method: 'get',
+    params: { supplierId }
+  });
+};
+
+/**
+ * 根据供应商ID获取合同列表
+ * @param supplierId 供应商ID
+ * @param params 查询参数
+ */
+export const getSupplierContractsById = (supplierId: string | number, params?: any) => {
+  return request({
+    url: '/customer/supplierContract/supplierContractsById',
+    method: 'get',
+    params: {
+      supplierId: supplierId,
+      ...params
+    }
+  });
+};
+
+/**
+ * 根据供应商ID获取合同列表(新接口)
+ * @param supplierId 供应商ID
+ * @param params 查询参数
+ */
+export const getContractListById = (supplierId: string | number, params?: any) => {
+  return request({
+    url: '/customer/supplierContract/getListbyId',
+    method: 'get',
+    params: {
+      supplierId: supplierId,
+      ...params
+    }
+  });
+};
+
+/**
+ * 根据供应商ID获取银行账户信息
+ * @param id 供应商ID
+ */
+export const getBankBySupplierId = (id: string | number) => {
+  return request({
+    url: '/customer/supplierbank/getBankBySupplierId',
+    method: 'get',
+    params: { id }
+  });
+};
+
+/**
+ * 根据供应商ID获取授权详情列表
+ * @param supplierId 供应商ID
+ */
+export const getAuthorizeDetailList = (supplierId: string | number) => {
+  return request({
+    url: '/customer/supplierauthorize/getAuthorizeDetailList',
+    method: 'get',
+    params: { supplierId }
+  });
+};
+
+/**
+ * 保存供应商采购信息(产品经理和采购员)
+ * @param data 采购信息数据
+ */
+export const savePurchaseInfo = (data: { supplierId: string | number; productManager: number | null; purchaser: number | null }) => {
+  return request({
+    url: '/system/comStaff/saveInformation',
+    method: 'post',
+    data: data
+  });
+};
+/**
+ * 根据供应商ID获取地址列表
+ * @param supplierId 供应商ID
+ */
+export const getSupplierAddressById = (supplierId: string | number) => {
+  return request({
+    url: '/customer/supplieraddress/supplierAddressById',
+    method: 'get',
+    params: { supplierId }
+  });
+};
+
+/**
+ * 获取公司列表
+ */
+export const getCompanyList = () => {
+  return request({
+    url: '/system/company/list',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取供应商类型列表
+ */
+export const getSupplierTypeList = (params?: any) => {
+  return request({
+    url: '/system/type/list',
+    method: 'get',
+    params: {
+
+
+      dataSource: 'youyi',
+      ...params
+    }
+  });
+};
+
+/**
+ * 获取供应商等级列表
+ */
+export const getSupplierLevelList = () => {
+  return request({
+    url: '/system/level/list',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取企业规模列表
+ */
+export const getEnterpriseScaleList = () => {
+  return request({
+    url: '/customer/enterpriseScale/getlist',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取行业类别列表
+ */
+export const getIndustryCategoryList = () => {
+  return request({
+    url: '/customer/industryCategory/getlist',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取税率列表
+ */
+export const getTaxRateList = () => {
+  return request({
+    url: '/system/taxrate/list',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取结算方式列表
+ */
+export const getSettlementMethodList = () => {
+  return request({
+    url: '/system/settlementMethod/list',
+    method: 'get'
+  });
+};
+
+/**
+ * 获取发票类型列表
+ */
+export const getInvoiceTypeList = () => {
+  return request({
+    url: '/system/invoiceType/list',
+    method: 'get'
+  });
+};

+ 910 - 0
src/api/customer/supplierInfo/types.ts

@@ -0,0 +1,910 @@
+export interface InfoVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo: string;
+
+  /**
+   * 企业名称
+   */
+  enterpriseName: string;
+
+  /**
+   * 人员规模
+   */
+  membershipSize: string;
+
+  /**
+   * 供应商类型
+   */
+  supplierType: string | number;
+
+  /**
+   * 合作类型
+   */
+  cooperationType: string;
+
+  /**
+   * 固定电话
+   */
+  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;
+
+  /**
+   * 注册资本
+   */
+  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-邀请招标...)
+   */
+  cooperateWay: number;
+
+  /**
+   * 合作等级
+   */
+  cooperateLevel: string | number;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime: string;
+
+  /**
+   * 供应状态(0-暂停, 1-正常...)
+   */
+  supplyStatus: number;
+
+  /**
+   * 供应评分
+   */
+  supplyScore: number;
+
+  /**
+   * 年销售额
+   */
+  yearSales: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone: string;
+
+  /**
+   * 供应商登录密码(已加密)
+   */
+  supplierPassword: string;
+
+  /**
+   * 经营品类
+   */
+  operatingCategory: string;
+
+  /**
+   * 经营品牌
+   */
+  operatingBrand: string;
+
+  /**
+   * 其他客户
+   */
+  otherCustomers: string;
+
+  /**
+   * 简称
+   */
+  shortName: string;
+
+  /**
+   * 所属行业
+   */
+  industrCategory: string;
+
+  /**
+   * 类型(可能与supplier_type重复或细分)
+   */
+  type: string;
+
+  /**
+   * 所属公司
+   */
+  ownedCompany: string;
+
+  /**
+   * 推送状态(0-未推送, 1-已推送...)
+   */
+  pushStatus: number;
+
+  /**
+   * 创建时间
+   */
+  created: string;
+
+  /**
+   * 修改时间
+   */
+  modify: string;
+
+  /**
+   * 有效期开始时间
+   */
+  validityFromDate: string | number;
+
+  /**
+   * 有效期结束时间
+   */
+  validityToDate: string | number;
+
+  /**
+   * 行号(可能是内部排序或备用字段)
+   */
+  rowNo: number;
+
+  /**
+   * 法人身份证图片路径
+   */
+  personImage: string;
+
+  /**
+   * 法人身份证图片路径Url
+   */
+  personImageUrl: string;
+  /**
+   * 对接次数
+   */
+  abutmentNo: number;
+
+  /**
+   * 是否合作(1-是, 0-否)
+   */
+  cooperative: number;
+
+  /**
+   * 供货区域(省)
+   */
+  province?: string;
+
+  /**
+   * 供货区域(市)
+   */
+  city?: string;
+
+}
+
+export interface InfoForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 企业名称
+   */
+  enterpriseName?: string;
+
+  /**
+   * 人员规模
+   */
+  membershipSize?: string;
+
+  /**
+   * 供应商类型
+   */
+  supplierType?: string;
+
+  /**
+   * 合作类型
+   */
+  cooperationType?: string;
+
+  /**
+   * 固定电话
+   */
+  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;
+
+  /**
+   * 注册资本
+   */
+  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-邀请招标...)
+   */
+  cooperateWay?: number;
+
+  /**
+   * 合作等级
+   */
+  cooperateLevel?: string;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime?: string;
+
+  /**
+   * 供应状态(0-暂停, 1-正常...)
+   */
+  supplyStatus?: number;
+
+  /**
+   * 供应评分
+   */
+  supplyScore?: number;
+
+  /**
+   * 年销售额
+   */
+  yearSales?: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName?: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone?: string;
+
+  /**
+   * 供应商登录密码(已加密)
+   */
+  supplierPassword?: string;
+
+  /**
+   * 经营品类
+   */
+  operatingCategory?: string;
+
+  /**
+   * 经营品牌
+   */
+  operatingBrand?: string;
+
+  /**
+   * 其他客户
+   */
+  otherCustomers?: string;
+
+  /**
+   * 简称
+   */
+  shortName?: string;
+
+  /**
+   * 所属行业
+   */
+  industrCategory?: string;
+
+  /**
+   * 类型(可能与supplier_type重复或细分)
+   */
+  type?: string;
+
+  /**
+   * 所属公司
+   */
+  ownedCompany?: string;
+
+  /**
+   * 推送状态(0-未推送, 1-已推送...)
+   */
+  pushStatus?: number;
+
+  /**
+   * 创建时间
+   */
+  created?: string;
+
+  /**
+   * 修改时间
+   */
+  modify?: string;
+
+  /**
+   * 有效期开始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 有效期结束时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 行号(可能是内部排序或备用字段)
+   */
+  rowNo?: number;
+
+  /**
+   * 法人身份证图片路径
+   */
+  personImage?: string;
+
+  /**
+   * 对接次数
+   */
+  abutmentNo?: number;
+
+  /**
+   * 是否合作(1-是, 0-否)
+   */
+  cooperative?: number;
+
+}
+
+export interface InfoQuery extends PageQuery {
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 企业名称
+   */
+  enterpriseName?: string;
+
+  /**
+   * 人员规模
+   */
+  membershipSize?: string;
+
+  /**
+   * 供应商类型
+   */
+  supplierType?: string;
+
+  /**
+   * 合作类型
+   */
+  cooperationType?: string;
+
+  /**
+   * 固定电话
+   */
+  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;
+
+  /**
+   * 注册资本
+   */
+  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-邀请招标...)
+   */
+  cooperateWay?: number;
+
+  /**
+   * 合作等级
+   */
+  cooperateLevel?: string;
+
+  /**
+   * 合同到期时间
+   */
+  contractEndTime?: string;
+
+  /**
+   * 供应状态(0-暂停, 1-正常...)
+   */
+  supplyStatus?: number;
+
+  /**
+   * 供应评分
+   */
+  supplyScore?: number;
+
+  /**
+   * 年销售额
+   */
+  yearSales?: number;
+
+  /**
+   * 供应商联系人姓名
+   */
+  supplierName?: string;
+
+  /**
+   * 供应商联系人电话
+   */
+  supplierPhone?: string;
+
+  /**
+   * 供应商登录密码(已加密)
+   */
+  supplierPassword?: string;
+
+  /**
+   * 经营品类
+   */
+  operatingCategory?: string;
+
+  /**
+   * 经营品牌
+   */
+  operatingBrand?: string;
+
+  /**
+   * 其他客户
+   */
+  otherCustomers?: string;
+
+  /**
+   * 简称
+   */
+  shortName?: string;
+
+  /**
+   * 所属行业
+   */
+  industrCategory?: string;
+
+  /**
+   * 类型(可能与supplier_type重复或细分)
+   */
+  type?: string;
+
+  /**
+   * 所属公司
+   */
+  ownedCompany?: string;
+
+  /**
+   * 推送状态(0-未推送, 1-已推送...)
+   */
+  pushStatus?: number;
+
+  /**
+   * 创建时间
+   */
+  created?: string;
+
+  /**
+   * 修改时间
+   */
+  modify?: string;
+
+  /**
+   * 有效期开始时间
+   */
+  validityFromDate?: string | number;
+
+  /**
+   * 有效期结束时间
+   */
+  validityToDate?: string | number;
+
+  /**
+   * 行号(可能是内部排序或备用字段)
+   */
+  rowNo?: number;
+
+  /**
+   * 法人身份证图片路径
+   */
+  personImage?: string;
+
+  /**
+   * 对接次数
+   */
+  abutmentNo?: number;
+
+  /**
+   * 是否合作(1-是, 0-否)
+   */
+  cooperative?: number;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/afterSales/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { AfterSalesVO, AfterSalesForm, AfterSalesQuery } from '@/api/product/afterSales/types';
+
+/**
+ * 查询产品售后服务项列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listAfterSales = (query?: AfterSalesQuery): AxiosPromise<AfterSalesVO[]> => {
+  return request({
+    url: '/product/afterSales/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品售后服务项详细
+ * @param id
+ */
+export const getAfterSales = (id: string | number): AxiosPromise<AfterSalesVO> => {
+  return request({
+    url: '/product/afterSales/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品售后服务项
+ * @param data
+ */
+export const addAfterSales = (data: AfterSalesForm) => {
+  return request({
+    url: '/product/afterSales',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品售后服务项
+ * @param data
+ */
+export const updateAfterSales = (data: AfterSalesForm) => {
+  return request({
+    url: '/product/afterSales',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品售后服务项
+ * @param id
+ */
+export const delAfterSales = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/afterSales/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/afterSales/types.ts

@@ -0,0 +1,71 @@
+export interface AfterSalesVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 售后服务项目(如:保修、退换货、技术支持等)
+   */
+  afterSalesItems: string;
+
+  /**
+   * 数据来源(如:系统录入、接口同步等)
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface AfterSalesForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 售后服务项目(如:保修、退换货、技术支持等)
+   */
+  afterSalesItems?: string;
+
+  /**
+   * 数据来源(如:系统录入、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface AfterSalesQuery extends PageQuery {
+
+  /**
+   * 售后服务项目(如:保修、退换货、技术支持等)
+   */
+  afterSalesItems?: string;
+
+  /**
+   * 数据来源(如:系统录入、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/associate/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { AssociateVO, AssociateForm, AssociateQuery } from '@/api/product/associate/types';
+
+/**
+ * 查询产品关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listAssociate = (query?: AssociateQuery): AxiosPromise<AssociateVO[]> => {
+  return request({
+    url: '/product/associate/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品关联详细
+ * @param id
+ */
+export const getAssociate = (id: string | number): AxiosPromise<AssociateVO> => {
+  return request({
+    url: '/product/associate/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品关联
+ * @param data
+ */
+export const addAssociate = (data: AssociateForm) => {
+  return request({
+    url: '/product/associate',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品关联
+ * @param data
+ */
+export const updateAssociate = (data: AssociateForm) => {
+  return request({
+    url: '/product/associate',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品关联
+ * @param id
+ */
+export const delAssociate = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/associate/' + id,
+    method: 'delete'
+  });
+};

+ 101 - 0
src/api/product/associate/types.ts

@@ -0,0 +1,101 @@
+export interface AssociateVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 主产品id
+   */
+  productId: string | number;
+
+  /**
+   * 关联产品编号列表(如:用逗号分隔的产品编号)
+   */
+  productIds: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional: string | number;
+
+  /**
+   * 关联标题/展示名称
+   */
+  relatedTitle: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface AssociateForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 主产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 关联产品编号列表(如:用逗号分隔的产品编号)
+   */
+  productIds?: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional?: string | number;
+
+  /**
+   * 关联标题/展示名称
+   */
+  relatedTitle?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface AssociateQuery extends PageQuery {
+
+  /**
+   * 主产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 关联产品编号列表(如:用逗号分隔的产品编号)
+   */
+  productIds?: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional?: string | number;
+
+  /**
+   * 关联标题/展示名称
+   */
+  relatedTitle?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/attributes/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { AttributesVO, AttributesForm, AttributesQuery } from '@/api/product/attributes/types';
+
+/**
+ * 查询产品属性定义(用于动态属性配置)列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listAttributes = (query?: AttributesQuery): AxiosPromise<AttributesVO[]> => {
+  return request({
+    url: '/product/attributes/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品属性定义(用于动态属性配置)详细
+ * @param id
+ */
+export const getAttributes = (id: string | number): AxiosPromise<AttributesVO> => {
+  return request({
+    url: '/product/attributes/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品属性定义(用于动态属性配置)
+ * @param data
+ */
+export const addAttributes = (data: AttributesForm) => {
+  return request({
+    url: '/product/attributes',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品属性定义(用于动态属性配置)
+ * @param data
+ */
+export const updateAttributes = (data: AttributesForm) => {
+  return request({
+    url: '/product/attributes',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品属性定义(用于动态属性配置)
+ * @param id
+ */
+export const delAttributes = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/attributes/' + id,
+    method: 'delete'
+  });
+};

+ 166 - 0
src/api/product/attributes/types.ts

@@ -0,0 +1,166 @@
+  export interface AttributesVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 关联的产品分类id
+   */
+  categoryId: string | number;
+
+  /**
+   * 产品分类名称
+   */
+  categoryName?: string;
+
+  /**
+   * 属性编码(用于系统识别)
+   */
+  productAttributesCode: string;
+
+  /**
+   * 属性显示名称
+   */
+  productAttributesName: string;
+
+  /**
+   * 是否可选:0=单选属性,1=唯一属性,2=复选属性
+   */
+  isOptional: string;
+
+  /**
+   * 属性录入方式(1=手工录入,2=从列表中选择)
+   */
+  entryMethod: string;
+
+  /**
+   * 是否用于商品筛选:1=是,0=否
+   */
+  isFilter: string;
+
+  /**
+   * 预定义属性值列表(逗号分隔或JSON)
+   */
+  attributesList: string;
+
+  /**
+   * 是否必填: 1=是, 0=否
+   */
+  required: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface AttributesForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 关联的产品分类id
+   */
+  categoryId?: string | number;
+
+  /**
+   * 属性编码(用于系统识别)
+   */
+  productAttributesCode?: string;
+
+  /**
+   * 属性显示名称
+   */
+  productAttributesName?: string;
+
+  /**
+   * 是否可选:0=单选属性,1=唯一属性,2=复选属性
+   */
+  isOptional?: string | number;
+
+  /**
+   * 属性录入方式(manual=手工录入,select=从列表中选择)
+   */
+  entryMethod?: string;
+
+  /**
+   * 是否用于商品筛选:1=是,0=否
+   */
+  isFilter?: string | number;
+
+  /**
+   * 预定义属性值列表(逗号分隔或JSON)
+   */
+  attributesList?: string;
+
+  /**
+   * 是否必填: 1=是, 0=否
+   */
+  required?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface AttributesQuery extends PageQuery {
+
+  /**
+   * 关联的产品分类id
+   */
+  categoryId?: string | number;
+
+  /**
+   * 属性编码(用于系统识别)
+   */
+  productAttributesCode?: string;
+
+  /**
+   * 属性显示名称
+   */
+  productAttributesName?: string;
+
+  /**
+   * 是否可选:0=单选属性,1=唯一属性,2=复选属性
+   */
+  isOptional?: string;
+
+  /**
+   * 属性录入方式(manual=手工录入,select=从列表中选择)
+   */
+  entryMethod?: string;
+
+  /**
+   * 是否用于商品筛选:1=是,0=否
+   */
+  isFilter?: string;
+
+  /**
+   * 预定义属性值列表(逗号分隔或JSON)
+   */
+  attributesList?: string;
+
+  /**
+   * 是否必填: 1=是, 0=否
+   */
+  required?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 0 - 38
src/api/product/base.ts

@@ -1,38 +0,0 @@
-import request from '@/utils/request';
-
-const baseUrl = '/product/base';
-
-// 查询商品列表
-export function listProduct(params: any) {
-  return request.get(baseUrl + '/list', { params });
-}
-
-// 获取商品详情
-export function getProduct(id: number | string) {
-  return request.get(`${baseUrl}/${id}`);
-}
-
-// 新增商品
-export function addProduct(data: any) {
-  return request.post(baseUrl, data);
-}
-
-// 修改商品
-export function updateProduct(data: any) {
-  return request.put(baseUrl, data);
-}
-
-// 删除商品
-export function delProduct(id: number | string) {
-  return request.delete(`${baseUrl}/${id}`);
-}
-
-// 获取分类树
-export function getCategoryTree(params?: any) {
-  return request.get(baseUrl + '/categoryTree', { params });
-}
-
-// 获取品牌列表
-export function getBrandList(params?: any) {
-  return request.get(baseUrl + '/brandList', { params });
-}

+ 211 - 0
src/api/product/base/index.ts

@@ -0,0 +1,211 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BaseVO, BaseForm, BaseQuery, StatusCountVo } from '@/api/product/base/types';
+import { CategoryQuery, categoryTreeVO, CategoryVO } from '../category/types';
+import { BrandQuery, BrandVO } from '../brand/types';
+import { AttributesVO } from '../attributes/types';
+import { EnsureQuery, EnsureVO } from '../ensure/types';
+import { AfterSalesQuery, AfterSalesVO } from '../afterSales/types';
+import { UnitQuery, UnitVO } from '../unit/types';
+
+/**
+ * 查询产品基础信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBase = (query?: BaseQuery): AxiosPromise<BaseVO[]> => {
+  return request({
+    url: '/product/base/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品基础信息详细
+ * @param id
+ */
+export const getBase = (id: string | number): AxiosPromise<BaseVO> => {
+  return request({
+    url: '/product/base/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品基础信息
+ * @param data
+ */
+export const addBase = (data: BaseForm) => {
+  return request({
+    url: '/product/base',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品基础信息
+ * @param data
+ */
+export const updateBase = (data: BaseForm) => {
+  return request({
+    url: '/product/base',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品基础信息
+ * @param id
+ */
+export const delBase = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/base/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 获取产品分类树
+ * @param query
+ * @returns {*}
+ */
+export const categoryTree = (query?: CategoryQuery): AxiosPromise<categoryTreeVO[]> => {
+  return request({
+    url: '/product/base/categoryTree',
+    method: 'get',
+    params: query
+  });
+};
+/**
+ * 查询产品分类信息列表
+ * @param query
+ * @returns {*}
+ */
+export const categoryList = (query?: CategoryQuery): AxiosPromise<CategoryVO[]> => {
+  return request({
+    url: '/product/base/categoryList',
+    method: 'get',
+    params: query
+  });
+};
+/**
+ * 查询产品品牌信息列表
+ * @param query
+ * @returns {*}
+ */
+export const brandList = (query?: BrandQuery): AxiosPromise<BrandVO[]> => {
+  return request({
+    url: '/product/base/brandList',
+    method: 'get',
+    params: query
+  });
+};
+/**
+ * 查询产品分类下的属性列表
+ * @param id
+ * @returns {*}
+ */
+export const categoryAttributeList = (id: string | number): AxiosPromise<AttributesVO[]> => {
+  return request({
+    url: '/product/base/getProductAttributeList/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 查询产品服务保障列表
+ * @param query
+ * @returns {*}
+ */
+export const getServiceList = (query?: EnsureQuery): AxiosPromise<EnsureVO[]> => {
+  return request({
+    url: '/product/base/getServiceList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 获取售后服务信息列表
+ * @param query
+ * @returns {*}
+ */
+export const getAfterSaleList = (query?: AfterSalesQuery): AxiosPromise<AfterSalesVO[]> => {
+  return request({
+    url: '/product/base/getAfterSalesList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 获取单位信息列表
+ * @param query
+ * @returns {*}
+ */
+export const getUnitList = (query?: UnitQuery): AxiosPromise<UnitVO[]> => {
+  return request({
+    url: '/product/base/getUnitList',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 商品审核
+ * @param data 审核信息(包含id、productReviewStatus、reviewComments)
+ */
+export const reviewBase = (data: BaseForm) => {
+  return request({
+    url: '/product/base/review',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 商品上下架审核
+ * @param data 审核信息(包含id、productStatus、shelfComments)
+ */
+export const shelfReview = (data: BaseForm) => {
+  return request({
+    url: '/product/base/shelfReview',
+    method: 'post',
+    data: data
+  });
+};
+/**
+ * 获取所有商品各个状态数量
+ */
+export const getProductStatusCount = (): AxiosPromise<StatusCountVo> => {
+  return request({
+    url: '/product/base/getProductStatusCount',
+    method: 'get'
+  });
+};
+/**
+ * 商品类型改变  1=默认类型,2精选商品,3=停售商品
+ * @param data 停售信息(包含id、productStatus、shelfComments)
+ */
+export const changeProductType = (data: BaseForm) => {
+  return request({
+    url: '/product/base/changeProductType',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 获取税率列表
+ */
+export const getTaxRateList = () => {
+  return request({
+    url: '/system/taxrate/list',
+    method: 'get'
+  });
+};
+

+ 766 - 0
src/api/product/base/types.ts

@@ -0,0 +1,766 @@
+export interface BaseVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 产品编号
+   */
+  productNo: string;
+
+  /**
+   * 项目名称
+   */
+  itemName: string;
+
+  /**
+   * 品牌id
+   */
+  brandId: string | number;
+
+  /**
+   * 顶级分类id
+   */
+  topCategoryId: string | number;
+
+  /**
+   * 中级分类id
+   */
+  mediumCategoryId: string | number;
+
+  /**
+   * 底层分类id
+   */
+  bottomCategoryId: string | number;
+
+  /**
+   * 单位id
+   */
+  unitId: string | number;
+
+  /**
+   * 产品图片URL
+   */
+  productImage: string;
+
+  /**
+   * 产品图片URLUrl
+   */
+  productImageUrl: string;
+  /**
+   * 是否自营(1=是,0=否)
+   */
+  isSelf: string;
+
+  /**
+   * 商品类型 1=默认类型,2精选商品,3=停售商品
+   * */
+  productCategory?: number;
+
+  /**
+   * 产品审核状态 0=待采购审核,1=审核通过,2=驳回,3=待营销审核
+   */
+  productReviewStatus: string;
+
+  /**
+   * 首页推荐:1=推荐,0=不推荐
+   */
+  homeRecommended: string;
+
+  /**
+   * 分类推荐:1=推荐,0=不推荐
+   */
+  categoryRecommendation: string;
+
+  /**
+   * 购物车推荐:1=推荐,0=不推荐
+   */
+  cartRecommendation: string;
+
+  /**
+   * 推荐产品顺序
+   */
+  recommendedProductOrder: number;
+
+  /**
+   * 是否热门:1=是,0=否
+   */
+  isPopular: string;
+
+  /**
+   * 是否新品:1=是,0=否
+   */
+  isNew: string;
+
+  /**
+   * 商品状态:1=已上架,0=下架,2=上架中
+   */
+  productStatus: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 市场价
+   */
+  marketPrice: number;
+
+  /**
+   * 会员价格
+   */
+  memberPrice: number;
+
+  /**
+   * 最低销售价格
+   */
+  minSellingPrice: number;
+
+  /**
+   * 采购价格
+   */
+  purchasingPrice: number;
+
+  /**
+   * 暂估毛利率
+   */
+  tempGrossMargin: number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 主库简介
+   */
+  mainLibraryIntro?: string;
+
+  /**
+   * 售后服务
+   */
+  afterSalesService?: string;
+
+  /**
+   * 服务保障 支持多选,分隔 (存储服务保障ID列表,如: "1,2,3")
+   */
+  serviceGuarantee?: string;
+
+  /**
+   * 安装服务 - 免费安装
+   */
+  freeInstallation?: string;
+
+  /**
+   * 市场价
+   */
+  midRangePrice?: number;
+
+  /**
+   * 平档价
+   */
+  standardPrice?: number;
+
+  /**
+   * 最低售价
+   */
+  certificatePrice?: number;
+
+  /**
+   * 售价验证量
+   */
+  priceVerificationQuantity?: string;
+
+  /**
+   * 采购价
+   */
+  purchasePrice?: number;
+
+  /**
+   * 暂估采购价
+   */
+  estimatedPurchasePrice?: number;
+
+  /**
+   * 产品性质
+   */
+  productNature?: string;
+
+  /**
+   * 采购人员
+   */
+  purchasingPersonnel?: string;
+
+  /**
+   * 旧属性类型
+   */
+  oldAttributeType?: string;
+
+  /**
+   * 录入套数
+   */
+  entrySetCount?: string;
+
+  /**
+   * 商品主图
+   */
+  mainImage?: string;
+
+  /**
+   * 商品详情 - 电脑端
+   */
+  pcDetail?: string;
+
+  /**
+   * 商品详情 - 移动端
+   */
+  mobileDetail?: string;
+
+  /**
+   * 税率
+   */
+  taxRate?: number;
+
+  /**
+   * 币种
+   */
+  currency?: string;
+
+  /**
+   * 最低起订量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 审核意见
+   */
+  reviewComments?: string;
+
+  /**
+   * 商品属性值(JSON字符串)
+   */
+  attributesList?: string;
+
+  /**
+   * 商品轮播图URL(逗号分隔)
+   */
+  imageUrl?: string;
+
+}
+
+export interface BaseForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productNo?: string;
+
+  /**
+   * 项目名称
+   */
+  itemName?: string;
+
+  /**
+   * 品牌id
+   */
+  brandId?: string | number;
+
+  /**
+   * 顶级分类id
+   */
+  topCategoryId?: string | number;
+
+  /**
+   * 中级分类id
+   */
+  mediumCategoryId?: string | number;
+
+  /**
+   * 底层分类id
+   */
+  bottomCategoryId?: string | number;
+
+  /**
+   * 单位id
+   */
+  unitId?: string | number;
+
+  /**
+   * 产品图片URL
+   */
+  productImage?: string;
+
+  /**
+   * 是否自营(1=是,0=否)
+   */
+  isSelf?: number;
+
+  /**
+   * 商品类型 1=默认类型,2精选商品,3=停售商品
+   * */
+  productCategory?: number;
+
+  /**
+   * 产品审核状态 0=待采购审核,1=审核通过,2=驳回,3=待营销审核
+   */
+  productReviewStatus?: number;
+
+  /**
+   * 首页推荐:1=推荐,0=不推荐
+   */
+  homeRecommended?: number;
+
+  /**
+   * 分类推荐:1=推荐,0=不推荐
+   */
+  categoryRecommendation?: number;
+
+  /**
+   * 购物车推荐:1=推荐,0=不推荐
+   */
+  cartRecommendation?: number;
+
+  /**
+   * 推荐产品顺序
+   */
+  recommendedProductOrder?: number;
+
+  /**
+   * 是否热门:1=是,0=否
+   */
+  isPopular?: number;
+
+  /**
+   * 是否新品:1=是,0=否
+   */
+  isNew?: number;
+
+  /**
+   * 商品状态:1=已上架,0=下架,2=上架中
+   */
+  productStatus?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  /**
+   * 款号
+   */
+  styleNo?: string;
+
+  /**
+   * A10产品名称
+   */
+  a10ProductName?: string;
+
+  /**
+   * 规格型号
+   */
+  specification?: string;
+
+  /**
+   * UPC(S)条码
+   */
+  upcBarcode?: string;
+
+  /**
+   * 发票名称
+   */
+  invoiceName?: string;
+
+  /**
+   * 发票规格
+   */
+  invoiceSpec?: string;
+
+  /**
+   * 产品品牌
+   */
+  productBrand?: string;
+
+  /**
+   * 段号
+   */
+  sectionNo?: string;
+
+  /**
+   * 包装规格
+   */
+  packagingSpec?: string;
+
+  /**
+   * 采用基准
+   */
+  adoptionStandard?: string;
+
+  /**
+   * 采品性质
+   */
+  purchaseNature?: string;
+
+  /**
+   * 参考链接
+   */
+  referenceLink?: string;
+
+  /**
+   * 商品重量
+   */
+  weight?: string;
+
+  /**
+   * 重量单位
+   */
+  weightUnit?: string;
+
+  /**
+   * 商品体积
+   */
+  volume?: string;
+
+  /**
+   * 体积单位
+   */
+  volumeUnit?: string;
+
+  /**
+   * 主库简介
+   */
+  mainLibraryIntro?: string;
+
+  /**
+   * 售后服务
+   */
+  afterSalesService?: string;
+
+  /**
+   * 服务保障 支持多选,分隔 (存储服务保障ID列表,如: "1,2,3")
+   */
+  serviceGuarantee?: string;
+
+  /**
+   * 安装服务 - 免费安装
+   */
+  freeInstallation?: string;
+
+  /**
+   * 市场价
+   */
+  midRangePrice?: number;
+
+  /**
+   * 平档价
+   */
+  standardPrice?: number;
+
+  /**
+   * 最低售价
+   */
+  certificatePrice?: number;
+
+  /**
+   * 售价验证量
+   */
+  priceVerificationQuantity?: string;
+
+  /**
+   * 采购价
+   */
+  purchasePrice?: number;
+
+  /**
+   * 暂估采购价
+   */
+  estimatedPurchasePrice?: number;
+
+  /**
+   * 产品性质
+   */
+  productNature?: string;
+
+  /**
+   * 采购人员
+   */
+  purchasingPersonnel?: string;
+
+  /**
+   * 旧属性类型
+   */
+  oldAttributeType?: string;
+
+  /**
+   * 录入套数
+   */
+  entrySetCount?: string;
+
+  /**
+   * 商品主图
+   */
+  mainImage?: string;
+
+  /**
+   * 商品详情 - 电脑端
+   */
+  pcDetail?: string;
+
+  /**
+   * 商品详情 - 移动端
+   */
+  mobileDetail?: string;
+
+  /**
+   * 税率
+   */
+  taxRate?: number;
+
+  /**
+   * 币种
+   */
+  currency?: string;
+
+  /**
+   * 最低起订量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 是否可定制
+   */
+  customizable?: boolean;
+
+  /**
+   * 定制方式(逗号分隔)
+   */
+  customizedStyle?: string;
+
+  /**
+   * 定制工艺(逗号分隔)
+   */
+  customizedCraft?: string;
+
+  /**
+   * 定制说明
+   */
+  customDescription?: string;
+
+  /**
+   * 定制详情列表(JSON字符串)
+   */
+  customDetailsJson?: string;
+
+  /**
+   * 销售量/销量人气
+   */
+  salesVolume?: number;
+
+  /**
+   * 商品属性值(JSON字符串)
+   */
+  attributesList?: string;
+
+  /**
+   * 审核意见
+   */
+  reviewComments?: string;
+
+  /**
+   * 上下架审核意见
+   */
+  shelfComments?: string;
+
+  /**
+   * 商品轮播图URL(逗号分隔)
+   */
+  imageUrl?: string;
+
+}
+
+export interface BaseQuery extends PageQuery {
+
+  /**
+   * 搜索文本(商品名称/商品编号)
+   */
+  searchText?: string;
+
+  /**
+   * 产品编号
+   */
+  productNo?: string;
+
+  /**
+   * 项目名称
+   */
+  itemName?: string;
+
+  /**
+   * 品牌id
+   */
+  brandId?: string | number;
+
+  /**
+   * 商品品牌名称
+   */
+  brandName?: string;
+
+  /**
+   * 顶级分类id
+   */
+  topCategoryId?: string | number;
+
+  /**
+   * 中级分类id
+   */
+  mediumCategoryId?: string | number;
+
+  /**
+   * 底层分类id
+   */
+  bottomCategoryId?: string | number;
+
+  /**
+   * 单位id
+   */
+  unitId?: string | number;
+
+  /**
+   * 产品图片URL
+   */
+  productImage?: string;
+
+  /**
+   * 是否自营(1=是,0=否)
+   */
+  isSelf?: number;
+
+  /**
+   * 商品类型 1=默认类型,2精选商品,3=停售商品
+   * */
+  productCategory?: number;
+
+  /**
+   * 产品审核状态 0=待采购审核,1=审核通过,2=驳回,3=待营销审核
+   */
+  productReviewStatus?: number;
+
+  /**
+   * 首页推荐:1=推荐,0=不推荐
+   */
+  homeRecommended?: number;
+
+  /**
+   * 分类推荐:1=推荐,0=不推荐
+   */
+  categoryRecommendation?: number;
+
+  /**
+   * 购物车推荐:1=推荐,0=不推荐
+   */
+  cartRecommendation?: number;
+
+  /**
+   * 推荐产品顺序
+   */
+  recommendedProductOrder?: number;
+
+  /**
+   * 是否热门:1=是,0=否
+   */
+  isPopular?: number;
+
+  /**
+   * 是否新品:1=是,0=否
+   */
+  isNew?: number;
+
+  /**
+   * 商品状态:1=已上架,0=下架,2=上架中
+   */
+  productStatus?: number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 商品标签
+   */
+  productTag?: string;
+
+  /**
+   * 采购性质
+   */
+  purchaseNature?: string;
+
+  /**
+   * 供应商类型
+   */
+  supplierType?: string;
+
+  /**
+   * 供应商性质
+   */
+  supplierNature?: string;
+
+  /**
+   * 项目组织
+   */
+  projectOrg?: string;
+
+
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+/**
+ * 状态数量统计视图对象
+ */
+export class StatusCountVo {
+  /**
+   * 总数
+   */
+  total: number | null = null;
+
+  /**
+   * 上架数
+   */
+  onSale: number | null = null;
+
+  /**
+   * 下架数
+   */
+  offSale: number | null = null;
+
+  /**
+   * 待审核数量
+   */
+  waitAudit: number | null = null;
+
+  /**
+   * 通过数量
+   */
+  auditPass: number | null = null;
+
+  /**
+   * 驳回数量
+   */
+  auditReject: number | null = null;
+}
+
+
+

+ 63 - 0
src/api/product/blacklist/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BlacklistVO, BlacklistForm, BlacklistQuery } from '@/api/product/blacklist/types';
+
+/**
+ * 查询产品黑名单列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBlacklist = (query?: BlacklistQuery): AxiosPromise<BlacklistVO[]> => {
+  return request({
+    url: '/product/blacklist/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品黑名单详细
+ * @param id
+ */
+export const getBlacklist = (id: string | number): AxiosPromise<BlacklistVO> => {
+  return request({
+    url: '/product/blacklist/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品黑名单
+ * @param data
+ */
+export const addBlacklist = (data: BlacklistForm) => {
+  return request({
+    url: '/product/blacklist',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品黑名单
+ * @param data
+ */
+export const updateBlacklist = (data: BlacklistForm) => {
+  return request({
+    url: '/product/blacklist',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品黑名单
+ * @param id
+ */
+export const delBlacklist = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/blacklist/' + id,
+    method: 'delete'
+  });
+};

+ 86 - 0
src/api/product/blacklist/types.ts

@@ -0,0 +1,86 @@
+export interface BlacklistVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 客户id(可为空,表示全局黑名单)
+   */
+  customerId: string | number;
+
+  /**
+   * 产品id(可为空,表示该客户对整个分类禁用)
+   */
+  productId: string | number;
+
+  /**
+   * 产品分类id(必填)
+   */
+  productCategoryId: string | number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface BlacklistForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 客户id(可为空,表示全局黑名单)
+   */
+  customerId?: string | number;
+
+  /**
+   * 产品id(可为空,表示该客户对整个分类禁用)
+   */
+  productId?: string | number;
+
+  /**
+   * 产品分类id(必填)
+   */
+  productCategoryId?: string | number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface BlacklistQuery extends PageQuery {
+
+  /**
+   * 客户id(可为空,表示全局黑名单)
+   */
+  customerId?: string | number;
+
+  /**
+   * 产品id(可为空,表示该客户对整个分类禁用)
+   */
+  productId?: string | number;
+
+  /**
+   * 产品分类id(必填)
+   */
+  productCategoryId?: string | number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/brand/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BrandVO, BrandForm, BrandQuery } from '@/api/product/brand/types';
+
+/**
+ * 查询产品品牌信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBrand = (query?: BrandQuery): AxiosPromise<BrandVO[]> => {
+  return request({
+    url: '/product/brand/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品品牌信息详细
+ * @param id
+ */
+export const getBrand = (id: string | number): AxiosPromise<BrandVO> => {
+  return request({
+    url: '/product/brand/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品品牌信息
+ * @param data
+ */
+export const addBrand = (data: BrandForm) => {
+  return request({
+    url: '/product/brand',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品品牌信息
+ * @param data
+ */
+export const updateBrand = (data: BrandForm) => {
+  return request({
+    url: '/product/brand',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品品牌信息
+ * @param id
+ */
+export const delBrand = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/brand/' + id,
+    method: 'delete'
+  });
+};

+ 315 - 0
src/api/product/brand/types.ts

@@ -0,0 +1,315 @@
+export interface BrandVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 品牌编号(唯一标识)
+   */
+  brandNo: string;
+
+  /**
+   * 品牌中文名称
+   */
+  brandName: string;
+
+  /**
+   * 品牌首字母缩写(如拼音首字母)
+   */
+  brandInitials: string;
+
+  /**
+   * 品牌英文名称
+   */
+  brandEnglishName: string;
+
+  /**
+   * 推荐值(数值越大越靠前)
+   */
+  recommendValue: number;
+
+  /**
+   * 品牌Logo图片路径或URL
+   */
+  brandLogo: string;
+
+  /**
+   * 品牌标题(用于展示)
+   */
+  brandTitle: string;
+
+  /**
+   * 品牌大图(横幅/封面图)
+   */
+  brandBigImage: string;
+
+  /**
+   * 品牌大图(横幅/封面图)Url
+   */
+  brandBigImageUrl: string;
+  /**
+   * 品牌故事(简介文本)
+   */
+  brandStory: string;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow: number;
+
+  /**
+   * 品牌注册人
+   */
+  brandRegistrant: string;
+
+  /**
+   * 许可证编号
+   */
+  license: string;
+
+  /**
+   * 注册证书编号
+   */
+  registrationCertificate: string;
+
+  /**
+   * 证书/许可过期时间
+   */
+  expireTime: string;
+
+  /**
+   * 品牌描述(较长文本)
+   */
+  brandDescribe: string;
+
+  /**
+   * 展示位置(如首页、分类页等)
+   */
+  position: string;
+
+  /**
+   * 关注度/收藏数(默认为0)
+   */
+  care: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface BrandForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 品牌编号(唯一标识)
+   */
+  brandNo?: string;
+
+  /**
+   * 品牌中文名称
+   */
+  brandName?: string;
+
+  /**
+   * 品牌首字母缩写(如拼音首字母)
+   */
+  brandInitials?: string;
+
+  /**
+   * 品牌英文名称
+   */
+  brandEnglishName?: string;
+
+  /**
+   * 推荐值(数值越大越靠前)
+   */
+  recommendValue?: number;
+
+  /**
+   * 品牌Logo图片路径或URL
+   */
+  brandLogo?: string;
+
+  /**
+   * 品牌标题(用于展示)
+   */
+  brandTitle?: string;
+
+  /**
+   * 品牌大图(横幅/封面图)
+   */
+  brandBigImage?: string;
+
+  /**
+   * 品牌故事(简介文本)
+   */
+  brandStory?: string;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow?: number;
+
+  /**
+   * 品牌注册人
+   */
+  brandRegistrant?: string;
+
+  /**
+   * 许可证编号
+   */
+  license?: string;
+
+  /**
+   * 注册证书编号
+   */
+  registrationCertificate?: string;
+
+  /**
+   * 证书/许可过期时间
+   */
+  expireTime?: string;
+
+  /**
+   * 品牌描述(较长文本)
+   */
+  brandDescribe?: string;
+
+  /**
+   * 展示位置(如首页、分类页等)
+   */
+  position?: string;
+
+  /**
+   * 关注度/收藏数(默认为0)
+   */
+  care?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface BrandQuery extends PageQuery {
+
+  /**
+   * 品牌编号(唯一标识)
+   */
+  brandNo?: string;
+
+  /**
+   * 品牌中文名称
+   */
+  brandName?: string;
+
+  /**
+   * 品牌首字母缩写(如拼音首字母)
+   */
+  brandInitials?: string;
+
+  /**
+   * 品牌英文名称
+   */
+  brandEnglishName?: string;
+
+  /**
+   * 推荐值(数值越大越靠前)
+   */
+  recommendValue?: number;
+
+  /**
+   * 品牌Logo图片路径或URL
+   */
+  brandLogo?: string;
+
+  /**
+   * 品牌标题(用于展示)
+   */
+  brandTitle?: string;
+
+  /**
+   * 品牌大图(横幅/封面图)
+   */
+  brandBigImage?: string;
+
+  /**
+   * 品牌故事(简介文本)
+   */
+  brandStory?: string;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow?: number;
+
+  /**
+   * 品牌注册人
+   */
+  brandRegistrant?: string;
+
+  /**
+   * 许可证编号
+   */
+  license?: string;
+
+  /**
+   * 注册证书编号
+   */
+  registrationCertificate?: string;
+
+  /**
+   * 证书/许可过期时间
+   */
+  expireTime?: string;
+
+  /**
+   * 品牌描述(较长文本)
+   */
+  brandDescribe?: string;
+
+  /**
+   * 展示位置(如首页、分类页等)
+   */
+  position?: string;
+
+  /**
+   * 关注度/收藏数(默认为0)
+   */
+  care?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

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

@@ -0,0 +1,87 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CategoryVO, CategoryForm, CategoryQuery } from '@/api/product/category/types';
+
+/**
+ * 查询产品分类列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCategory = (query?: Partial<CategoryQuery>): AxiosPromise<CategoryVO[]> => {
+  return request({
+    url: '/product/category/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品分类详细
+ * @param id
+ */
+export const getCategory = (id: string | number): AxiosPromise<CategoryVO> => {
+  return request({
+    url: '/product/category/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品分类
+ * @param data
+ */
+export const addCategory = (data: CategoryForm) => {
+  return request({
+    url: '/product/category',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品分类
+ * @param data
+ */
+export const updateCategory = (data: CategoryForm) => {
+  return request({
+    url: '/product/category',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品分类
+ * @param id
+ */
+export const delCategory = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/category/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 查询产品分类列表(排除节点)
+ * @param id
+  */
+export const listCategoryExcludeChild = (id: string | number): AxiosPromise<CategoryVO[]> => {
+  return request({
+    url: '/product/category/list/exclude/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 设置分类审核员
+ * @param id 分类ID
+ * @param reviewerId 审核员用户ID
+ */
+export const setCategoryReviewer = (id: string | number, reviewerId: string | number) => {
+  return request({
+    url: '/product/category/setReviewer',
+    method: 'put',
+    data: { id, reviewerId }
+  });
+};

+ 402 - 0
src/api/product/category/types.ts

@@ -0,0 +1,402 @@
+export interface CategoryVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 分类编号
+   */
+  categoryNo: string;
+
+  /**
+   * 分类名称
+   */
+  categoryName: string;
+
+  /**
+   * 父级分类ID
+   */
+  parentId: string | number;
+
+  /**
+   * 父级分类名称
+   */
+  parentName?: string;
+
+  /**
+   * 祖籍列表
+   */
+  ancestors: string;
+
+  /**
+   * 分类层级(1=一级,2=二级, 3三级)
+   */
+  classLevel: number;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow: number;
+
+  /**
+   * 是否在GPS中显示
+   */
+  isShowGps: number;
+
+  /**
+   * 折扣率(可能为JSON或文本)
+   */
+  discountRate: number;
+
+  /**
+   * 拼音码(用于快速检索)
+   */
+  pyCode: string;
+
+  /**
+   * 分类描述
+   */
+  classDescription: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 自定义标签1
+   */
+  oneLable1: string;
+
+  /**
+   * 自定义标签2
+   */
+  oneLable2: string;
+
+  /**
+   * 自定义链接1
+   */
+  oneLink1: string;
+
+  /**
+   * 自定义链接2
+   */
+  oneLink2: string;
+
+  /**
+   * 排序值,默认为0
+   */
+  sort: number;
+
+  /**
+   * 颜色(如CSS颜色值)
+   */
+  color: string;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName: string;
+
+  /**
+   * 采购负责人编号
+   */
+  purchaseManagerNo: string;
+
+  /**
+   * 采购负责人姓名
+   */
+  purchaseManagerName: string;
+
+  /**
+   * 所属平台(0=Web, 1=小程序)
+   */
+  platform: number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 子级分类
+   */
+  children?: CategoryVO[];
+
+  /**
+   * 是否有子节点(用于懒加载)
+   */
+  hasChildren?: boolean;
+}
+
+export interface CategoryForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 分类编号
+   */
+  categoryNo?: string;
+
+  /**
+   * 分类名称
+   */
+  categoryName?: string;
+
+  /**
+   * 父级分类ID
+   */
+  parentId?: string | number;
+
+  /**
+   * 父级分类名称
+   */
+  parentName?: string;
+
+  /**
+   * 祖籍列表
+   */
+  ancestors?: string;
+
+  /**
+   * 分类层级(1=一级,2=二级, 3三级)
+   */
+  classLevel?: number;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow?: number;
+
+  /**
+   * 是否在GPS中显示
+   */
+  isShowGps?: number;
+
+  /**
+   * 折扣率(可能为JSON或文本)
+   */
+  discountRate?: number;
+
+  /**
+   * 拼音码(用于快速检索)
+   */
+  pyCode?: string;
+
+  /**
+   * 分类描述
+   */
+  classDescription?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 自定义标签1
+   */
+  oneLable1?: string;
+
+  /**
+   * 自定义标签2
+   */
+  oneLable2?: string;
+
+  /**
+   * 自定义链接1
+   */
+  oneLink1?: string;
+
+  /**
+   * 自定义链接2
+   */
+  oneLink2?: string;
+
+  /**
+   * 排序值,默认为0
+   */
+  sort?: number;
+
+  /**
+   * 颜色(如CSS颜色值)
+   */
+  color?: string;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo?: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName?: string;
+
+  /**
+   * 采购负责人编号
+   */
+  purchaseManagerNo?: string;
+
+  /**
+   * 采购负责人姓名
+   */
+  purchaseManagerName?: string;
+
+  /**
+   * 所属平台(0=Web, 1=小程序)
+   */
+  platform?: number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface CategoryQuery extends PageQuery {
+
+  /**
+   * 分类编号
+   */
+  categoryNo?: string;
+
+  /**
+   * 分类名称
+   */
+  categoryName?: string;
+
+  /**
+   * 父级分类ID
+   */
+  parentId?: string | number;
+
+  /**
+   * 祖籍列表
+   */
+  ancestors?: string;
+
+  /**
+   * 分类层级(1=一级,2=二级, 3三级)
+   */
+  classLevel?: number;
+
+  /**
+   * 是否显示(1=显示,0=隐藏)
+   */
+  isShow?: number;
+
+  /**
+   * 是否在GPS中显示
+   */
+  isShowGps?: number;
+
+  /**
+   * 折扣率(可能为JSON或文本)
+   */
+  discountRate?: number;
+
+  /**
+   * 拼音码(用于快速检索)
+   */
+  pyCode?: string;
+
+  /**
+   * 分类描述
+   */
+  classDescription?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 自定义标签1
+   */
+  oneLable1?: string;
+
+  /**
+   * 自定义标签2
+   */
+  oneLable2?: string;
+
+  /**
+   * 自定义链接1
+   */
+  oneLink1?: string;
+
+  /**
+   * 自定义链接2
+   */
+  oneLink2?: string;
+
+  /**
+   * 排序值,默认为0
+   */
+  sort?: number;
+
+  /**
+   * 颜色(如CSS颜色值)
+   */
+  color?: string;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo?: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName?: string;
+
+  /**
+   * 采购负责人编号
+   */
+  purchaseManagerNo?: string;
+
+  /**
+   * 采购负责人姓名
+   */
+  purchaseManagerName?: string;
+
+  /**
+   * 所属平台(0=Web, 1=小程序)
+   */
+  platform?: number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+/**
+ * 部门类型
+ */
+export interface categoryTreeVO extends BaseEntity {
+  id: number | string;
+  label: string;
+  parentId: number | string;
+  weight: number;
+  children: categoryTreeVO[];
+  isShow: '';
+}
+
+
+

+ 63 - 0
src/api/product/classification/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ClassificationVO, ClassificationForm, ClassificationQuery } from '@/api/product/classification/types';
+
+/**
+ * 查询产品属性关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listClassification = (query?: ClassificationQuery): AxiosPromise<ClassificationVO[]> => {
+  return request({
+    url: '/product/classification/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品属性关联详细
+ * @param id
+ */
+export const getClassification = (id: string | number): AxiosPromise<ClassificationVO> => {
+  return request({
+    url: '/product/classification/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品属性关联
+ * @param data
+ */
+export const addClassification = (data: ClassificationForm) => {
+  return request({
+    url: '/product/classification',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品属性关联
+ * @param data
+ */
+export const updateClassification = (data: ClassificationForm) => {
+  return request({
+    url: '/product/classification',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品属性关联
+ * @param id
+ */
+export const delClassification = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/classification/' + id,
+    method: 'delete'
+  });
+};

+ 86 - 0
src/api/product/classification/types.ts

@@ -0,0 +1,86 @@
+export interface ClassificationVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 产品id
+   */
+  productId: string | number;
+
+  /**
+   * 分类编号
+   */
+  categoryId: string | number;
+
+  /**
+   * 属性列表(JSON或分号分隔等格式)
+   */
+  attributesList: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface ClassificationForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 分类编号
+   */
+  categoryId?: string | number;
+
+  /**
+   * 属性列表(JSON或分号分隔等格式)
+   */
+  attributesList?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface ClassificationQuery extends PageQuery {
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 分类编号
+   */
+  categoryId?: string | number;
+
+  /**
+   * 属性列表(JSON或分号分隔等格式)
+   */
+  attributesList?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/customization/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CustomizationVO, CustomizationForm, CustomizationQuery } from '@/api/product/customization/types';
+
+/**
+ * 查询产品定制信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCustomization = (query?: CustomizationQuery): AxiosPromise<CustomizationVO[]> => {
+  return request({
+    url: '/product/customization/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品定制信息详细
+ * @param id
+ */
+export const getCustomization = (id: string | number): AxiosPromise<CustomizationVO> => {
+  return request({
+    url: '/product/customization/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品定制信息
+ * @param data
+ */
+export const addCustomization = (data: CustomizationForm) => {
+  return request({
+    url: '/product/customization',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品定制信息
+ * @param data
+ */
+export const updateCustomization = (data: CustomizationForm) => {
+  return request({
+    url: '/product/customization',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品定制信息
+ * @param id
+ */
+export const delCustomization = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/customization/' + id,
+    method: 'delete'
+  });
+};

+ 161 - 0
src/api/product/customization/types.ts

@@ -0,0 +1,161 @@
+export interface CustomizationVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 定制编号
+   */
+  customizationNo: string;
+
+  /**
+   * 产品id
+   */
+  productId: string | number;
+
+  /**
+   * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+   */
+  customizedStyle: string;
+
+  /**
+   * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
+   */
+  customizedCraft: string;
+
+  /**
+   * 打样周期(天)
+   */
+  proofingPeriod: number;
+
+  /**
+   * 生产周期(天)
+   */
+  productionCycle: number;
+
+  /**
+   * 最小起订量(MOQ)
+   */
+  moq: number;
+
+  /**
+   * MOQ对应价格
+   */
+  moqPrice: number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface CustomizationForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 定制编号
+   */
+  customizationNo?: string;
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+   */
+  customizedStyle?: string;
+
+  /**
+   * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
+   */
+  customizedCraft?: string;
+
+  /**
+   * 打样周期(天)
+   */
+  proofingPeriod?: number;
+
+  /**
+   * 生产周期(天)
+   */
+  productionCycle?: number;
+
+  /**
+   * 最小起订量(MOQ)
+   */
+  moq?: number;
+
+  /**
+   * MOQ对应价格
+   */
+  moqPrice?: number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface CustomizationQuery extends PageQuery {
+
+  /**
+   * 定制编号
+   */
+  customizationNo?: string;
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+   */
+  customizedStyle?: string;
+
+  /**
+   * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
+   */
+  customizedCraft?: string;
+
+  /**
+   * 打样周期(天)
+   */
+  proofingPeriod?: number;
+
+  /**
+   * 生产周期(天)
+   */
+  productionCycle?: number;
+
+  /**
+   * 最小起订量(MOQ)
+   */
+  moq?: number;
+
+  /**
+   * MOQ对应价格
+   */
+  moqPrice?: number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/ensure/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { EnsureVO, EnsureForm, EnsureQuery } from '@/api/product/ensure/types';
+
+/**
+ * 查询产品保障项列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listEnsure = (query?: EnsureQuery): AxiosPromise<EnsureVO[]> => {
+  return request({
+    url: '/product/ensure/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品保障项详细
+ * @param id
+ */
+export const getEnsure = (id: string | number): AxiosPromise<EnsureVO> => {
+  return request({
+    url: '/product/ensure/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品保障项
+ * @param data
+ */
+export const addEnsure = (data: EnsureForm) => {
+  return request({
+    url: '/product/ensure',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品保障项
+ * @param data
+ */
+export const updateEnsure = (data: EnsureForm) => {
+  return request({
+    url: '/product/ensure',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品保障项
+ * @param id
+ */
+export const delEnsure = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/ensure/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/ensure/types.ts

@@ -0,0 +1,71 @@
+export interface EnsureVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 保障名称(如:正品保证、售后保障等)
+   */
+  ensureName: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface EnsureForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 保障名称(如:正品保证、售后保障等)
+   */
+  ensureName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface EnsureQuery extends PageQuery {
+
+  /**
+   * 保障名称(如:正品保证、售后保障等)
+   */
+  ensureName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/extend/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ExtendVO, ExtendForm, ExtendQuery } from '@/api/product/extend/types';
+
+/**
+ * 查询产品扩展属性(低频访问字段)列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listExtend = (query?: ExtendQuery): AxiosPromise<ExtendVO[]> => {
+  return request({
+    url: '/product/extend/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品扩展属性(低频访问字段)详细
+ * @param productId
+ */
+export const getExtend = (productId: string | number): AxiosPromise<ExtendVO> => {
+  return request({
+    url: '/product/extend/' + productId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品扩展属性(低频访问字段)
+ * @param data
+ */
+export const addExtend = (data: ExtendForm) => {
+  return request({
+    url: '/product/extend',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品扩展属性(低频访问字段)
+ * @param data
+ */
+export const updateExtend = (data: ExtendForm) => {
+  return request({
+    url: '/product/extend',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品扩展属性(低频访问字段)
+ * @param productId
+ */
+export const delExtend = (productId: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/extend/' + productId,
+    method: 'delete'
+  });
+};

+ 626 - 0
src/api/product/extend/types.ts

@@ -0,0 +1,626 @@
+export interface ExtendVO {
+  /**
+   * 关联 product_base.id
+   */
+  productId: string | number;
+
+  /**
+   * 促销标题
+   */
+  promotionTitle: string;
+
+  /**
+   * 发票名称
+   */
+  invoiceName: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType: string;
+
+  /**
+   * 规格代码
+   */
+  specificationsCode: string;
+
+  /**
+   * 条形码
+   */
+  barCoding: string;
+
+  /**
+   * 产品描述
+   */
+  productDescription: string;
+
+  /**
+   * 产品重量
+   */
+  productWeight: string;
+
+  /**
+   * 重量单位
+   */
+  weightUnit: string;
+
+  /**
+   * 产品体积
+   */
+  productVolume: string;
+
+  /**
+   * 体积单位
+   */
+  volumeUnit: string;
+
+  /**
+   * 售后服务
+   */
+  afterSalesService: string;
+
+  /**
+   * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
+   */
+  serviceGuarantee: string;
+
+  /**
+   * 是否安装服务:1=是,0=否
+   */
+  isInstallService: string;
+
+  /**
+   * 安装费用
+   */
+  installAmount: string;
+
+  /**
+   * 分销价格
+   */
+  distributionPrice: string;
+
+  /**
+   * 标准尺寸
+   */
+  standardSizes: string;
+
+  /**
+   * 克重
+   */
+  gramWeight: string;
+
+  /**
+   * 透明度
+   */
+  opacity: string;
+
+  /**
+   * 是否可定制:1=是,0=否
+   */
+  isCustomize: string;
+
+  /**
+   * 定制描述
+   */
+  customDescription: string;
+
+  /**
+   * 产品利润
+   */
+  productProfit: string;
+
+  /**
+   * 报告需求
+   */
+  reportRequire: string;
+
+  /**
+   * 审核评论
+   */
+  reviewComments: string;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 发票规格
+   */
+  invoiceSpecs: string;
+
+  /**
+   * 增量
+   */
+  increment: number;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName: string;
+
+  /**
+   * 供应商名称
+   */
+  supplierName: string;
+
+  /**
+   * 采购经理编号
+   */
+  purchaseManagerNo: string;
+
+  /**
+   * 采购经理姓名
+   */
+  purchaseManagerName: string;
+
+  /**
+   * 参考链接
+   */
+  referenceLink: string;
+
+  /**
+   * 销售量
+   */
+  salesVolume: number;
+
+  /**
+   * 发货时效
+   */
+  deliveryTime: string;
+
+  /**
+   * PIT时间
+   */
+  pitTime: string;
+
+  /**
+   * 创建时的供应商标识
+   */
+  createSupplier: string;
+
+  /**
+   * 其他补充信息
+   */
+  otherInfo: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface ExtendForm extends BaseEntity {
+  /**
+   * 关联 product_base.id
+   */
+  productId?: string | number;
+
+  /**
+   * 促销标题
+   */
+  promotionTitle?: string;
+
+  /**
+   * 发票名称
+   */
+  invoiceName?: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType?: string;
+
+  /**
+   * 规格代码
+   */
+  specificationsCode?: string;
+
+  /**
+   * 条形码
+   */
+  barCoding?: string;
+
+  /**
+   * 产品描述
+   */
+  productDescription?: string;
+
+  /**
+   * 产品重量
+   */
+  productWeight?: string;
+
+  /**
+   * 重量单位
+   */
+  weightUnit?: string;
+
+  /**
+   * 产品体积
+   */
+  productVolume?: string;
+
+  /**
+   * 体积单位
+   */
+  volumeUnit?: string;
+
+  /**
+   * 售后服务
+   */
+  afterSalesService?: string;
+
+  /**
+   * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
+   */
+  serviceGuarantee?: string;
+
+  /**
+   * 是否安装服务:1=是,0=否
+   */
+  isInstallService?: string;
+
+  /**
+   * 安装费用
+   */
+  installAmount?: string;
+
+  /**
+   * 分销价格
+   */
+  distributionPrice?: string;
+
+  /**
+   * 标准尺寸
+   */
+  standardSizes?: string;
+
+  /**
+   * 克重
+   */
+  gramWeight?: string;
+
+  /**
+   * 透明度
+   */
+  opacity?: string;
+
+  /**
+   * 是否可定制:1=是,0=否
+   */
+  isCustomize?: string;
+
+  /**
+   * 定制描述
+   */
+  customDescription?: string;
+
+  /**
+   * 产品利润
+   */
+  productProfit?: string;
+
+  /**
+   * 报告需求
+   */
+  reportRequire?: string;
+
+  /**
+   * 审核评论
+   */
+  reviewComments?: string;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 发票规格
+   */
+  invoiceSpecs?: string;
+
+  /**
+   * 增量
+   */
+  increment?: number;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo?: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName?: string;
+
+  /**
+   * 供应商名称
+   */
+  supplierName?: string;
+
+  /**
+   * 采购经理编号
+   */
+  purchaseManagerNo?: string;
+
+  /**
+   * 采购经理姓名
+   */
+  purchaseManagerName?: string;
+
+  /**
+   * 参考链接
+   */
+  referenceLink?: string;
+
+  /**
+   * 销售量
+   */
+  salesVolume?: number;
+
+  /**
+   * 发货时效
+   */
+  deliveryTime?: string;
+
+  /**
+   * PIT时间
+   */
+  pitTime?: string;
+
+  /**
+   * 创建时的供应商标识
+   */
+  createSupplier?: string;
+
+  /**
+   * 其他补充信息
+   */
+  otherInfo?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface ExtendQuery extends PageQuery {
+
+  /**
+   * 促销标题
+   */
+  promotionTitle?: string;
+
+  /**
+   * 发票名称
+   */
+  invoiceName?: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType?: string;
+
+  /**
+   * 规格代码
+   */
+  specificationsCode?: string;
+
+  /**
+   * 条形码
+   */
+  barCoding?: string;
+
+  /**
+   * 产品描述
+   */
+  productDescription?: string;
+
+  /**
+   * 产品重量
+   */
+  productWeight?: string;
+
+  /**
+   * 重量单位
+   */
+  weightUnit?: string;
+
+  /**
+   * 产品体积
+   */
+  productVolume?: string;
+
+  /**
+   * 体积单位
+   */
+  volumeUnit?: string;
+
+  /**
+   * 售后服务
+   */
+  afterSalesService?: string;
+
+  /**
+   * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
+   */
+  serviceGuarantee?: string;
+
+  /**
+   * 是否安装服务:1=是,0=否
+   */
+  isInstallService?: string;
+
+  /**
+   * 安装费用
+   */
+  installAmount?: string;
+
+  /**
+   * 分销价格
+   */
+  distributionPrice?: string;
+
+  /**
+   * 标准尺寸
+   */
+  standardSizes?: string;
+
+  /**
+   * 克重
+   */
+  gramWeight?: string;
+
+  /**
+   * 透明度
+   */
+  opacity?: string;
+
+  /**
+   * 是否可定制:1=是,0=否
+   */
+  isCustomize?: string;
+
+  /**
+   * 定制描述
+   */
+  customDescription?: string;
+
+  /**
+   * 产品利润
+   */
+  productProfit?: string;
+
+  /**
+   * 报告需求
+   */
+  reportRequire?: string;
+
+  /**
+   * 审核评论
+   */
+  reviewComments?: string;
+
+  /**
+   * 供应商编号
+   */
+  supplierNo?: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 发票规格
+   */
+  invoiceSpecs?: string;
+
+  /**
+   * 增量
+   */
+  increment?: number;
+
+  /**
+   * 采购编号
+   */
+  purchaseNo?: string;
+
+  /**
+   * 采购名称
+   */
+  purchaseName?: string;
+
+  /**
+   * 供应商名称
+   */
+  supplierName?: string;
+
+  /**
+   * 采购经理编号
+   */
+  purchaseManagerNo?: string;
+
+  /**
+   * 采购经理姓名
+   */
+  purchaseManagerName?: string;
+
+  /**
+   * 参考链接
+   */
+  referenceLink?: string;
+
+  /**
+   * 销售量
+   */
+  salesVolume?: number;
+
+  /**
+   * 发货时效
+   */
+  deliveryTime?: string;
+
+  /**
+   * PIT时间
+   */
+  pitTime?: string;
+
+  /**
+   * 创建时的供应商标识
+   */
+  createSupplier?: string;
+
+  /**
+   * 其他补充信息
+   */
+  otherInfo?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/lable/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { LableVO, LableForm, LableQuery } from '@/api/product/lable/types';
+
+/**
+ * 查询产品标签信息(注意:名疑似拼写错误,应为 product_label)列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listLable = (query?: LableQuery): AxiosPromise<LableVO[]> => {
+  return request({
+    url: '/product/lable/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品标签信息(注意:名疑似拼写错误,应为 product_label)详细
+ * @param id
+ */
+export const getLable = (id: string | number): AxiosPromise<LableVO> => {
+  return request({
+    url: '/product/lable/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品标签信息(注意:名疑似拼写错误,应为 product_label)
+ * @param data
+ */
+export const addLable = (data: LableForm) => {
+  return request({
+    url: '/product/lable',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品标签信息(注意:名疑似拼写错误,应为 product_label)
+ * @param data
+ */
+export const updateLable = (data: LableForm) => {
+  return request({
+    url: '/product/lable',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品标签信息(注意:名疑似拼写错误,应为 product_label)
+ * @param id
+ */
+export const delLable = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/lable/' + id,
+    method: 'delete'
+  });
+};

+ 86 - 0
src/api/product/lable/types.ts

@@ -0,0 +1,86 @@
+export interface LableVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+   */
+  productLabelNo: string;
+
+  /**
+   * 标签显示名称(如:新品、热销、限时优惠)
+   */
+  productLabelName: string;
+
+  /**
+   * 使用该标签的产品数量(可用于统计或缓存)
+   */
+  productQuantity: number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface LableForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+   */
+  productLabelNo?: string;
+
+  /**
+   * 标签显示名称(如:新品、热销、限时优惠)
+   */
+  productLabelName?: string;
+
+  /**
+   * 使用该标签的产品数量(可用于统计或缓存)
+   */
+  productQuantity?: number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface LableQuery extends PageQuery {
+
+  /**
+   * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+   */
+  productLabelNo?: string;
+
+  /**
+   * 标签显示名称(如:新品、热销、限时优惠)
+   */
+  productLabelName?: string;
+
+  /**
+   * 使用该标签的产品数量(可用于统计或缓存)
+   */
+  productQuantity?: number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/pool/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { PoolVO, PoolForm, PoolQuery } from '@/api/product/pool/types';
+
+/**
+ * 查询产品池列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listPool = (query?: PoolQuery): AxiosPromise<PoolVO[]> => {
+  return request({
+    url: '/product/pool/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品池详细
+ * @param id
+ */
+export const getPool = (id: string | number): AxiosPromise<PoolVO> => {
+  return request({
+    url: '/product/pool/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品池
+ * @param data
+ */
+export const addPool = (data: PoolForm) => {
+  return request({
+    url: '/product/pool',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品池
+ * @param data
+ */
+export const updatePool = (data: PoolForm) => {
+  return request({
+    url: '/product/pool',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品池
+ * @param id
+ */
+export const delPool = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/pool/' + id,
+    method: 'delete'
+  });
+};

+ 236 - 0
src/api/product/pool/types.ts

@@ -0,0 +1,236 @@
+export interface PoolVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 池编码
+   */
+  poolNo: string;
+
+  /**
+   * 项目id
+   */
+  itemId: string | number;
+
+  /**
+   * 分类id
+   */
+  categoryId: string | number;
+
+  /**
+   * 产品池类型 0普通产品池,1精选产品池,2协议产品池,3项目产品池,4分类产品池
+   */
+  type: number;
+
+  /**
+   * 池名称
+   */
+  name: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 商品数量
+   */
+  productCount?: number;
+
+  /**
+   * 待审核的产品数量
+   */
+  waitReviewCount?: number;
+
+  /**
+   * 已驳回的产品数量
+   */
+  rejectedCount?: number;
+
+  /**
+   * 已通过审核的产品数量
+   */
+  approvedCount?: number;
+
+  /**
+   * 待申请的产品数量
+   */
+  waitApplyCount?: number;
+
+  /**
+   * 创建时间
+   */
+  createTime?: string;
+
+  /**
+   * 创建人
+   */
+  createBy?: string;
+
+  /**
+   * 审核人
+   */
+  reviewBy?: string;
+
+}
+
+export interface PoolForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 池编码
+   */
+  poolNo?: string;
+
+  /**
+   * 项目id
+   */
+  itemId: string | number;
+
+  /**
+   * 分类id
+   */
+  categoryId: string | number;
+
+  /**
+   * 产品池类型 0普通产品池,1精选产品池,2协议产品池,3项目产品池,4分类产品池
+   */
+  type: number;
+
+  /**
+   * 池名称
+   */
+  name?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus?: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface PoolQuery extends PageQuery {
+
+  /**
+   * 池编码
+   */
+  poolNo?: string;
+
+  /**
+   * 项目id
+   */
+  itemId: string | number;
+
+  /**
+   * 分类id
+   */
+  categoryId: string | number;
+
+  /**
+   * 产品池类型 0普通产品池,1精选产品池,2协议产品池,3项目产品池,4分类产品池
+   */
+  type: number;
+
+  /**
+   * 池名称
+   */
+  name?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus?: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 创建人
+   */
+  createBy?: string;
+
+  /**
+   * 审核人
+   */
+  reviewBy?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+/**
+ * 产品池审核表单类型
+ */
+export interface PoolReviewForm {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 池名称(显示用)
+   */
+  name?: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus?: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason?: string;
+}
+
+
+

+ 132 - 0
src/api/product/poolLink/index.ts

@@ -0,0 +1,132 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { PoolLinkVO, PoolLinkForm, PoolLinkQuery } from '@/api/product/poolLink/types';
+export type { PoolLinkForm };
+
+/**
+ * 查询产品池和产品关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listPoolLink = (query?: PoolLinkQuery): AxiosPromise<PoolLinkVO[]> => {
+  return request({
+    url: '/product/poolLink/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品池和产品关联详细
+ * @param id
+ */
+export const getPoolLink = (id: string | number): AxiosPromise<PoolLinkVO> => {
+  return request({
+    url: '/product/poolLink/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品池和产品关联
+ * @param data
+ */
+export const addPoolLink = (data: PoolLinkForm) => {
+  return request({
+    url: '/product/poolLink',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品池和产品关联
+ * @param data
+ */
+export const updatePoolLink = (data: PoolLinkForm) => {
+  return request({
+    url: '/product/poolLink',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品池和产品关联
+ * @param id
+ */
+export const delPoolLink = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/poolLink/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 批量添加商品到商品池
+ * @param data 批量添加参数
+ */
+export interface BatchAddProductData {
+  poolId: string | number;
+  products: Array<{
+    productId: string | number;
+    agreementPrice?: number;
+  }>;
+}
+
+export const batchAddProducts = (data: BatchAddProductData) => {
+  return request({
+    url: '/product/poolLink/batchAdd',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 批量审核商品进入商品池
+ * @param data 审核参数列表
+ */
+export const batchReview = (data: PoolLinkForm[]) => {
+  return request({
+    url: '/product/poolLink/batchReview',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 提交审核商品到商品池
+ * @param data 提交审核参数列表
+ */
+export const reSubmit = (data: PoolLinkForm[]) => {
+  return request({
+    url: '/product/poolLink/reSubmit',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 编辑商品价格
+ * @param data 价格参数
+ */
+export const editPrice = (data: PoolLinkForm) => {
+  return request({
+    url: '/product/poolLink/editPrice',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 编辑商品库存
+ * @param data 库存参数
+ */
+export const editStock = (data: PoolLinkForm) => {
+  return request({
+    url: '/product/poolLink/editStock',
+    method: 'post',
+    data: data
+  });
+};

+ 267 - 0
src/api/product/poolLink/types.ts

@@ -0,0 +1,267 @@
+export interface PoolLinkVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 所属池ID
+   */
+  poolId: string | number;
+
+  /**
+   * 产品池名称
+   */
+  poolName?: string;
+
+  /**
+   * 产品池类型 0普通产品池,1精选产品池,2协议产品池,3项目产品池,4分类产品池
+   */
+  type?: number;
+
+  /**
+   * 产品id
+   */
+  productId: string | number;
+
+  /**
+   * 产品价格
+   */
+  productPrice: number;
+
+  /**
+   * 是否在池中:1-是,0-否
+   */
+  isPoolStatus: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 创建时间
+   */
+  createTime?: string;
+
+  /**
+   * 商品编号
+   */
+  productNo?: string;
+
+  /**
+   * 商品名称
+   */
+  itemName?: string;
+
+  /**
+   * 商品图片URL
+   */
+  productImageUrl?: string;
+
+  /**
+   * 品牌名称
+   */
+  brandName?: string;
+
+  /**
+   * 分类名称
+   */
+  categoryName?: string;
+
+  /**
+   * 单位名称
+   */
+  unitName?: string;
+
+  /**
+   * 库存
+   */
+  stock?: number;
+
+  /**
+   * 市场价
+   */
+  marketPrice?: number;
+
+  /**
+   * 平台售价
+   */
+  platformPrice?: number;
+
+  /**
+   * 最低售价
+   */
+  minPrice?: number;
+
+  /**
+   * 采购价
+   */
+  purchasePrice?: number;
+
+  /**
+   * 暂估毛利率
+   */
+  grossMargin?: number;
+
+  /**
+   * 商品状态:1=已上架,0=下架,2=上架中
+   */
+  productStatus?: string;
+
+  /**
+   * 供应商
+   */
+  supplier?: string;
+}
+
+export interface PoolLinkForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 所属池ID
+   */
+  poolId?: string | number;
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 产品价格
+   */
+  productPrice?: number;
+
+  /**
+   * 是否在池中:1-是,0-否
+   */
+  isPoolStatus?: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus?: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 库存
+   */
+  stock?: number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface PoolLinkQuery extends PageQuery {
+
+  /**
+   * 所属池ID
+   */
+  poolId?: string | number;
+
+  /**
+   * 产品id
+   */
+  productId?: string | number;
+
+  /**
+   * 产品价格
+   */
+  productPrice?: number;
+
+  /**
+   * 是否在池中:1-是,0-否
+   */
+  isPoolStatus?: string;
+
+  /**
+   * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+   */
+  productReviewStatus?: string;
+
+  /**
+   * 审核原因
+   */
+  reviewReason?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  // ========== 查询扩展字段 ==========
+
+  /**
+   * 商品编号
+   */
+  productNo?: string;
+
+  /**
+   * 商品名称
+   */
+  itemName?: string;
+
+  /**
+   * 品牌ID
+   */
+  brandId?: string | number;
+
+  /**
+   * 分类ID
+   */
+  categoryId?: string | number;
+
+  /**
+   * 商品状态:1=已上架,0=下架,2=上架中
+   */
+  productStatus?: string;
+
+  /**
+   * 供应商
+   */
+  supplier?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/priceInventory/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { PriceInventoryVO, PriceInventoryForm, PriceInventoryQuery } from '@/api/product/priceInventory/types';
+
+/**
+ * 查询产品价格与库存信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listPriceInventory = (query?: PriceInventoryQuery): AxiosPromise<PriceInventoryVO[]> => {
+  return request({
+    url: '/product/priceInventory/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品价格与库存信息详细
+ * @param productId
+ */
+export const getPriceInventory = (productId: string | number): AxiosPromise<PriceInventoryVO> => {
+  return request({
+    url: '/product/priceInventory/' + productId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品价格与库存信息
+ * @param data
+ */
+export const addPriceInventory = (data: PriceInventoryForm) => {
+  return request({
+    url: '/product/priceInventory',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品价格与库存信息
+ * @param data
+ */
+export const updatePriceInventory = (data: PriceInventoryForm) => {
+  return request({
+    url: '/product/priceInventory',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品价格与库存信息
+ * @param productId
+ */
+export const delPriceInventory = (productId: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/priceInventory/' + productId,
+    method: 'delete'
+  });
+};

+ 206 - 0
src/api/product/priceInventory/types.ts

@@ -0,0 +1,206 @@
+export interface PriceInventoryVO {
+  /**
+   * 关联 product_base.id
+   */
+  productId: string | number;
+
+  /**
+   * 市场价格
+   */
+  marketPrice: number;
+
+  /**
+   * 会员价格
+   */
+  memberPrice: number;
+
+  /**
+   * 最低销售价格
+   */
+  minSellingPrice: number;
+
+  /**
+   * 采购价格
+   */
+  purchasingPrice: number;
+
+  /**
+   * 最高采购价格
+   */
+  maxPurchasePrice: number;
+
+  /**
+   * 总库存量
+   */
+  totalInventory: number;
+
+  /**
+   * 当前可用库存
+   */
+  nowInventory: number;
+
+  /**
+   * 虚拟库存
+   */
+  virtualInventory: number;
+
+  /**
+   * 最小起订数量
+   */
+  minOrderQuantity: number;
+
+  /**
+   * 税率
+   */
+  taxRate: number;
+
+  /**
+   * 货币类型
+   */
+  currency: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface PriceInventoryForm extends BaseEntity {
+  /**
+   * 关联 product_base.id
+   */
+  productId?: string | number;
+
+  /**
+   * 市场价格
+   */
+  marketPrice?: number;
+
+  /**
+   * 会员价格
+   */
+  memberPrice?: number;
+
+  /**
+   * 最低销售价格
+   */
+  minSellingPrice?: number;
+
+  /**
+   * 采购价格
+   */
+  purchasingPrice?: number;
+
+  /**
+   * 最高采购价格
+   */
+  maxPurchasePrice?: number;
+
+  /**
+   * 总库存量
+   */
+  totalInventory?: number;
+
+  /**
+   * 当前可用库存
+   */
+  nowInventory?: number;
+
+  /**
+   * 虚拟库存
+   */
+  virtualInventory?: number;
+
+  /**
+   * 最小起订数量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 税率
+   */
+  taxRate?: number;
+
+  /**
+   * 货币类型
+   */
+  currency?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface PriceInventoryQuery extends PageQuery {
+
+  /**
+   * 市场价格
+   */
+  marketPrice?: number;
+
+  /**
+   * 会员价格
+   */
+  memberPrice?: number;
+
+  /**
+   * 最低销售价格
+   */
+  minSellingPrice?: number;
+
+  /**
+   * 采购价格
+   */
+  purchasingPrice?: number;
+
+  /**
+   * 最高采购价格
+   */
+  maxPurchasePrice?: number;
+
+  /**
+   * 总库存量
+   */
+  totalInventory?: number;
+
+  /**
+   * 当前可用库存
+   */
+  nowInventory?: number;
+
+  /**
+   * 虚拟库存
+   */
+  virtualInventory?: number;
+
+  /**
+   * 最小起订数量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 税率
+   */
+  taxRate?: number;
+
+  /**
+   * 货币类型
+   */
+  currency?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 33 - 13
src/api/product/productBase.ts

@@ -1,18 +1,38 @@
 import request from '@/utils/request';
 
-// 查询产品基础信息列表
-export function listProductBase(query: any) {
-  return request({
-    url: '/product/base/list',
-    method: 'get',
-    params: query
-  });
+const baseUrl = '/product/base';
+
+// 查询商品列表
+export function listProduct(params: any) {
+  return request.get(baseUrl + '/list', { params });
+}
+
+// 获取商品详情
+export function getProduct(id: number | string) {
+  return request.get(`${baseUrl}/${id}`);
+}
+
+// 新增商品
+export function addProduct(data: any) {
+  return request.post(baseUrl, data);
+}
+
+// 修改商品
+export function updateProduct(data: any) {
+  return request.put(baseUrl, data);
+}
+
+// 删除商品
+export function delProduct(id: number | string) {
+  return request.delete(`${baseUrl}/${id}`);
+}
+
+// 获取分类树
+export function getCategoryTree(params?: any) {
+  return request.get(baseUrl + '/categoryTree', { params });
 }
 
-// 查询产品基础信息详情
-export function getProductBase(id: number) {
-  return request({
-    url: '/product/base/' + id,
-    method: 'get'
-  });
+// 获取品牌列表
+export function getBrandList(params?: any) {
+  return request.get(baseUrl + '/brandList', { params });
 }

+ 90 - 0
src/api/product/products/index.ts

@@ -0,0 +1,90 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ProductsVO, ProductsForm, ProductsQuery } from '@/api/product/protocolProducts/types';
+import { BaseQuery, BaseVO } from '@/api/product/base/types';
+
+/**
+ * 查询协议产品关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listProducts = (query?: ProductsQuery): AxiosPromise<BaseVO[]> => {
+  return request({
+    url: '/product/protocolProducts/list',
+    method: 'get',
+    params: query
+  });
+};
+
+
+/**
+* 获取协议的关联产品Id
+* */
+export const getProtocolProductIds = (protocolId: string | number): AxiosPromise<string[]> => {
+  return request({
+    url: '/product/protocolProducts/getProductIds/' + protocolId,
+    method: 'get'
+  });
+}
+
+
+
+
+/**
+ * 查询协议产品关联详细
+ * @param id
+ */
+export const getProducts = (id: string | number): AxiosPromise<ProductsVO> => {
+  return request({
+    url: '/product/protocolProducts/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增协议产品关联
+ * @param data
+ */
+export const addProducts = (data: ProductsForm) => {
+  return request({
+    url: '/product/protocolProducts',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改协议产品关联
+ * @param data
+ */
+export const updateProducts = (data: ProductsForm) => {
+  return request({
+    url: '/product/protocolProducts',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除协议产品关联
+ * @param id
+ */
+export const delProducts = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/protocolProducts/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 修改协议产品价格
+ * @param data
+ */
+export const updateProductsPrice = (data: ProductsForm) => {
+  return request({
+    url: '/product/protocolProducts/updateProtocolPrice',
+    method: 'put',
+    data: data
+  })
+}

+ 189 - 0
src/api/product/products/types.ts

@@ -0,0 +1,189 @@
+export interface ProductsVO {
+  /**
+   * 主键ID,自增
+   */
+  id: string | number;
+
+  /**
+   * 协议编号
+   */
+  protocolNo: string;
+
+  protocolId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productNo: string;
+
+  /**
+   * 协议价格(字符串形式,可能含货币符号或格式化)
+   */
+  agreementPrice: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 客户ID
+   */
+  customerId: string | number;
+
+  /**
+   * 备注信息
+   */
+  remark: string;
+
+  /**
+   * 税率ID或税务编码
+   */
+  taxId: string | number;
+
+  /**
+   * 类型(例如:1-标准产品,2-定制产品等)
+   */
+  type: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+}
+
+export interface ProductsForm extends BaseEntity {
+  /**
+   * 主键ID,自增
+   */
+  id?: string | number;
+
+  /**
+   * 协议编号
+   */
+  protocolNo?: string;
+
+  protocolId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productNo?: string;
+
+  /**
+   * 商品id
+   */
+  productId?: string | number;
+
+  /**
+   * 协议价格(字符串形式,可能含货币符号或格式化)
+   */
+  agreementPrice?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 备注信息
+   */
+  remark?: string;
+
+  /**
+   * 税率ID或税务编码
+   */
+  taxId?: string | number;
+
+  /**
+   * 类型(例如:1-标准产品,2-定制产品等)
+   */
+  type?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+}
+
+export interface ProductsQuery extends PageQuery {
+
+  /**
+   * 协议编号
+   */
+  protocolNo?: string;
+
+  protocolId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productNo?: string;
+
+  /**
+   * 协议价格(字符串形式,可能含货币符号或格式化)
+   */
+  agreementPrice?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 税率ID或税务编码
+   */
+  taxId?: string | number;
+
+  /**
+   * 类型(例如:1-标准产品,2-定制产品等)
+   */
+  type?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 创建时间
+   */
+  productName?: string;
+  /**
+   * 商品品牌id
+   */
+  brandId?: string | number;
+  /**
+   * 商品状态 0-下架 1-上架
+   */
+  productStatus?: string;
+  /**
+   * 商品id
+   */
+  productId?: string | number;
+
+    /**
+   * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/programLink/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ProgramLinkVO, ProgramLinkForm, ProgramLinkQuery } from '@/api/product/programLink/types';
+
+/**
+ * 查询项目方案关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listProgramLink = (query?: ProgramLinkQuery): AxiosPromise<ProgramLinkVO[]> => {
+  return request({
+    url: '/product/programLink/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询项目方案关联详细
+ * @param id
+ */
+export const getProgramLink = (id: string | number): AxiosPromise<ProgramLinkVO> => {
+  return request({
+    url: '/product/programLink/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增项目方案关联
+ * @param data
+ */
+export const addProgramLink = (data: ProgramLinkForm) => {
+  return request({
+    url: '/product/programLink',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改项目方案关联
+ * @param data
+ */
+export const updateProgramLink = (data: ProgramLinkForm) => {
+  return request({
+    url: '/product/programLink',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除项目方案关联
+ * @param id
+ */
+export const delProgramLink = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/programLink/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/programLink/types.ts

@@ -0,0 +1,71 @@
+export interface ProgramLinkVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 项目编号
+   */
+  programId: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId: string | number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface ProgramLinkForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 项目编号
+   */
+  programId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface ProgramLinkQuery extends PageQuery {
+
+  /**
+   * 项目编号
+   */
+  programId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 65 - 0
src/api/product/protocolInfo/index.ts

@@ -0,0 +1,65 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { InfoVO, InfoForm, InfoQuery } from '@/api/product/protocolInfo/types';
+
+/**
+ * 查询协议信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listInfo = (query?: InfoQuery): AxiosPromise<InfoVO[]> => {
+  return request({
+    url: '/product/protocolInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+
+
+/**
+ * 查询协议信息详细
+ * @param id
+ */
+export const getInfo = (id: string | number): AxiosPromise<InfoVO> => {
+  return request({
+    url: '/product/protocolInfo/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增协议信息
+ * @param data
+ */
+export const addInfo = (data: InfoForm) => {
+  return request({
+    url: '/product/protocolInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改协议信息
+ * @param data
+ */
+export const updateInfo = (data: InfoForm) => {
+  return request({
+    url: '/product/protocolInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除协议信息
+ * @param id
+ */
+export const delInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/protocolInfo/' + id,
+    method: 'delete'
+  });
+};

+ 311 - 0
src/api/product/protocolInfo/types.ts

@@ -0,0 +1,311 @@
+export interface InfoVO {
+  /**
+   * 主键ID,自增
+   */
+  id: string | number;
+
+  /**
+   * 协议编号
+   */
+  protocolNo: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 客户id
+   */
+  customerId: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName: string;
+
+  /**
+   * 审核时间
+   */
+  reviewTime: string;
+
+  /**
+   * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+   */
+  approvalStatus: number;
+
+  /**
+   * 协议开始时间
+   */
+  startTime: string;
+
+  /**
+   * 协议结束时间
+   */
+  endTime: string;
+
+  /**
+   * 产品数量
+   */
+  productNum: number;
+
+  /**
+   * 备注信息
+   */
+  remark: string;
+
+  /**
+   * 协议状态(例如:0-草稿,1-生效,2-终止)
+   */
+  protocolStatus: number;
+
+  /**
+   * 业务员id
+   */
+  salesmanId: string | number;
+
+  /**
+   * 公司id
+   */
+  companyId: string | number;
+
+  /**
+   * 客服id
+   */
+  serviceId: string | number;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 协议文件路径
+   */
+  protocolFile: string;
+
+  /**
+   * 协议文件原始名称
+   */
+  fileName: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+}
+
+export interface InfoForm extends BaseEntity {
+  /**
+   * 主键ID,自增
+   */
+  id?: string | number;
+
+  /**
+   * 协议编号
+   */
+  protocolNo?: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 审核时间
+   */
+  reviewTime?: string;
+
+  /**
+   * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+   */
+  approvalStatus?: number;
+
+  /**
+   * 协议开始时间
+   */
+  startTime?: string;
+
+  /**
+   * 协议结束时间
+   */
+  endTime?: string;
+
+  /**
+   * 产品数量
+   */
+  productNum?: number;
+
+  /**
+   * 备注信息
+   */
+  remark?: string;
+
+  /**
+   * 协议状态(例如:0-草稿,1-生效,2-终止)
+   */
+  protocolStatus?: number;
+
+  /**
+   * 业务员id
+   */
+  salesmanId?: string | number;
+
+  /**
+   * 业务员名称
+   */
+  salesmanName?: string;
+
+  /**
+   * 公司id
+   */
+  companyId?: string | number;
+
+  /**
+   * 公司名称
+   */
+  companyName?: string;
+
+  /**
+   * 客服id
+   */
+  serviceId?: string | number;
+
+  /**
+   * 客服名称
+   */
+  serviceName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 协议文件路径
+   */
+  protocolFile?: string;
+
+  /**
+   * 协议文件原始名称
+   */
+  fileName?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+}
+
+export interface InfoQuery extends PageQuery {
+
+  /**
+   * 协议编号
+   */
+  protocolNo?: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 审核时间
+   */
+  reviewTime?: string;
+
+  /**
+   * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+   */
+  approvalStatus?: number;
+
+  /**
+   * 协议开始时间
+   */
+  startTime?: string;
+
+  /**
+   * 协议结束时间
+   */
+  endTime?: string;
+
+  /**
+   * 产品数量
+   */
+  productNum?: number;
+
+  /**
+   * 协议状态(例如:0-草稿,1-生效,2-终止)
+   */
+  protocolStatus?: number;
+
+  /**
+   * 业务员id
+   */
+  salesmanId?: string | number;
+
+  /**
+   * 公司id
+   */
+  companyId?: string | number;
+
+  /**
+   * 客服id
+   */
+  serviceId?: string | number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 协议文件路径
+   */
+  protocolFile?: string;
+
+  /**
+   * 协议文件原始名称
+   */
+  fileName?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/recommend/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RecommendVO, RecommendForm, RecommendQuery } from '@/api/product/recommend/types';
+
+/**
+ * 查询产品推荐位配置列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRecommend = (query?: RecommendQuery): AxiosPromise<RecommendVO[]> => {
+  return request({
+    url: '/product/recommend/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品推荐位配置详细
+ * @param id
+ */
+export const getRecommend = (id: string | number): AxiosPromise<RecommendVO> => {
+  return request({
+    url: '/product/recommend/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品推荐位配置
+ * @param data
+ */
+export const addRecommend = (data: RecommendForm) => {
+  return request({
+    url: '/product/recommend',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品推荐位配置
+ * @param data
+ */
+export const updateRecommend = (data: RecommendForm) => {
+  return request({
+    url: '/product/recommend',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品推荐位配置
+ * @param id
+ */
+export const delRecommend = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/recommend/' + id,
+    method: 'delete'
+  });
+};

+ 116 - 0
src/api/product/recommend/types.ts

@@ -0,0 +1,116 @@
+export interface RecommendVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 推荐编号(唯一标识)
+   */
+  recommendNo: string;
+
+  /**
+   * 推荐名称(如:首页爆款、新品专区等)
+   */
+  recommendName: string;
+
+  /**
+   * 推荐位描述(用于后台说明或前端提示)
+   */
+  recommendDescribe: string;
+
+  /**
+   * 是否显示:1=显示,0=隐藏
+   */
+  isShow: string;
+
+  /**
+   * 推荐封面图片路径或URL
+   */
+  recommendCoverphoto: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface RecommendForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 推荐编号(唯一标识)
+   */
+  recommendNo?: string;
+
+  /**
+   * 推荐名称(如:首页爆款、新品专区等)
+   */
+  recommendName?: string;
+
+  /**
+   * 推荐位描述(用于后台说明或前端提示)
+   */
+  recommendDescribe?: string;
+
+  /**
+   * 是否显示:1=显示,0=隐藏
+   */
+  isShow?: string;
+
+  /**
+   * 推荐封面图片路径或URL
+   */
+  recommendCoverphoto?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface RecommendQuery extends PageQuery {
+
+  /**
+   * 推荐编号(唯一标识)
+   */
+  recommendNo?: string;
+
+  /**
+   * 推荐名称(如:首页爆款、新品专区等)
+   */
+  recommendName?: string;
+
+  /**
+   * 推荐位描述(用于后台说明或前端提示)
+   */
+  recommendDescribe?: string;
+
+  /**
+   * 是否显示:1=显示,0=隐藏
+   */
+  isShow?: string;
+
+  /**
+   * 推荐封面图片路径或URL
+   */
+  recommendCoverphoto?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/recommendLink/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RecommendLinkVO, RecommendLinkForm, RecommendLinkQuery } from '@/api/product/recommendLink/types';
+
+/**
+ * 查询产品推荐关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRecommendLink = (query?: RecommendLinkQuery): AxiosPromise<RecommendLinkVO[]> => {
+  return request({
+    url: '/product/recommendLink/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品推荐关联详细
+ * @param id
+ */
+export const getRecommendLink = (id: string | number): AxiosPromise<RecommendLinkVO> => {
+  return request({
+    url: '/product/recommendLink/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品推荐关联
+ * @param data
+ */
+export const addRecommendLink = (data: RecommendLinkForm) => {
+  return request({
+    url: '/product/recommendLink',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品推荐关联
+ * @param data
+ */
+export const updateRecommendLink = (data: RecommendLinkForm) => {
+  return request({
+    url: '/product/recommendLink',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品推荐关联
+ * @param id
+ */
+export const delRecommendLink = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/recommendLink/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/recommendLink/types.ts

@@ -0,0 +1,71 @@
+export interface RecommendLinkVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 项目编号
+   */
+  recommendId: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId: string | number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface RecommendLinkForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 项目编号
+   */
+  recommendId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface RecommendLinkQuery extends PageQuery {
+
+  /**
+   * 项目编号
+   */
+  recommendId?: string | number;
+
+  /**
+   * 产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/specs/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { SpecsVO, SpecsForm, SpecsQuery } from '@/api/product/specs/types';
+
+/**
+ * 查询产品规格关联列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listSpecs = (query?: SpecsQuery): AxiosPromise<SpecsVO[]> => {
+  return request({
+    url: '/product/specs/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品规格关联详细
+ * @param id
+ */
+export const getSpecs = (id: string | number): AxiosPromise<SpecsVO> => {
+  return request({
+    url: '/product/specs/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品规格关联
+ * @param data
+ */
+export const addSpecs = (data: SpecsForm) => {
+  return request({
+    url: '/product/specs',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品规格关联
+ * @param data
+ */
+export const updateSpecs = (data: SpecsForm) => {
+  return request({
+    url: '/product/specs',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品规格关联
+ * @param id
+ */
+export const delSpecs = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/specs/' + id,
+    method: 'delete'
+  });
+};

+ 86 - 0
src/api/product/specs/types.ts

@@ -0,0 +1,86 @@
+export interface SpecsVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 主产品编号
+   */
+  productId: string | number;
+
+  /**
+   * 关联的规格产品id列表(如:逗号分隔的产品id)
+   */
+  specsProductIds: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional: string | number;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface SpecsForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 主产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 关联的规格产品id列表(如:逗号分隔的产品id)
+   */
+  specsProductIds?: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional?: string | number;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface SpecsQuery extends PageQuery {
+
+  /**
+   * 主产品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 关联的规格产品id列表(如:逗号分隔的产品id)
+   */
+  specsProductIds?: string | number;
+
+  /**
+   * 是否单向关联:0=双向,1=单向
+   */
+  isUnidirectional?: string | number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/taxrate/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { TaxrateVO, TaxrateForm, TaxrateQuery } from '@/api/product/taxrate/types';
+
+/**
+ * 查询产品税率配置列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listTaxrate = (query?: TaxrateQuery): AxiosPromise<TaxrateVO[]> => {
+  return request({
+    url: '/product/taxrate/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品税率配置详细
+ * @param id
+ */
+export const getTaxrate = (id: string | number): AxiosPromise<TaxrateVO> => {
+  return request({
+    url: '/product/taxrate/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品税率配置
+ * @param data
+ */
+export const addTaxrate = (data: TaxrateForm) => {
+  return request({
+    url: '/product/taxrate',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品税率配置
+ * @param data
+ */
+export const updateTaxrate = (data: TaxrateForm) => {
+  return request({
+    url: '/product/taxrate',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品税率配置
+ * @param id
+ */
+export const delTaxrate = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/taxrate/' + id,
+    method: 'delete'
+  });
+};

+ 116 - 0
src/api/product/taxrate/types.ts

@@ -0,0 +1,116 @@
+export interface TaxrateVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 税率编号
+   */
+  taxrateNo: string;
+
+  /**
+   * 税率名称
+   */
+  taxrateName: string;
+
+  /**
+   * 税率值)
+   */
+  taxrate: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface TaxrateForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 税率编号
+   */
+  taxrateNo?: string;
+
+  /**
+   * 税率名称
+   */
+  taxrateName?: string;
+
+  /**
+   * 税率值)
+   */
+  taxrate?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface TaxrateQuery extends PageQuery {
+
+  /**
+   * 税率编号
+   */
+  taxrateNo?: string;
+
+  /**
+   * 税率名称
+   */
+  taxrateName?: string;
+
+  /**
+   * 税率值)
+   */
+  taxrate?: number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 5 - 0
src/api/product/topics/types.ts

@@ -250,6 +250,11 @@ export interface TopicsForm extends BaseEntity {
 
 export interface TopicsQuery extends PageQuery {
 
+  /**
+   * ID列表(用于批量查询)
+   */
+  ids?: string;
+
   /**
    * 采购主题编号
    */

+ 63 - 0
src/api/product/unit/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { UnitVO, UnitForm, UnitQuery } from '@/api/product/unit/types';
+
+/**
+ * 查询产品计量单位列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listUnit = (query?: UnitQuery): AxiosPromise<UnitVO[]> => {
+  return request({
+    url: '/product/unit/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品计量单位详细
+ * @param id
+ */
+export const getUnit = (id: string | number): AxiosPromise<UnitVO> => {
+  return request({
+    url: '/product/unit/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品计量单位
+ * @param data
+ */
+export const addUnit = (data: UnitForm) => {
+  return request({
+    url: '/product/unit',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品计量单位
+ * @param data
+ */
+export const updateUnit = (data: UnitForm) => {
+  return request({
+    url: '/product/unit',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品计量单位
+ * @param id
+ */
+export const delUnit = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/unit/' + id,
+    method: 'delete'
+  });
+};

+ 101 - 0
src/api/product/unit/types.ts

@@ -0,0 +1,101 @@
+export interface UnitVO {
+  /**
+   * 主键,自增ID
+   */
+  id: string | number;
+
+  /**
+   * 单位编号
+   */
+  unitNo: string;
+
+  /**
+   * 单位名称(如:件、箱、千克等)
+   */
+  unitName: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface UnitForm extends BaseEntity {
+  /**
+   * 主键,自增ID
+   */
+  id?: string | number;
+
+  /**
+   * 单位编号
+   */
+  unitNo?: string;
+
+  /**
+   * 单位名称(如:件、箱、千克等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface UnitQuery extends PageQuery {
+
+  /**
+   * 单位编号
+   */
+  unitNo?: string;
+
+  /**
+   * 单位名称(如:件、箱、千克等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 是否显示:1=是,0=否
+   */
+  isShow?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/volumeUnit/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { VolumeUnitVO, VolumeUnitForm, VolumeUnitQuery } from '@/api/product/volumeUnit/types';
+
+/**
+ * 查询产品体积单位列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listVolumeUnit = (query?: VolumeUnitQuery): AxiosPromise<VolumeUnitVO[]> => {
+  return request({
+    url: '/product/volumeUnit/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品体积单位详细
+ * @param id
+ */
+export const getVolumeUnit = (id: string | number): AxiosPromise<VolumeUnitVO> => {
+  return request({
+    url: '/product/volumeUnit/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品体积单位
+ * @param data
+ */
+export const addVolumeUnit = (data: VolumeUnitForm) => {
+  return request({
+    url: '/product/volumeUnit',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品体积单位
+ * @param data
+ */
+export const updateVolumeUnit = (data: VolumeUnitForm) => {
+  return request({
+    url: '/product/volumeUnit',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品体积单位
+ * @param id
+ */
+export const delVolumeUnit = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/volumeUnit/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/volumeUnit/types.ts

@@ -0,0 +1,71 @@
+export interface VolumeUnitVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 体积单位名称(如:立方米、升、立方厘米等)
+   */
+  unitName: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface VolumeUnitForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 体积单位名称(如:立方米、升、立方厘米等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface VolumeUnitQuery extends PageQuery {
+
+  /**
+   * 体积单位名称(如:立方米、升、立方厘米等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/product/weightUnit/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { WeightUnitVO, WeightUnitForm, WeightUnitQuery } from '@/api/product/weightUnit/types';
+
+/**
+ * 查询产品重量单位列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listWeightUnit = (query?: WeightUnitQuery): AxiosPromise<WeightUnitVO[]> => {
+  return request({
+    url: '/product/weightUnit/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询产品重量单位详细
+ * @param id
+ */
+export const getWeightUnit = (id: string | number): AxiosPromise<WeightUnitVO> => {
+  return request({
+    url: '/product/weightUnit/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增产品重量单位
+ * @param data
+ */
+export const addWeightUnit = (data: WeightUnitForm) => {
+  return request({
+    url: '/product/weightUnit',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改产品重量单位
+ * @param data
+ */
+export const updateWeightUnit = (data: WeightUnitForm) => {
+  return request({
+    url: '/product/weightUnit',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除产品重量单位
+ * @param id
+ */
+export const delWeightUnit = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/product/weightUnit/' + id,
+    method: 'delete'
+  });
+};

+ 71 - 0
src/api/product/weightUnit/types.ts

@@ -0,0 +1,71 @@
+export interface WeightUnitVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 重量单位名称(如:千克、克、吨、磅等)
+   */
+  unitName: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface WeightUnitForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 重量单位名称(如:千克、克、吨、磅等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface WeightUnitQuery extends PageQuery {
+
+  /**
+   * 重量单位名称(如:千克、克、吨、磅等)
+   */
+  unitName?: string;
+
+  /**
+   * 数据来源(如:系统配置、接口同步等)
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 75 - 0
src/api/system/comStaff/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComStaffVO, ComStaffForm, ComStaffQuery } from '../comStaff/types';
+
+/**
+ * 查询人员信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listComStaff = (query?: ComStaffQuery): AxiosPromise<ComStaffVO[]> => {
+  return request({
+    url: '/system/comStaff/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询人员信息详细
+ * @param staffId
+ */
+export const getComStaff = (staffId: string | number): AxiosPromise<ComStaffVO> => {
+  return request({
+    url: '/system/comStaff/' + staffId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增人员信息
+ * @param data
+ */
+export const addComStaff = (data: ComStaffForm) => {
+  return request({
+    url: '/system/comStaff',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改人员信息
+ * @param data
+ */
+export const updateComStaff = (data: ComStaffForm) => {
+  return request({
+    url: '/system/comStaff',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除人员信息
+ * @param staffId
+ */
+export const delComStaff = (staffId: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/comStaff/' + staffId,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, status: string) {
+  const data = {
+    id,
+    status
+  };
+  return request({
+    url: '/system/comStaff/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 215 - 0
src/api/system/comStaff/types.ts

@@ -0,0 +1,215 @@
+export interface ComStaffVO {
+  /**
+   * 人员ID
+   */
+  staffId: string | number;
+
+  /**
+   * 人员编码
+   */
+  staffCode: string;
+
+  /**
+   * 姓名
+   */
+  staffName: string;
+
+  /**
+   * 所属部门编码
+   */
+  deptId: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone: string;
+
+  /**
+   * 岗位编码
+   */
+  postId: string | number;
+
+  /**
+   * 性别
+   */
+  sex: string;
+
+  /**
+   * 角色编码
+   */
+  roleId: string | number;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 密码
+   */
+  password: string;
+
+  /**
+   * 有效期起始
+   */
+  validFrom: string | number;
+
+  /**
+   * 有效期截止
+   */
+  validTo: string | number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ComStaffForm extends BaseEntity {
+  /**
+   * 人员ID
+   */
+  staffId?: string | number;
+
+  /**
+   * 人员编码
+   */
+  staffCode?: string;
+
+  /**
+   * 姓名
+   */
+  staffName?: string;
+
+  /**
+   * 所属部门编码
+   */
+  deptId?: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 岗位编码
+   */
+  postId?: string | number;
+
+  /**
+   * 性别
+   */
+  sex?: string;
+
+  /**
+   * 角色编码
+   */
+  roleId?: string | number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 密码
+   */
+  password?: string;
+
+  /**
+   * 有效期起始
+   */
+  validFrom?: string | number;
+
+  /**
+   * 有效期截止
+   */
+  validTo?: string | number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ComStaffQuery extends PageQuery {
+  /**
+   * 人员编码
+   */
+  staffCode?: string;
+
+  /**
+   * 姓名
+   */
+  staffName?: string;
+
+  /**
+   * 所属部门编码
+   */
+  deptId?: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 岗位编码
+   */
+  postId?: string | number;
+
+  /**
+   * 性别
+   */
+  sex?: string;
+
+  /**
+   * 角色编码
+   */
+  roleId?: string | number;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 密码
+   */
+  password?: string;
+
+  /**
+   * 有效期起始
+   */
+  validFrom?: string | number;
+
+  /**
+   * 有效期截止
+   */
+  validTo?: string | number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 6 - 0
src/router/index.ts

@@ -142,6 +142,12 @@ export const constantRoutes: RouteRecordRaw[] = [
         name: 'PoolLink',
         meta: { title: '商品池管理', activeMenu: '/product/pool', noCache: true }
       },
+      {
+        path: 'base/review',
+        component: () => import('@/views/product/base/review.vue'),
+        name: 'BaseReview',
+        meta: { title: '商品审核', activeMenu: '/product/base' }
+      },
       {
         path: 'base/detail/:id',
         component: () => import('@/views/product/base/add.vue'),

+ 1 - 1
src/views/platform/customerOperation/vipSite/styleDesign.vue

@@ -237,7 +237,7 @@
 import { listSiteFloor, getSiteFloor, addSiteFloor, updateSiteFloor, delSiteFloor } from '@/api/product/siteFloor';
 import { SiteFloorVO, SiteFloorForm, SiteFloorQuery } from '@/api/product/siteFloor/types';
 import { listSiteFloorLink, addSiteFloorLink, delSiteFloorLink } from '@/api/product/siteFloorLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 import { listBrand } from '@/api/product/brand';
 import { useRouter, useRoute } from 'vue-router';
 

+ 3 - 3
src/views/platform/decoration/floor/manage.vue

@@ -224,7 +224,7 @@ import { CirclePlus, CircleClose, Close, Plus } from '@element-plus/icons-vue';
 import { listFloorAdvertise, addFloorAdvertise, updateFloorAdvertise } from '@/api/system/floorAdvertise';
 import { listFloorLabel, addFloorLabel, updateFloorLabel, delFloorLabel } from '@/api/system/floorLabel';
 import { listFloor } from '@/api/system/floor';
-import { listProductBase } from '@/api/product/productBase';
+import { listProduct } from '@/api/product/productBase';
 import { listDecorationFloorLink, addDecorationFloorLink, delDecorationFloorLink } from '@/api/product/decorationFloorLink';
 import ImageUpload from '@/components/ImageUpload/index.vue';
 
@@ -441,7 +441,7 @@ const getFloorProducts = async () => {
     for (const link of links) {
       if (link.productNo) {
         try {
-          const productRes = await listProductBase({ productNo: link.productNo, pageSize: 1 });
+          const productRes = await listProduct({ productNo: link.productNo, pageSize: 1 });
           if (productRes.rows && productRes.rows.length > 0) {
             // 保留关联表的id,用linkId存储
             productDetails.push({
@@ -489,7 +489,7 @@ const handleSearchProduct = async () => {
     if (productQuery.value) {
       params.productNo = productQuery.value;
     }
-    const res = await listProductBase(params);
+    const res = await listProduct(params);
     productList.value = res.rows || [];
     productTotal.value = res.total || 0;
   } catch (e) {

+ 14 - 13
src/views/platform/decoration/guide/index.vue

@@ -198,8 +198,9 @@ import { ElMessage, ElMessageBox } from 'element-plus';
 import { Picture, CircleClose } from '@element-plus/icons-vue';
 import { getFloorTitle, addFloorTitle, updateFloorTitle } from '@/api/system/floorTitle';
 import { listProgram, listProgramLink, addProgramLink, delProgramLink } from '@/api/product/program';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 import { listRecommend, listRecommendLink, addRecommendLink, delRecommendLink } from '@/api/product/recommend';
+import { listTopics } from '@/api/product/topics';
 
 // 分类标识
 const CATEGORY = 'guide';
@@ -314,17 +315,17 @@ const loadGuideList = async () => {
       return;
     }
     const programIds = links.map((link: any) => link.programId);
-    const programRes: any = await listProgram({ ids: programIds.join(','), category: CATEGORY, pageSize: 100 });
-    const programMap = new Map((programRes.rows || []).map((p: any) => [String(p.id), p]));
+    const topicsRes: any = await listTopics({ ids: programIds.join(','), pageNum: 1, pageSize: 100 });
+    const topicsMap = new Map((topicsRes.rows || []).map((p: any) => [String(p.id), p]));
     guideList.value = links.map((link: any) => {
-      const program: any = programMap.get(String(link.programId)) || {};
+      const topic: any = topicsMap.get(String(link.programId)) || {};
       return {
-        id: program.id || link.programId,
+        id: topic.id || link.programId,
         linkId: link.id,
-        programNo: program.programNo || '',
-        title: program.title || `方案${link.programId}`,
-        subtitle: program.describe || '',
-        imageUrl: program.coverImageUrl || program.coverImage
+        programNo: topic.procurementTopicsId || '',
+        title: topic.title || `方案${link.programId}`,
+        subtitle: topic.subtitle || '',
+        imageUrl: topic.coverImageUrl || topic.coverImage
       };
     });
   } catch (error) {
@@ -375,13 +376,13 @@ const handleOpenSelect = () => {
 
 const loadSelectList = async () => {
   try {
-    const params: any = { category: CATEGORY, pageNum: selectDialog.pageNum, pageSize: selectDialog.pageSize };
-    if (selectDialog.programNo) params.programNo = selectDialog.programNo;
+    const params: any = { pageNum: selectDialog.pageNum, pageSize: selectDialog.pageSize };
+    if (selectDialog.programNo) params.procurementTopicsId = selectDialog.programNo;
     if (selectDialog.title) params.title = selectDialog.title;
-    const res: any = await listProgram(params);
+    const res: any = await listTopics(params);
     selectList.value = (res.rows || []).map((item: any) => ({
       id: item.id,
-      programNo: item.programNo,
+      programNo: item.procurementTopicsId,
       title: item.title,
       imageUrl: item.coverImageUrl || item.coverImage,
       isLinked: linkedProgramIds.value.has(String(item.id)),

+ 4 - 4
src/views/platform/decoration/special/index.vue

@@ -152,7 +152,7 @@ import { ref, reactive, onMounted } from 'vue';
 import { ElMessage } from 'element-plus';
 import { Picture, CircleClose } from '@element-plus/icons-vue';
 import { getFloorTitle, addFloorTitle, updateFloorTitle } from '@/api/system/floorTitle';
-import { listProduct, getProduct } from '@/api/product/base';
+import { listProduct, getProduct } from '@/api/product/productBase';
 import { listRecommend, listRecommendLink, addRecommendLink, delRecommendLink } from '@/api/product/recommend';
 
 // 标题配置ID(特价管理用id=5)
@@ -483,7 +483,7 @@ onMounted(() => {
     background: rgba(255, 255, 255, 0.9);
     border-radius: 50%;
     padding: 2px;
-    
+
     &:hover { color: #f56c6c; }
   }
 
@@ -577,12 +577,12 @@ onMounted(() => {
 
 .action-link {
   cursor: pointer;
-  
+
   &.primary {
     color: #409eff;
     &:hover { color: #66b1ff; }
   }
-  
+
   &.danger {
     color: #f56c6c;
     &:hover { color: #f78989; }

+ 6 - 6
src/views/platform/gift/category/index.vue

@@ -236,7 +236,7 @@ import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { listGiftCategory, addGiftCategory, updateGiftCategory, delGiftCategory } from '@/api/product/giftCategory';
 import { listGiftCategoryLink, addGiftCategoryLink, delGiftCategoryLink } from '@/api/product/giftCategoryLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -321,7 +321,7 @@ const flattenTree = (tree: any[], level: number = 1, parentExpanded: boolean = t
   tree.forEach((node, index) => {
     const isLastItem = index === tree.length - 1;
     const newIsLast = [...isLast, isLastItem];
-    
+
     if (parentExpanded) {
       result.push({
         ...node,
@@ -331,7 +331,7 @@ const flattenTree = (tree: any[], level: number = 1, parentExpanded: boolean = t
         expanded: expandedKeys.value.has(node.categoryNo)
       });
     }
-    
+
     if (node.children && node.children.length > 0) {
       const childExpanded = parentExpanded && expandedKeys.value.has(node.categoryNo);
       result.push(...flattenTree(node.children, level + 1, childExpanded, newIsLast));
@@ -362,7 +362,7 @@ const getList = async () => {
     const list = res.rows || res.data || [];
     categoryList.value = buildTree(list, '');
     categoryOptions.value = [{ categoryNo: '', categoryName: '顶级分类', children: categoryList.value }];
-    
+
     // 默认全部展开
     if (isExpandAll.value) {
       const allKeys = new Set<string>();
@@ -377,7 +377,7 @@ const getList = async () => {
       collectKeys(categoryList.value);
       expandedKeys.value = allKeys;
     }
-    
+
     updateFlatList();
   } catch (error) {
     console.error('加载分类列表失败', error);
@@ -658,7 +658,7 @@ onMounted(() => {
   cursor: pointer;
   font-size: 10px;
   margin-right: 4px;
-  
+
   &:hover {
     color: #409eff;
   }

+ 6 - 6
src/views/platform/gift/floorAd/index.vue

@@ -198,7 +198,7 @@ import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { listGiftFloor, addGiftFloor, updateGiftFloor, delGiftFloor } from '@/api/product/giftFloor';
 import { listGiftFloorLinkWithProduct, addGiftFloorLink, delGiftFloorLink } from '@/api/product/giftFloorLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -449,17 +449,17 @@ const confirmSelectProducts = async () => {
     proxy?.$modal.msgWarning('请选择商品');
     return;
   }
-  
+
   // 检查是否有重复商品
   const existingProductNos = linkedProducts.value.map((item: any) => item.productNo);
   const duplicates = selectedProducts.value.filter((p: any) => existingProductNos.includes(p.productNo));
-  
+
   if (duplicates.length > 0) {
     const duplicateNames = duplicates.map((p: any) => p.itemName || p.productNo).join('、');
     proxy?.$modal.msgWarning(`商品 ${duplicateNames} 已存在,请勿重复添加`);
     return;
   }
-  
+
   try {
     for (const product of selectedProducts.value) {
       await addGiftFloorLink({
@@ -546,12 +546,12 @@ onMounted(() => {
 .action-link {
   cursor: pointer;
   margin: 0 6px;
-  
+
   &.primary {
     color: #409eff;
     &:hover { color: #66b1ff; }
   }
-  
+
   &.danger {
     color: #f56c6c;
     &:hover { color: #f78989; }

+ 1 - 1
src/views/platform/gift/forYou/index.vue

@@ -190,7 +190,7 @@ import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { listGiftFloor, addGiftFloor, updateGiftFloor, delGiftFloor } from '@/api/product/giftFloor';
 import { listGiftFloorLinkWithProduct, addGiftFloorLink, delGiftFloorLink } from '@/api/product/giftFloorLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 1 - 1
src/views/platform/gift/hotCustom/index.vue

@@ -180,7 +180,7 @@ import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { listGiftFloor, addGiftFloor, updateGiftFloor, delGiftFloor } from '@/api/product/giftFloor';
 import { listGiftFloorLinkWithProduct, addGiftFloorLink, delGiftFloorLink } from '@/api/product/giftFloorLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 5 - 5
src/views/platform/industrial/booth/index.vue

@@ -42,7 +42,7 @@
               </div>
             </transition>
           </div>
-        
+
           <!-- 导航箭头 -->
           <el-icon
             v-if="hasPrev"
@@ -245,7 +245,7 @@
 import { ref, reactive, computed, watch, nextTick, onMounted, onUnmounted } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { Close, Picture, ArrowLeft, ArrowRight } from '@element-plus/icons-vue';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 import { listRecommend, listRecommendLink, addRecommendLink, delRecommendLink } from '@/api/product/recommend';
 
 // 推荐位编号(工业装修-轮播展位商品)
@@ -664,7 +664,7 @@ const handleRemoveProduct = (id: string) => {
 const startAutoPlay = () => {
   stopAutoPlay();
   if (totalPages.value <= 1) return;
-  
+
   autoPlayTimer = setInterval(() => {
     if (totalPages.value <= 1) {
       stopAutoPlay();
@@ -904,10 +904,10 @@ onUnmounted(() => {
 .action-link {
   cursor: pointer;
   font-size: 14px;
-  
+
   &.danger {
     color: #f56c6c;
-    
+
     &:hover {
       color: #f78989;
     }

+ 3 - 3
src/views/platform/industrial/brandFloor/index.vue

@@ -245,7 +245,7 @@ import type { ComponentInternalInstance } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { listIndustrialFloor, addIndustrialFloor, updateIndustrialFloor, delIndustrialFloor } from '@/api/product/industrialFloor';
 import { listIndustrialFloorLink, listIndustrialFloorLinkWithProduct, addIndustrialFloorLink, delIndustrialFloorLink } from '@/api/product/industrialFloorLink';
-import { listProduct } from '@/api/product/base';
+import { listProduct } from '@/api/product/productBase';
 import { listBrand } from '@/api/product/brand';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -363,7 +363,7 @@ const preloadLinkedData = async () => {
       listIndustrialFloorLinkWithProduct(floor.id, 1),
       listIndustrialFloorLinkWithProduct(floor.id, 2)
     ]);
-    
+
     // 商品缓存
     const products = (productRes.data || []).map((item: any) => ({
       ...item,
@@ -371,7 +371,7 @@ const preloadLinkedData = async () => {
       price: item.minSellingPrice || item.marketPrice || ''
     }));
     linkedProductsCache.value.set(floor.id, products);
-    
+
     // 品牌缓存:通过 brandId 批量补充 brandName / brandLogo
     const brandLinks = brandRes.data || [];
     if (brandLinks.length > 0) {

+ 2 - 2
src/views/product/afterSales/index.vue

@@ -85,8 +85,8 @@
 </template>
 
 <script setup name="AfterSales" lang="ts">
-import { listAfterSales, getAfterSales, delAfterSales, addAfterSales, updateAfterSales } from '@/api/pmsProduct/afterSales';
-import { AfterSalesVO, AfterSalesQuery, AfterSalesForm } from '@/api/pmsProduct/afterSales/types';
+import { listAfterSales, getAfterSales, delAfterSales, addAfterSales, updateAfterSales } from '@/api/product/afterSales';
+import { AfterSalesVO, AfterSalesQuery, AfterSalesForm } from '@/api/product/afterSales/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/associate/index.vue

@@ -99,8 +99,8 @@
 </template>
 
 <script setup name="Associate" lang="ts">
-import { listAssociate, getAssociate, delAssociate, addAssociate, updateAssociate } from '@/api/pmsProduct/associate';
-import { AssociateVO, AssociateQuery, AssociateForm } from '@/api/pmsProduct/associate/types';
+import { listAssociate, getAssociate, delAssociate, addAssociate, updateAssociate } from '@/api/product/associate';
+import { AssociateVO, AssociateQuery, AssociateForm } from '@/api/product/associate/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 14 - 14
src/views/product/attributes/edit.vue

@@ -21,7 +21,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        
+
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="品牌名称(英文)" prop="categoryId">
@@ -44,12 +44,12 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="品牌推荐系数" prop="recommendValue">
-              <el-input-number 
-                v-model="extendFormData.recommendValue" 
-                :min="0" 
-                :max="9999" 
-                controls-position="right" 
-                style="width: 100%" 
+              <el-input-number
+                v-model="extendFormData.recommendValue"
+                :min="0"
+                :max="9999"
+                controls-position="right"
+                style="width: 100%"
                 placeholder="请输入推荐系数"
               />
             </el-form-item>
@@ -92,10 +92,10 @@
 </template>
 
 <script setup lang="ts" name="AttributesEdit">
-import { getAttributes, addAttributes, updateAttributes } from '@/api/pmsProduct/attributes';
-import { AttributesForm } from '@/api/pmsProduct/attributes/types';
-import { categoryTree } from '@/api/pmsProduct/base';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
+import { getAttributes, addAttributes, updateAttributes } from '@/api/product/attributes';
+import { AttributesForm } from '@/api/product/attributes/types';
+import { categoryTree } from '@/api/product/base/index';
+import { categoryTreeVO } from '@/api/product/category/types';
 
 const route = useRoute();
 const router = useRouter();
@@ -136,7 +136,7 @@ const form = ref<AttributesForm>({ ...initFormData });
 const rules = reactive({
   categoryId: [
     { required: true, message: "商品类别不能为空", trigger: "change" },
-    { 
+    {
       validator: (rule: any, value: any, callback: any) => {
         if (!value) {
           callback();
@@ -207,7 +207,7 @@ const getCategoryFullPath = (categoryId: string | number): string => {
 }
 
 /** 查询分类树 */
-const getCategoryTree = async () => {
+const getCategoryTreeFunc = async () => {
   const res = await categoryTree();
   categoryOptions.value = res.data || [];
 }
@@ -252,7 +252,7 @@ const goBack = () => {
 };
 
 onMounted(() => {
-  getCategoryTree();
+  getCategoryTreeFunc();
   getDetail();
 });
 </script>

+ 12 - 12
src/views/product/attributes/index.vue

@@ -154,11 +154,11 @@
           </el-radio-group>
         </el-form-item>
         <el-form-item label="可选值列表" prop="attributesList" v-if="form.entryMethod === 'select'">
-          <el-input 
-            v-model="form.attributesList" 
-            type="textarea" 
-            :rows="4" 
-            placeholder="请输入属性值,各属性值请用逗号隔开并来示意。例如:A4,70g,100g" 
+          <el-input
+            v-model="form.attributesList"
+            type="textarea"
+            :rows="4"
+            placeholder="请输入属性值,各属性值请用逗号隔开并来示意。例如:A4,70g,100g"
           />
         </el-form-item>
       </el-form>
@@ -173,10 +173,10 @@
 </template>
 
 <script setup name="Attributes" lang="ts">
-import { listAttributes, getAttributes, delAttributes, addAttributes, updateAttributes } from '@/api/pmsProduct/attributes';
-import { AttributesVO, AttributesQuery, AttributesForm } from '@/api/pmsProduct/attributes/types';
-import { categoryTree } from '@/api/pmsProduct/base';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
+import { listAttributes, getAttributes, delAttributes, addAttributes, updateAttributes } from '@/api/product/attributes';
+import { AttributesVO, AttributesQuery, AttributesForm } from '@/api/product/attributes/types';
+import { categoryTree } from '@/api/product/base/index';
+import { categoryTreeVO } from '@/api/product/category/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const router = useRouter();
@@ -231,7 +231,7 @@ const data = reactive<PageData<AttributesForm, AttributesQuery>>({
   rules: {
     categoryId: [
       { required: true, message: "商品类别不能为空", trigger: "change" },
-      { 
+      {
         validator: (rule: any, value: any, callback: any) => {
           if (!value) {
             callback();
@@ -269,7 +269,7 @@ const getList = async () => {
 }
 
 /** 查询分类树 */
-const getCategoryTree = async () => {
+const getCategoryTreeFunc = async () => {
   const res = await categoryTree();
   categoryOptions.value = res.data || [];
   // 设置默认选中第一项
@@ -415,6 +415,6 @@ const handleExport = () => {
 
 onMounted(() => {
   getList();
-  getCategoryTree();
+  getCategoryTreeFunc();
 });
 </script>

+ 297 - 87
src/views/product/base/add.vue

@@ -213,6 +213,7 @@
                     placeholder="请输入UPC(69)条码"
                     maxlength="20"
                     show-word-limit
+                    @input="handleUpcInput"
                   />
                 </el-form-item>
               </el-col>
@@ -245,16 +246,23 @@
               <!-- 商品品牌 -->
                <el-col :span="12">
                 <el-form-item label="商品品牌:" prop="brandId" required>
-                  <el-select-v2
+                  <el-select
                     v-model="productForm.brandId"
-                    :options="brandOptionsFormatted"
-                    placeholder="请选择商品品牌"
-                    clearable
+                    placeholder="请输入品牌名称搜索"
                     filterable
-                    class="w-full"
+                    remote
+                    clearable
+                    :remote-method="handleBrandSearch"
                     :loading="brandLoading"
-                    @visible-change="handleBrandVisibleChange"
-                  />
+                    class="w-full"
+                  >
+                    <el-option
+                      v-for="item in brandOptions"
+                      :key="item.id"
+                      :label="item.brandName"
+                      :value="item.id"
+                    />
+                  </el-select>
                 </el-form-item>
                </el-col>
 
@@ -277,7 +285,14 @@
             <el-row :gutter="20">
               <el-col :span="12">
                 <el-form-item label="税率:" required>
-                  <el-input v-model="productForm.taxRate" placeholder="请输入商品税率" type="number" />
+                  <el-select v-model="productForm.taxRate" placeholder="请选择税率" clearable class="w-full">
+                    <el-option
+                      v-for="option in taxRateOptions"
+                      :key="option.id"
+                      :label="option.taxrateName"
+                      :value="option.taxrate"
+                    />
+                  </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
@@ -367,12 +382,15 @@
               />
             </el-form-item>
 
-            <!-- 主库简介 -->
+            <!-- 主供应商 -->
             <el-form-item label="主供应商:" prop="mainLibraryIntro" required>
-              <el-select v-model="productForm.mainLibraryIntro" placeholder="请选择" clearable class="w-full">
-                <el-option label="选项1" value="1" />
-                <el-option label="选项2" value="2" />
-                <el-option label="选项3" value="3" />
+              <el-select v-model="productForm.mainLibraryIntro" placeholder="请选择" clearable class="w-full" value-key="id">
+                <el-option
+                  v-for="option in supplierOptions"
+                  :key="option.id"
+                  :label="`${option.supplierNo},${option.enterpriseName}`"
+                  :value="String(option.id)"
+                />
               </el-select>
             </el-form-item>
 
@@ -415,7 +433,7 @@
             <span class="text-lg font-bold">销售价格</span>
           </template>
 
-          <el-form ref="priceFormRef" :model="productForm" label-width="120px" class="product-info-form">
+          <el-form ref="priceFormRef" :model="productForm" :rules="productRules" label-width="120px" class="product-info-form">
             <el-row :gutter="20">
               <el-col :span="8">
                 <el-form-item label="市场价:" prop="midRangePrice" required>
@@ -423,6 +441,7 @@
                     v-model="productForm.midRangePrice"
                     type="number"
                     placeholder="请输入市场价"
+                    @blur="formatPrice('midRangePrice')"
                   />
                 </el-form-item>
               </el-col>
@@ -432,6 +451,7 @@
                     v-model="productForm.standardPrice"
                     type="number"
                     placeholder="请输入平台售价"
+                    @blur="formatPrice('standardPrice')"
                   />
                 </el-form-item>
               </el-col>
@@ -441,6 +461,7 @@
                     v-model="productForm.certificatePrice"
                     type="number"
                     placeholder="请输入最低售价"
+                    @blur="formatPrice('certificatePrice')"
                   />
                 </el-form-item>
               </el-col>
@@ -471,7 +492,7 @@
             <span class="text-lg font-bold">采购价格</span>
           </template>
 
-          <el-form ref="purchasePriceFormRef" :model="productForm" label-width="120px" class="product-info-form">
+          <el-form ref="purchasePriceFormRef" :model="productForm" :rules="productRules" label-width="120px" class="product-info-form">
             <el-row :gutter="20">
               <el-col :span="12">
                 <el-form-item label="采购价:" prop="purchasePrice" required>
@@ -479,6 +500,7 @@
                     v-model="productForm.purchasePrice"
                     type="number"
                     placeholder="请输入采购价"
+                    @blur="formatPrice('purchasePrice')"
                   />
                 </el-form-item>
               </el-col>
@@ -488,6 +510,7 @@
                     v-model="productForm.estimatedPurchasePrice"
                     type="number"
                     placeholder="请输入暂估采购价"
+                    @blur="formatPrice('estimatedPurchasePrice')"
                   />
                 </el-form-item>
               </el-col>
@@ -501,23 +524,29 @@
             <span class="text-lg font-bold">采购信息</span>
           </template>
 
-          <el-form ref="purchaseInfoFormRef" :model="productForm" label-width="120px" class="product-info-form">
+          <el-form ref="purchaseInfoFormRef" :model="productForm" :rules="productRules" label-width="120px" class="product-info-form">
             <el-row :gutter="20">
               <el-col :span="12">
-                <el-form-item label="产品性质:" prop="productNature" required>
-                  <el-select v-model="productForm.productNature" placeholder="请选择" clearable class="w-full">
-                    <el-option label="自营" value="1" />
-                    <el-option label="代销" value="2" />
-                    <el-option label="定制" value="3" />
+                <el-form-item label="产品经理:" prop="productNature" required>
+                  <el-select v-model="productForm.productNature" placeholder="请选择" clearable class="w-full" value-key="staffId">
+                    <el-option
+                      v-for="option in staffOptions"
+                      :key="option.staffId"
+                      :label="`${option.staffCode},${option.staffName}`"
+                      :value="String(option.staffId)"
+                    />
                   </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="12">
                 <el-form-item label="采购人员:" prop="purchasingPersonnel" required>
-                  <el-select v-model="productForm.purchasingPersonnel" placeholder="请选择" clearable class="w-full">
-                    <el-option label="采购员1" value="1" />
-                    <el-option label="采购员2" value="2" />
-                    <el-option label="采购员3" value="3" />
+                  <el-select v-model="productForm.purchasingPersonnel" placeholder="请选择" clearable class="w-full" value-key="staffId">
+                    <el-option
+                      v-for="option in staffOptions"
+                      :key="option.staffId"
+                      :label="`${option.staffCode},${option.staffName}`"
+                      :value="String(option.staffId)"
+                    />
                   </el-select>
                 </el-form-item>
               </el-col>
@@ -616,6 +645,27 @@
               </div>
             </el-form-item>
 
+            <!-- 商品轮播图 -->
+            <el-form-item label="商品轮播图:">
+              <div class="carousel-images-container">
+                <div class="carousel-image-list">
+                  <div v-for="(imgUrl, index) in carouselImages" :key="index" class="carousel-image-item">
+                    <img :src="imgUrl" class="carousel-preview-image" />
+                    <div class="carousel-image-actions">
+                      <el-button size="small" type="danger" @click="removeCarouselImage(index)">删除</el-button>
+                    </div>
+                  </div>
+                  <div class="image-upload-placeholder carousel-add-btn" @click="openCarouselImageSelector">
+                    <el-icon class="upload-icon"><Plus /></el-icon>
+                    <div class="upload-text">添加图片</div>
+                  </div>
+                </div>
+              </div>
+              <div class="form-item-tip">
+                从图片库选择,支持多选,建议尺寸300*300px
+              </div>
+            </el-form-item>
+
             <!-- 商品详情 -->
             <el-form-item label="商品详情:">
               <el-tabs v-model="activeDetailTab" type="border-card">
@@ -764,6 +814,14 @@
       title="选择商品主图"
       @confirm="handleMainImageSelected"
     />
+    <!-- 轮播图文件选择器 -->
+    <FileSelector
+      v-model="carouselImageSelectorVisible"
+      :allowed-types="[1]"
+      :multiple="true"
+      title="选择商品轮播图"
+      @confirm="handleCarouselImagesSelected"
+    />
   </div>
 </template>
 
@@ -774,11 +832,16 @@ import { ElMessage } from 'element-plus';
 import { Warning, ArrowRight, Check, Plus, CircleCheck } from '@element-plus/icons-vue';
 import Editor from '@/components/Editor/index.vue';
 import FileSelector from '@/components/FileSelector/index.vue';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
-import { BrandVO } from '@/api/pmsProduct/brand/types';
-import { BaseForm } from '@/api/pmsProduct/base/types';
-import { AttributesVO } from '@/api/pmsProduct/attributes/types';
-import { addBase, updateBase, getBase, brandList, categoryTree, categoryAttributeList, getAfterSaleList, getServiceList, getUnitList } from '@/api/pmsProduct/base';
+import { categoryTreeVO } from '@/api/product/category/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { BaseForm } from '@/api/product/base/types';
+import { AttributesVO } from '@/api/product/attributes/types';
+import { addBase, updateBase, getBase, categoryTree, categoryAttributeList, getAfterSaleList, getServiceList, getUnitList, getTaxRateList } from '@/api/product/base/index';
+import { listBrand } from '@/api/product/brand';
+import { listInfo } from '@/api/customer/supplierInfo';
+import { InfoVO } from '@/api/customer/supplierInfo/types';
+import { listComStaff } from '@/api/system/comStaff';
+import { ComStaffVO } from '@/api/system/comStaff/types';
 
 const route = useRoute();
 const router = useRouter();
@@ -797,6 +860,13 @@ const activeDetailTab = ref('pc');
 
 // 文件选择器相关
 const mainImageSelectorVisible = ref(false);
+const carouselImageSelectorVisible = ref(false);
+
+// 轮播图URL数组(UI管理用)
+const carouselImages = ref<string[]>([]);
+
+// 税率选项
+const taxRateOptions = ref<any[]>([]);
 
 // 定制说明表单
 const customForm = reactive({
@@ -933,6 +1003,7 @@ const productForm = reactive<BaseForm>({
   bottomCategoryId: undefined,
   unitId: undefined,
   productImage: undefined,
+  imageUrl: undefined,
   isSelf: 0,
   productReviewStatus: 0,
   homeRecommended: 0,
@@ -954,7 +1025,7 @@ const productForm = reactive<BaseForm>({
   weightUnit: 'kg',
   volume: undefined,
   volumeUnit: 'm3',
-  mainLibraryIntro: '1',
+  mainLibraryIntro: undefined,
   afterSalesService: undefined,
   serviceGuarantee: undefined, // 服务保障ID列表,逗号分隔
   freeInstallation: '0',
@@ -975,30 +1046,25 @@ const productForm = reactive<BaseForm>({
 
 // 表单验证规则
 const productRules = {
-  productNo: [{ required: true, message: '请输入商品编号', trigger: 'blur' }],
-  itemName: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
-  brandId: [{ required: true, message: '请选择商品品牌', trigger: 'change' }],
-  mainLibraryIntro: [{ required: true, message: '请选择主库简介', trigger: 'change' }],
-  midRangePrice: [{ required: true, message: '请输入市场价', trigger: 'blur' }],
-  standardPrice: [{ required: true, message: '请输入平档价', trigger: 'blur' }],
-  certificatePrice: [{ required: true, message: '请输入最低售价', trigger: 'blur' }],
-  purchasePrice: [{ required: true, message: '请输入采购价', trigger: 'blur' }],
-  productNature: [{ required: true, message: '请选择产品性质', trigger: 'change' }],
-  purchasingPersonnel: [{ required: true, message: '请选择采购人员', trigger: 'change' }],
-  taxRate: [{ required: true, message: '请输入税率', trigger: 'blur' }],
-  minOrderQuantity: [{ required: true, message: '请输入最低起订量', trigger: 'blur' }],
+  productNo: [{ required: true, message: '商品编号不能为空', trigger: 'blur' }],
+  itemName: [{ required: true, message: '商品名称不能为空', trigger: 'blur' }],
+  brandId: [{ required: true, message: '商品品牌不能为空', trigger: 'change' }],
+  mainLibraryIntro: [{ required: true, message: '主供应商不能为空', trigger: 'change' }],
+  midRangePrice: [{ required: true, message: '市场价不能为空', trigger: 'blur' }],
+  standardPrice: [{ required: true, message: '平台售价不能为空', trigger: 'blur' }],
+  certificatePrice: [{ required: true, message: '最低售价不能为空', trigger: 'blur' }],
+  purchasePrice: [{ required: true, message: '采购价不能为空', trigger: 'blur' }],
+  productNature: [{ required: true, message: '产品经理不能为空', trigger: 'change' }],
+  purchasingPersonnel: [{ required: true, message: '采购人员不能为空', trigger: 'change' }],
+  taxRate: [{ required: true, message: '税率不能为空', trigger: 'change' }],
+  minOrderQuantity: [{ required: true, message: '最低起订量不能为空', trigger: 'blur' }],
 };
 
 // 分类和品牌选项
 const categoryOptions = ref<categoryTreeVO[]>([]);
 const brandOptions = ref<BrandVO[]>([]);
 const brandLoading = ref(false);
-const brandOptionsFormatted = computed(() => {
-  return brandOptions.value.slice(0, 500).map(item => ({
-    label: item.brandName,
-    value: item.id
-  }));
-});
+let brandSearchTimer: ReturnType<typeof setTimeout> | null = null;
 
 // 商品属性列表
 const attributesList = ref<AttributesVO[]>([]);
@@ -1011,6 +1077,12 @@ const serviceGuaranteeOptions = ref<any[]>([]);
 // 单位选项
 const unitOptions = ref<any[]>([]);
 
+// 主供应商选项
+const supplierOptions = ref<InfoVO[]>([]);
+
+// 采购人员选项
+const staffOptions = ref<ComStaffVO[]>([]);
+
 // 搜索关键词
 const searchLevel1 = ref('');
 const searchLevel2 = ref('');
@@ -1138,7 +1210,7 @@ const nextStep = async () => {
     productForm.topCategoryId = categoryForm.topCategoryId;
     productForm.mediumCategoryId = categoryForm.mediumCategoryId;
     productForm.bottomCategoryId = categoryForm.bottomCategoryId;
-    
+
     currentStep.value++;
   } else if (currentStep.value === 1) {
     // 验证商品信息表单并提交
@@ -1170,6 +1242,8 @@ const handleSubmit = async () => {
       ...productForm,
       // 将服务保障ID数组转换为逗号分隔字符串
       serviceGuarantee: serviceGuarantees.value.map(id => String(id)).join(','),
+      // 轮播图URL逗号分隔
+      imageUrl: carouselImages.value.join(','),
       // 将商品属性值转换为JSON字符串
       attributesList: JSON.stringify(productAttributesValues.value),
       customizable: customForm.customizable,
@@ -1222,6 +1296,45 @@ const clearMainImage = () => {
   productForm.productImage = undefined;
 };
 
+// 打开轮播图选择器
+const openCarouselImageSelector = () => {
+  carouselImageSelectorVisible.value = true;
+};
+
+// 处理轮播图选择(多选)
+const handleCarouselImagesSelected = (files: any[]) => {
+  if (files && files.length > 0) {
+    files.forEach(file => {
+      if (!carouselImages.value.includes(file.url)) {
+        carouselImages.value.push(file.url);
+      }
+    });
+  }
+};
+
+// 删除轮播图
+const removeCarouselImage = (index: number) => {
+  carouselImages.value.splice(index, 1);
+};
+
+// UPC(69)条码只允许输入数字
+const handleUpcInput = () => {
+  if (productForm.upcBarcode) {
+    productForm.upcBarcode = productForm.upcBarcode.replace(/\D/g, '');
+  }
+};
+
+// 格式化价格为两位小数
+const formatPrice = (field: string) => {
+  const val = (productForm as any)[field];
+  if (val !== undefined && val !== null && val !== '') {
+    const num = parseFloat(String(val));
+    if (!isNaN(num)) {
+      (productForm as any)[field] = parseFloat(num.toFixed(2));
+    }
+  }
+};
+
 // 获取分类树
 const getCategoryTree = async () => {
   try {
@@ -1232,27 +1345,31 @@ const getCategoryTree = async () => {
   }
 };
 
-// 获取品牌列表(实时请求,每次只加载500条)
-const getBrandList = async () => {
+// 加载品牌选项(默认100条)
+const loadBrandOptions = async (keyword?: string) => {
+  brandLoading.value = true;
   try {
-    brandLoading.value = true;
-    const res = await brandList({ pageNum: 1, pageSize: 500 });
-    brandOptions.value = res.data || [];
-    // 如果是新增模式且有选项,设置第一个为默认值
-    if (!route.params.id && brandOptions.value.length > 0 && !productForm.brandId) {
-      productForm.brandId = brandOptions.value[0].id;
-    }
+    const res = await listBrand({ pageNum: 1, pageSize: 100, brandName: keyword });
+    brandOptions.value = res.rows || [];
   } catch (error) {
-    console.error('获取品牌列表失败:', error);
+    console.error('加载品牌列表失败:', error);
   } finally {
     brandLoading.value = false;
   }
 };
 
+// 品牌远程搜索(防抖)
+const handleBrandSearch = (query: string) => {
+  if (brandSearchTimer) clearTimeout(brandSearchTimer);
+  brandSearchTimer = setTimeout(() => {
+    loadBrandOptions(query || undefined);
+  }, 300);
+};
+
 // 处理品牌下拉框显示/隐藏
 const handleBrandVisibleChange = (visible: boolean) => {
   if (visible && brandOptions.value.length === 0) {
-    getBrandList();
+    loadBrandOptions();
   }
 };
 
@@ -1298,6 +1415,52 @@ const getUnitOptions = async () => {
   }
 };
 
+// 获取主供应商列表
+const getSupplierOptions = async () => {
+  try {
+    const res = await listInfo();
+    console.log('供应商接口返回:', res);
+    // 处理可能的数据结构: res.data 或 res.rows
+    const dataList = res.data || res.rows || [];
+    supplierOptions.value = dataList;
+    console.log('供应商列表:', supplierOptions.value);
+    // 如果有选项且当前没有选中值,设置第一个为默认值
+    if (supplierOptions.value.length > 0 && !productForm.mainLibraryIntro) {
+      productForm.mainLibraryIntro = String(supplierOptions.value[0].id);
+    }
+  } catch (error) {
+    console.error('获取主供应商列表失败:', error);
+  }
+};
+
+// 获取采购人员列表
+const getStaffOptions = async () => {
+  try {
+    const res = await listComStaff();
+    console.log('采购人员接口返回:', res);
+    // 处理可能的数据结构: res.data 或 res.rows
+    const dataList = res.data || res.rows || [];
+    staffOptions.value = dataList;
+    console.log('采购人员列表:', staffOptions.value);
+    // 如果有选项且当前没有选中值,设置第一个为默认值
+    if (staffOptions.value.length > 0 && !productForm.purchasingPersonnel) {
+      productForm.purchasingPersonnel = String(staffOptions.value[0].staffId);
+    }
+  } catch (error) {
+    console.error('获取采购人员列表失败:', error);
+  }
+};
+
+// 获取税率列表
+const getTaxRateOptions = async () => {
+  try {
+    const res = await getTaxRateList();
+    taxRateOptions.value = res.rows || [];
+  } catch (error) {
+    console.error('获取税率列表失败:', error);
+  }
+};
+
 // 加载分类属性列表
 const loadCategoryAttributes = async (categoryId: string | number) => {
   try {
@@ -1355,6 +1518,13 @@ const loadProductDetail = async () => {
       const res = await getBase(id as string);
       Object.assign(productForm, res.data);
 
+      // 回显轮播图
+      if (res.data.imageUrl) {
+        carouselImages.value = res.data.imageUrl.split(',').filter((url: string) => url.trim());
+      } else {
+        carouselImages.value = [];
+      }
+
       // 回显分类选择
       categoryForm.topCategoryId = res.data.topCategoryId;
       categoryForm.mediumCategoryId = res.data.mediumCategoryId;
@@ -1422,7 +1592,13 @@ onMounted(async () => {
   await getUnitOptions();
   await getAfterSalesOptions();
   await getServiceGuaranteeOptions();
+  await getTaxRateOptions();
+  // 先加载商品详情(如果是编辑模式)
   await loadProductDetail();
+  // 再加载下拉选项,这样如果详情中没有值,会自动设置第一个
+  await getSupplierOptions();
+  await getStaffOptions();
+  loadBrandOptions();
 });
 </script>
 
@@ -1515,7 +1691,7 @@ onMounted(async () => {
 
     .image-preview {
       position: relative;
-      
+
       .preview-image {
         width: 178px;
         height: 178px;
@@ -1531,35 +1707,35 @@ onMounted(async () => {
         gap: 8px;
       }
     }
+  }
 
-    .image-upload-placeholder {
-      width: 178px;
-      height: 178px;
-      border: 1px dashed #d9d9d9;
-      border-radius: 6px;
-      cursor: pointer;
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-      justify-content: center;
-      transition: all 0.3s;
-      background-color: #fafafa;
+  .image-upload-placeholder {
+    width: 178px;
+    height: 178px;
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    transition: all 0.3s;
+    background-color: #fafafa;
 
-      &:hover {
-        border-color: #409eff;
-        background-color: #f5f7fa;
-      }
+    &:hover {
+      border-color: #409eff;
+      background-color: #f5f7fa;
+    }
 
-      .upload-icon {
-        font-size: 28px;
-        color: #8c939d;
-        margin-bottom: 8px;
-      }
+    .upload-icon {
+      font-size: 28px;
+      color: #8c939d;
+      margin-bottom: 8px;
+    }
 
-      .upload-text {
-        color: #8c939d;
-        font-size: 14px;
-      }
+    .upload-text {
+      color: #8c939d;
+      font-size: 14px;
     }
   }
 
@@ -1569,6 +1745,40 @@ onMounted(async () => {
     flex-wrap: wrap;
   }
 
+  .carousel-images-container {
+    width: 100%;
+
+    .carousel-image-list {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 10px;
+
+      .carousel-image-item {
+        position: relative;
+
+        .carousel-preview-image {
+          width: 120px;
+          height: 120px;
+          display: block;
+          object-fit: cover;
+          border-radius: 6px;
+          border: 1px solid #dcdfe6;
+        }
+
+        .carousel-image-actions {
+          margin-top: 6px;
+          display: flex;
+          justify-content: center;
+        }
+      }
+
+      .carousel-add-btn {
+        width: 120px;
+        height: 120px;
+      }
+    }
+  }
+
   .custom-table {
     width: 100%;
     margin-top: 10px;

+ 61 - 17
src/views/product/base/index.vue

@@ -17,7 +17,25 @@
               </el-col>
               <el-col :span="6">
                 <el-form-item label="商品品牌" prop="brandName">
-                  <el-input v-model="queryParams.brandName" placeholder="请输入商品品牌" clearable @keyup.enter="handleQuery" />
+                  <el-select
+                    v-model="queryParams.brandName"
+                    placeholder="请输入品牌名称搜索"
+                    filterable
+                    remote
+                    clearable
+                    :remote-method="handleBrandSearch"
+                    :loading="brandLoading"
+                    value-key="brandName"
+                    style="width: 100%"
+                    @keyup.enter="handleQuery"
+                  >
+                    <el-option
+                      v-for="item in brandOptions"
+                      :key="item.id"
+                      :label="item.brandName"
+                      :value="item.brandName"
+                    />
+                  </el-select>
                 </el-form-item>
               </el-col>
               <el-col :span="6">
@@ -113,17 +131,17 @@
             <image-preview :src="scope.row.productImage" :width="60" :height="60" />
           </template>
         </el-table-column>
-        <el-table-column label="商品信息" align="center" width="250" show-overflow-tooltip>
+        <el-table-column label="商品信息" align="center" min-width="250">
           <template #default="scope">
             <div class="text-left">
-              <div>{{ scope.row.itemName }}</div>
+              <div style="white-space: normal; word-break: break-all; line-height: 1.4">{{ scope.row.itemName }}</div>
               <div class="text-gray-500" style="font-size: 12px">品牌: {{ scope.row.brandName || '-' }}</div>
             </div>
           </template>
         </el-table-column>
         <el-table-column label="商品分类" align="center" prop="categoryName" width="120" />
-        <el-table-column label="单位" align="center" prop="unitName" width="80" />
-        <el-table-column label="SKU价格" align="center" width="180">
+        <el-table-column label="单位" align="center" prop="unitName" width="60" />
+        <el-table-column label="SKU价格" align="center" width="120">
           <template #default="scope">
             <div class="text-left" style="font-size: 12px">
               <div>
@@ -155,19 +173,19 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column label="数据来源" align="center" prop="dataSource" width="100">
+        <el-table-column label="数据来源" align="center" prop="dataSource" width="80">
           <template #default="scope">
             <span>{{ scope.row.dataSource || '-' }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="是否自营" align="center" width="100">
+        <el-table-column label="是否自营" align="center" width="80">
           <template #default="scope">
             <el-tag v-if="scope.row.isSelf === 1" type="success">是</el-tag>
             <el-tag v-else-if="scope.row.isSelf === 0" type="info">否</el-tag>
             <span v-else>-</span>
           </template>
         </el-table-column>
-        <el-table-column label="审核状态" align="center" prop="productReviewStatus" width="100">
+        <el-table-column label="审核状态" align="center" prop="productReviewStatus" width="90">
           <template #default="scope">
             <span v-if="scope.row.productReviewStatus === 0">待采购审核</span>
             <span v-else-if="scope.row.productReviewStatus === 1">审核通过</span>
@@ -176,7 +194,7 @@
             <span v-else>-</span>
           </template>
         </el-table-column>
-        <el-table-column label="上下架状态" align="center" prop="productStatus" width="120">
+        <el-table-column label="上下架状态" align="center" prop="productStatus" width="100">
           <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>
@@ -184,15 +202,15 @@
             <el-tag v-else type="info">未知</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="280" fixed="right">
+        <el-table-column label="操作" align="center" width="150" fixed="right">
           <template #default="scope">
             <!-- 待审核状态:只显示编辑 -->
-            <div v-if="scope.row.productReviewStatus !== 2" class="flex gap-1 justify-center">
+            <div v-if="scope.row.productReviewStatus !== 1" class="flex gap-1 justify-center">
               <el-link type="primary" :underline="false" @click="handleUpdate(scope.row)">编辑</el-link>
             </div>
 
             <!-- 审核通过 -->
-            <div v-else-if="scope.row.productReviewStatus === 2" class="flex flex-col gap-1">
+            <div v-else-if="scope.row.productReviewStatus === 1" class="flex flex-col gap-1">
               <!-- 下架状态:编辑、上架、停售、修改库存 -->
               <div v-if="scope.row.productStatus === 0" class="flex gap-1 justify-center">
                 <el-link type="primary" :underline="false" @click="handleUpdate(scope.row)">编辑</el-link>
@@ -237,10 +255,11 @@
 </template>
 
 <script setup name="Base" lang="ts">
-import { listBase, getBase, delBase, brandList, categoryTree, shelfReview, changeProductType, getProductStatusCount } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery, BaseForm, StatusCountVo } from '@/api/pmsProduct/base/types';
-import { BrandVO } from '@/api/pmsProduct/brand/types';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
+import { listBase, getBase, delBase, brandList, categoryTree, shelfReview, changeProductType, getProductStatusCount } from '@/api/product/base/index';
+import { BaseVO, BaseQuery, BaseForm, StatusCountVo } from '@/api/product/base/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { listBrand } from '@/api/product/brand';
+import { categoryTreeVO } from '@/api/product/category/types';
 import { useRoute, useRouter } from 'vue-router';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -256,6 +275,9 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 const categoryOptions = ref<categoryTreeVO[]>([]);
+const brandOptions = ref<BrandVO[]>([]);
+const brandLoading = ref(false);
+let brandSearchTimer: ReturnType<typeof setTimeout> | null = null;
 const hasMore = ref(true); // 是否还有更多数据
 // 页面历史记录,存储每页的第一个id和最后一个id,用于支持双向翻页
 const pageHistory = ref([]);
@@ -544,7 +566,7 @@ const handleSupply = (row: BaseVO) => {
 /** 停售操作 */
 const handleDiscontinue = async (row: BaseVO) => {
   await proxy?.$modal.confirm('确认停售该商品吗?停售后商品将无法正常售卖。');
-  
+
   try {
     // 调用停售API,将商品类型改为3(停售商品)
     await changeProductType({
@@ -575,6 +597,27 @@ const getCategoryTree = async () => {
   categoryOptions.value = res.data || [];
 };
 
+/** 加载品牌选项(默认100条) */
+const loadBrandOptions = async (keyword?: string) => {
+  brandLoading.value = true;
+  try {
+    const res = await listBrand({ pageNum: 1, pageSize: 100, brandName: keyword });
+    brandOptions.value =  res.rows || [];
+  } catch (error) {
+    console.error('加载品牌列表失败:', error);
+  } finally {
+    brandLoading.value = false;
+  }
+};
+
+/** 品牌远程搜索(防抖) */
+const handleBrandSearch = (query: string) => {
+  if (brandSearchTimer) clearTimeout(brandSearchTimer);
+  brandSearchTimer = setTimeout(() => {
+    loadBrandOptions(query || undefined);
+  }, 300);
+};
+
 /** 获取统计信息 */
 const getStatistics = async () => {
   try {
@@ -591,5 +634,6 @@ onMounted(() => {
   getList();
   getCategoryTree();
   getStatistics();
+  loadBrandOptions();
 });
 </script>

+ 4 - 4
src/views/product/base/review.vue

@@ -241,10 +241,10 @@
 </template>
 
 <script setup name="BaseReview" lang="ts">
-import { listBase, getBase, reviewBase, brandList, categoryTree } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery, BaseForm } from '@/api/pmsProduct/base/types';
-import { BrandVO } from '@/api/pmsProduct/brand/types';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
+import { listBase, getBase, reviewBase, brandList, categoryTree } from '@/api/product/base/index';
+import { BaseVO, BaseQuery, BaseForm } from '@/api/product/base/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { categoryTreeVO } from '@/api/product/category/types';
 import { useRouter, useRoute } from 'vue-router';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 4 - 4
src/views/product/base/shelfReview.vue

@@ -217,10 +217,10 @@
 </template>
 
 <script setup name="ShelfReview" lang="ts">
-import { listBase, getBase, shelfReview, brandList, categoryTree } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery, BaseForm } from '@/api/pmsProduct/base/types';
-import { BrandVO } from '@/api/pmsProduct/brand/types';
-import { categoryTreeVO } from '@/api/pmsProduct/category/types';
+import { listBase, getBase, shelfReview, brandList, categoryTree } from '@/api/product/base/index';
+import { BaseVO, BaseQuery, BaseForm } from '@/api/product/base/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { categoryTreeVO } from '@/api/product/category/types';
 import { useRouter, useRoute } from 'vue-router';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 2 - 2
src/views/product/blacklist/index.vue

@@ -92,8 +92,8 @@
 </template>
 
 <script setup name="Blacklist" lang="ts">
-import { listBlacklist, getBlacklist, delBlacklist, addBlacklist, updateBlacklist } from '@/api/pmsProduct/blacklist';
-import { BlacklistVO, BlacklistQuery, BlacklistForm } from '@/api/pmsProduct/blacklist/types';
+import { listBlacklist, getBlacklist, delBlacklist, addBlacklist, updateBlacklist } from '@/api/product/blacklist';
+import { BlacklistVO, BlacklistQuery, BlacklistForm } from '@/api/product/blacklist/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 9 - 9
src/views/product/brand/edit.vue

@@ -32,12 +32,12 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="品牌推荐系数" prop="recommendValue">
-              <el-input-number 
-                v-model="form.recommendValue" 
-                :min="0" 
-                :max="9999" 
-                controls-position="right" 
-                style="width: 100%" 
+              <el-input-number
+                v-model="form.recommendValue"
+                :min="0"
+                :max="9999"
+                controls-position="right"
+                style="width: 100%"
                 placeholder="请输入推荐系数"
               />
             </el-form-item>
@@ -88,7 +88,7 @@
         </el-row>
 
         <el-form-item label="到期时间" prop="expireTime">
-          <el-date-picker 
+          <el-date-picker
             v-model="form.expireTime"
             type="datetime"
             value-format="YYYY-MM-DD HH:mm:ss"
@@ -129,8 +129,8 @@
 </template>
 
 <script setup lang="ts" name="BrandEdit">
-import { getBrand, addBrand, updateBrand } from '@/api/pmsProduct/brand';
-import { BrandForm } from '@/api/pmsProduct/brand/types';
+import { getBrand, addBrand, updateBrand } from '@/api/product/brand';
+import { BrandForm } from '@/api/product/brand/types';
 
 const route = useRoute();
 const router = useRouter();

+ 2 - 2
src/views/product/brand/index.vue

@@ -142,8 +142,8 @@
 </template>
 
 <script setup name="Brand" lang="ts">
-import { listBrand, getBrand, delBrand, addBrand, updateBrand } from '@/api/pmsProduct/brand';
-import { BrandVO, BrandQuery, BrandForm } from '@/api/pmsProduct/brand/types';
+import { listBrand, getBrand, delBrand, addBrand, updateBrand } from '@/api/product/brand';
+import { BrandVO, BrandQuery, BrandForm } from '@/api/product/brand/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const router = useRouter();

+ 3 - 3
src/views/product/category/index.vue

@@ -46,7 +46,7 @@
         <el-table-column prop="sort" align="center" label="排序" width="150"></el-table-column>
         <el-table-column prop="platform" align="center" label="平台" width="150">
           <template #default="scope">
-            <span>{{ scope.row.platform === 1 ? '工业品' : scope.row.platform === 0 ? 'PC端' : '未知' }}</span>
+            <span>{{ scope.row.platform === 0 ? '工业品' : scope.row.platform === 1 ? 'PC端' : '未知' }}</span>
           </template>
         </el-table-column>
         <el-table-column prop="isShow" align="center" label="是否提示" width="150">
@@ -162,10 +162,10 @@
 </template>
 
 <script setup name="Category" lang="ts">
-import { listCategory, getCategory, delCategory, addCategory, updateCategory, listCategoryExcludeChild, setCategoryReviewer } from '@/api/pmsProduct/category';
+import { listCategory, getCategory, delCategory, addCategory, updateCategory, listCategoryExcludeChild, setCategoryReviewer } from '@/api/product/category';
 import UserSelect from '@/components/UserSelect/index.vue';
 import { UserVO } from '@/api/system/user/types';
-import { CategoryVO, CategoryQuery, CategoryForm } from '@/api/pmsProduct/category/types';
+import { CategoryVO, CategoryQuery, CategoryForm } from '@/api/product/category/types';
 
 interface CategoryOptionsType {
   id: number | string;

+ 2 - 2
src/views/product/classification/index.vue

@@ -92,8 +92,8 @@
 </template>
 
 <script setup name="Classification" lang="ts">
-import { listClassification, getClassification, delClassification, addClassification, updateClassification } from '@/api/pmsProduct/classification';
-import { ClassificationVO, ClassificationQuery, ClassificationForm } from '@/api/pmsProduct/classification/types';
+import { listClassification, getClassification, delClassification, addClassification, updateClassification } from '@/api/product/classification';
+import { ClassificationVO, ClassificationQuery, ClassificationForm } from '@/api/product/classification/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/customization/index.vue

@@ -127,8 +127,8 @@
 </template>
 
 <script setup name="Customization" lang="ts">
-import { listCustomization, getCustomization, delCustomization, addCustomization, updateCustomization } from '@/api/pmsProduct/customization';
-import { CustomizationVO, CustomizationQuery, CustomizationForm } from '@/api/pmsProduct/customization/types';
+import { listCustomization, getCustomization, delCustomization, addCustomization, updateCustomization } from '@/api/product/customization';
+import { CustomizationVO, CustomizationQuery, CustomizationForm } from '@/api/product/customization/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/ensure/index.vue

@@ -85,8 +85,8 @@
 </template>
 
 <script setup name="Ensure" lang="ts">
-import { listEnsure, getEnsure, delEnsure, addEnsure, updateEnsure } from '@/api/pmsProduct/ensure';
-import { EnsureVO, EnsureQuery, EnsureForm } from '@/api/pmsProduct/ensure/types';
+import { listEnsure, getEnsure, delEnsure, addEnsure, updateEnsure } from '@/api/product/ensure';
+import { EnsureVO, EnsureQuery, EnsureForm } from '@/api/product/ensure/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/extend/index.vue

@@ -346,8 +346,8 @@
 </template>
 
 <script setup name="Extend" lang="ts">
-import { listExtend, getExtend, delExtend, addExtend, updateExtend } from '@/api/pmsProduct/extend';
-import { ExtendVO, ExtendQuery, ExtendForm } from '@/api/pmsProduct/extend/types';
+import { listExtend, getExtend, delExtend, addExtend, updateExtend } from '@/api/product/extend';
+import { ExtendVO, ExtendQuery, ExtendForm } from '@/api/product/extend/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/lable/index.vue

@@ -71,8 +71,8 @@
 </template>
 
 <script setup name="Lable" lang="ts">
-import { listLable, getLable, delLable, addLable, updateLable } from '@/api/pmsProduct/lable';
-import { LableVO, LableQuery, LableForm } from '@/api/pmsProduct/lable/types';
+import { listLable, getLable, delLable, addLable, updateLable } from '@/api/product/lable';
+import { LableVO, LableQuery, LableForm } from '@/api/product/lable/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 10 - 10
src/views/product/pool/index.vue

@@ -21,7 +21,7 @@
 
 
       <el-table v-loading="loading" border :data="poolList">
-        
+
         <el-table-column label="分类商品池名称" align="center" prop="name" />
         <el-table-column label="产品池类型" align="center" prop="type">
           <template #default="scope">
@@ -62,18 +62,18 @@
           </el-select>
         </el-form-item>
         <el-form-item label="状态:" prop="isShow">
-          <el-switch 
-            v-model="form.isShow" 
-            active-value="1" 
+          <el-switch
+            v-model="form.isShow"
+            active-value="1"
             inactive-value="0"
             active-text="启用"
           />
         </el-form-item>
         <el-form-item label="描述:" prop="remark">
-          <el-input 
-            v-model="form.remark" 
-            type="textarea" 
-            placeholder="请输入内容" 
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            placeholder="请输入内容"
             maxlength="200"
             show-word-limit
             :rows="4"
@@ -91,8 +91,8 @@
 </template>
 
 <script setup name="Pool" lang="ts">
-import { listPool, getPool, delPool, addPool, updatePool } from '@/api/pmsProduct/pool';
-import { PoolVO, PoolQuery, PoolForm } from '@/api/pmsProduct/pool/types';
+import { listPool, getPool, delPool, addPool, updatePool } from '@/api/product/pool';
+import { PoolVO, PoolQuery, PoolForm } from '@/api/product/pool/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/pool/review.vue

@@ -131,8 +131,8 @@
 </template>
 
 <script setup name="PoolReview" lang="ts">
-import { listPool, getPool, updatePool } from '@/api/pmsProduct/pool';
-import { PoolVO, PoolQuery, PoolReviewForm } from '@/api/pmsProduct/pool/types';
+import { listPool, getPool, updatePool } from '@/api/product/pool';
+import { PoolVO, PoolQuery, PoolReviewForm } from '@/api/product/pool/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/pool/review1.vue

@@ -157,8 +157,8 @@
 </template>
 
 <script setup name="PoolReviewDetail" lang="ts">
-import { listPoolLink } from '@/api/pmsProduct/poolLink';
-import { PoolLinkVO, PoolLinkQuery } from '@/api/pmsProduct/poolLink/types';
+import { listPoolLink } from '@/api/product/poolLink';
+import { PoolLinkVO, PoolLinkQuery } from '@/api/product/poolLink/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 5 - 5
src/views/product/pool/reviewDetail.vue

@@ -368,10 +368,10 @@
 
 <script setup name="PoolLink" lang="ts">
 import { useRouter, useRoute } from 'vue-router';
-import { categoryTree, listBase } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery } from '@/api/pmsProduct/base/types';
-import { listPoolLink, batchAddProducts, BatchAddProductData, batchReview, reSubmit, editPrice, editStock, PoolLinkForm } from '@/api/pmsProduct/poolLink';
-import { PoolLinkQuery, PoolLinkVO } from '@/api/pmsProduct/poolLink/types';
+import { categoryTree, listBase } from '@/api/product/base/index';
+import { BaseVO, BaseQuery } from '@/api/product/base/types';
+import { listPoolLink, batchAddProducts, BatchAddProductData, batchReview, reSubmit, editPrice, editStock, PoolLinkForm } from '@/api/product/poolLink';
+import { PoolLinkQuery, PoolLinkVO } from '@/api/product/poolLink/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const router = useRouter();
@@ -750,7 +750,7 @@ const handleBatchRemove = async () => {
   await proxy?.$modal.confirm(`确认要移出选中的 ${selectedPoolLinks.value.length} 个商品吗?`);
   const ids = selectedPoolLinks.value.map(item => item.id);
   // 调用删除接口
-  const { delPoolLink } = await import('@/api/pmsProduct/poolLink');
+  const { delPoolLink } = await import('@/api/product/poolLink');
   await delPoolLink(ids);
   proxy?.$modal.msgSuccess('移出成功');
   await getList();

+ 4 - 4
src/views/product/poolLink/index.vue

@@ -333,10 +333,10 @@
 
 <script setup name="PoolLink" lang="ts">
 import { useRouter, useRoute } from 'vue-router';
-import { categoryTree, listBase } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery } from '@/api/pmsProduct/base/types';
-import { listPoolLink, batchAddProducts, BatchAddProductData, editPrice, editStock, delPoolLink, PoolLinkForm } from '@/api/pmsProduct/poolLink';
-import { PoolLinkQuery, PoolLinkVO } from '@/api/pmsProduct/poolLink/types';
+import { categoryTree, listBase } from '@/api/product/base/index';
+import { BaseVO, BaseQuery } from '@/api/product/base/types';
+import { listPoolLink, batchAddProducts, BatchAddProductData, editPrice, editStock, delPoolLink, PoolLinkForm } from '@/api/product/poolLink';
+import { PoolLinkQuery, PoolLinkVO } from '@/api/product/poolLink/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const router = useRouter();

+ 5 - 5
src/views/product/poolLink/index1.vue

@@ -368,10 +368,10 @@
 
 <script setup name="PoolLink" lang="ts">
 import { useRouter, useRoute } from 'vue-router';
-import { categoryTree, listBase } from '@/api/pmsProduct/base';
-import { BaseVO, BaseQuery } from '@/api/pmsProduct/base/types';
-import { listPoolLink, batchAddProducts, BatchAddProductData, batchReview, reSubmit, editPrice, editStock, PoolLinkForm } from '@/api/pmsProduct/poolLink';
-import { PoolLinkQuery, PoolLinkVO } from '@/api/pmsProduct/poolLink/types';
+import { categoryTree, listBase } from '@/api/product/base/index';
+import { BaseVO, BaseQuery } from '@/api/product/base/types';
+import { listPoolLink, batchAddProducts, BatchAddProductData, batchReview, reSubmit, editPrice, editStock, PoolLinkForm } from '@/api/product/poolLink';
+import { PoolLinkQuery, PoolLinkVO } from '@/api/product/poolLink/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const router = useRouter();
@@ -750,7 +750,7 @@ const handleBatchRemove = async () => {
   await proxy?.$modal.confirm(`确认要移出选中的 ${selectedPoolLinks.value.length} 个商品吗?`);
   const ids = selectedPoolLinks.value.map(item => item.id);
   // 调用删除接口
-  const { delPoolLink } = await import('@/api/pmsProduct/poolLink');
+  const { delPoolLink } = await import('@/api/product/poolLink');
   await delPoolLink(ids);
   proxy?.$modal.msgSuccess('移出成功');
   await getList();

+ 2 - 2
src/views/product/priceInventory/index.vue

@@ -148,8 +148,8 @@
 </template>
 
 <script setup name="PriceInventory" lang="ts">
-import { listPriceInventory, getPriceInventory, delPriceInventory, addPriceInventory, updatePriceInventory } from '@/api/pmsProduct/priceInventory';
-import { PriceInventoryVO, PriceInventoryQuery, PriceInventoryForm } from '@/api/pmsProduct/priceInventory/types';
+import { listPriceInventory, getPriceInventory, delPriceInventory, addPriceInventory, updatePriceInventory } from '@/api/product/priceInventory';
+import { PriceInventoryVO, PriceInventoryQuery, PriceInventoryForm } from '@/api/product/priceInventory/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/unit/index.vue

@@ -99,8 +99,8 @@
 </template>
 
 <script setup name="Unit" lang="ts">
-import { listUnit, getUnit, delUnit, addUnit, updateUnit } from '@/api/pmsProduct/unit';
-import { UnitVO, UnitQuery, UnitForm } from '@/api/pmsProduct/unit/types';
+import { listUnit, getUnit, delUnit, addUnit, updateUnit } from '@/api/product/unit';
+import { UnitVO, UnitQuery, UnitForm } from '@/api/product/unit/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/volumeUnit/index.vue

@@ -85,8 +85,8 @@
 </template>
 
 <script setup name="VolumeUnit" lang="ts">
-import { listVolumeUnit, getVolumeUnit, delVolumeUnit, addVolumeUnit, updateVolumeUnit } from '@/api/pmsProduct/volumeUnit';
-import { VolumeUnitVO, VolumeUnitQuery, VolumeUnitForm } from '@/api/pmsProduct/volumeUnit/types';
+import { listVolumeUnit, getVolumeUnit, delVolumeUnit, addVolumeUnit, updateVolumeUnit } from '@/api/product/volumeUnit';
+import { VolumeUnitVO, VolumeUnitQuery, VolumeUnitForm } from '@/api/product/volumeUnit/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 2 - 2
src/views/product/weightUnit/index.vue

@@ -85,8 +85,8 @@
 </template>
 
 <script setup name="WeightUnit" lang="ts">
-import { listWeightUnit, getWeightUnit, delWeightUnit, addWeightUnit, updateWeightUnit } from '@/api/pmsProduct/weightUnit';
-import { WeightUnitVO, WeightUnitQuery, WeightUnitForm } from '@/api/pmsProduct/weightUnit/types';
+import { listWeightUnit, getWeightUnit, delWeightUnit, addWeightUnit, updateWeightUnit } from '@/api/product/weightUnit';
+import { WeightUnitVO, WeightUnitQuery, WeightUnitForm } from '@/api/product/weightUnit/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;