hurx 5 mesiacov pred
rodič
commit
79ac641f41
47 zmenil súbory, kde vykonal 9379 pridanie a 4 odobranie
  1. 75 0
      src/api/company/bank/index.ts
  2. 155 0
      src/api/company/bank/types.ts
  3. 75 0
      src/api/company/comDept/index.ts
  4. 255 0
      src/api/company/comDept/types.ts
  5. 75 0
      src/api/company/comPost/index.ts
  6. 95 0
      src/api/company/comPost/types.ts
  7. 75 0
      src/api/company/comStaff/index.ts
  8. 215 0
      src/api/company/comStaff/types.ts
  9. 75 0
      src/api/company/company/index.ts
  10. 410 0
      src/api/company/company/types.ts
  11. 63 0
      src/api/company/logisticsCompany/index.ts
  12. 116 0
      src/api/company/logisticsCompany/types.ts
  13. 75 0
      src/api/company/warehouse/index.ts
  14. 380 0
      src/api/company/warehouse/types.ts
  15. 63 0
      src/api/customer/customerFile/customerDept/index.ts
  16. 325 0
      src/api/customer/customerFile/customerDept/types.ts
  17. 122 0
      src/api/customer/customerFile/customerInfo/index.ts
  18. 452 0
      src/api/customer/customerFile/customerInfo/types.ts
  19. 80 0
      src/api/customer/customerFile/shippingAddress/index.ts
  20. 290 0
      src/api/customer/customerFile/shippingAddress/types.ts
  21. 75 0
      src/api/customer/invoiceType/index.ts
  22. 95 0
      src/api/customer/invoiceType/types.ts
  23. 63 0
      src/api/order/orderMain/index.ts
  24. 721 0
      src/api/order/orderMain/types.ts
  25. 63 0
      src/api/order/orderProduct/index.ts
  26. 369 0
      src/api/order/orderProduct/types.ts
  27. 63 0
      src/api/product/afterSales/index.ts
  28. 65 0
      src/api/product/afterSales/types.ts
  29. 63 0
      src/api/product/attributes/index.ts
  30. 160 0
      src/api/product/attributes/types.ts
  31. 156 0
      src/api/product/base/index.ts
  32. 674 0
      src/api/product/base/types.ts
  33. 63 0
      src/api/product/brand/index.ts
  34. 309 0
      src/api/product/brand/types.ts
  35. 74 0
      src/api/product/category/index.ts
  36. 392 0
      src/api/product/category/types.ts
  37. 63 0
      src/api/product/ensure/index.ts
  38. 65 0
      src/api/product/ensure/types.ts
  39. 63 0
      src/api/product/unit/index.ts
  40. 95 0
      src/api/product/unit/types.ts
  41. 4 4
      src/views/login.vue
  42. 169 0
      src/views/order/orderMain/components/addressDialog.vue
  43. 131 0
      src/views/order/orderMain/components/chooseAddress.vue
  44. 202 0
      src/views/order/orderMain/components/chooseProduct.vue
  45. 904 0
      src/views/order/orderMain/index.vue
  46. 354 0
      src/views/order/saleOrder/index.vue
  47. 453 0
      src/views/order/saleOrder/sendDetail.vue

+ 75 - 0
src/api/company/bank/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BankVO, BankForm, BankQuery } from '@/api/company/bank/types';
+
+/**
+ * 查询银行信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBank = (query?: BankQuery): AxiosPromise<BankVO[]> => {
+  return request({
+    url: '/system/bank/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询银行信息详细
+ * @param id
+ */
+export const getBank = (id: string | number): AxiosPromise<BankVO> => {
+  return request({
+    url: '/system/bank/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增银行信息
+ * @param data
+ */
+export const addBank = (data: BankForm) => {
+  return request({
+    url: '/system/bank',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改银行信息
+ * @param data
+ */
+export const updateBank = (data: BankForm) => {
+  return request({
+    url: '/system/bank',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除银行信息
+ * @param id
+ */
+export const delBank = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/bank/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeShowStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/bank/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 155 - 0
src/api/company/bank/types.ts

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

+ 75 - 0
src/api/company/comDept/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComDeptVO, ComDeptForm, ComDeptQuery } from '@/api/company/comDept/types';
+
+/**
+ * 查询企业部门列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listComDept = (query?: ComDeptQuery): AxiosPromise<ComDeptVO[]> => {
+  return request({
+    url: '/system/comDept/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询企业部门详细
+ * @param id
+ */
+export const getComDept = (id: string | number): AxiosPromise<ComDeptVO> => {
+  return request({
+    url: '/system/comDept/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增企业部门
+ * @param data
+ */
+export const addComDept = (data: ComDeptForm) => {
+  return request({
+    url: '/system/comDept',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改企业部门
+ * @param data
+ */
+export const updateComDept = (data: ComDeptForm) => {
+  return request({
+    url: '/system/comDept',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除企业部门
+ * @param id
+ */
+export const delComDept = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/comDept/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, status: string) {
+  const data = {
+    id,
+    status
+  };
+  return request({
+    url: '/system/comDept/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 255 - 0
src/api/company/comDept/types.ts

@@ -0,0 +1,255 @@
+export interface ComDeptVO {
+  /**
+   * 部门ID
+   */
+  id: string | number;
+
+  /**
+   * 部门编码
+   */
+  deptCode: string;
+
+  /**
+   * 企业ID
+   */
+  companyId: string | number;
+
+  /**
+   * 部门名称
+   */
+  deptName: string;
+
+  /**
+   * 父部门ID
+   */
+  parentId: string | number;
+
+  /**
+   * 祖级部门ID路径
+   */
+  ancestors: string;
+
+  /**
+   * 部门类别
+   */
+  deptCategory: string;
+
+  /**
+   * 部门层级深度
+   */
+  level: number;
+
+  /**
+   * 负责人用户ID
+   */
+  leader: number;
+
+  /**
+   * 联系电话
+   */
+  phone: string;
+
+  /**
+   * 邮箱
+   */
+  email: string;
+
+  /**
+   * 生效日期
+   */
+  validFrom: string | number;
+
+  /**
+   * 失效日期
+   */
+  validTo: string | number;
+
+  /**
+   * 部门状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 显示顺序
+   */
+  orderNum: number;
+
+  /**
+   * 子对象
+   */
+  children: ComDeptVO[];
+}
+
+export interface ComDeptForm extends BaseEntity {
+  /**
+   * 部门ID
+   */
+  id?: string | number;
+
+  /**
+   * 部门编码
+   */
+  deptCode?: string;
+
+  /**
+   * 企业ID
+   */
+  companyId?: string | number;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 父部门ID
+   */
+  parentId?: string | number;
+
+  /**
+   * 祖级部门ID路径
+   */
+  ancestors?: string;
+
+  /**
+   * 部门类别
+   */
+  deptCategory?: string;
+
+  /**
+   * 部门层级深度
+   */
+  level?: number;
+
+  /**
+   * 负责人用户ID
+   */
+  leader?: number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 邮箱
+   */
+  email?: string;
+
+  /**
+   * 生效日期
+   */
+  validFrom?: string | number;
+
+  /**
+   * 失效日期
+   */
+  validTo?: string | number;
+
+  /**
+   * 部门状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 显示顺序
+   */
+  orderNum?: number;
+}
+
+export interface ComDeptQuery {
+  /**
+   * 部门编码
+   */
+  deptCode?: string;
+
+  /**
+   * 企业ID
+   */
+  companyId?: string | number;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 父部门ID
+   */
+  parentId?: string | number;
+
+  /**
+   * 祖级部门ID路径
+   */
+  ancestors?: string;
+
+  /**
+   * 部门类别
+   */
+  deptCategory?: string;
+
+  /**
+   * 部门层级深度
+   */
+  level?: number;
+
+  /**
+   * 负责人用户ID
+   */
+  leader?: number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 邮箱
+   */
+  email?: string;
+
+  /**
+   * 生效日期
+   */
+  validFrom?: string | number;
+
+  /**
+   * 失效日期
+   */
+  validTo?: string | number;
+
+  /**
+   * 部门状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 显示顺序
+   */
+  orderNum?: number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 75 - 0
src/api/company/comPost/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComPostVO, ComPostForm, ComPostQuery } from '@/api/company/comPost/types';
+
+/**
+ * 查询岗位信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listComPost = (query?: ComPostQuery): AxiosPromise<ComPostVO[]> => {
+  return request({
+    url: '/system/comPost/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询岗位信息详细
+ * @param postId
+ */
+export const getComPost = (postId: string | number): AxiosPromise<ComPostVO> => {
+  return request({
+    url: '/system/comPost/' + postId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增岗位信息
+ * @param data
+ */
+export const addComPost = (data: ComPostForm) => {
+  return request({
+    url: '/system/comPost',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改岗位信息
+ * @param data
+ */
+export const updateComPost = (data: ComPostForm) => {
+  return request({
+    url: '/system/comPost',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除岗位信息
+ * @param postId
+ */
+export const delComPost = (postId: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/comPost/' + postId,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, status: string) {
+  const data = {
+    id,
+    status
+  };
+  return request({
+    url: '/system/comPost/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 95 - 0
src/api/company/comPost/types.ts

@@ -0,0 +1,95 @@
+export interface ComPostVO {
+  /**
+   * 岗位ID
+   */
+  postId: string | number;
+
+  /**
+   * 岗位编码
+   */
+  postCode: string;
+
+  /**
+   * 岗位名称
+   */
+  postName: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ComPostForm extends BaseEntity {
+  /**
+   * 岗位ID
+   */
+  postId?: string | number;
+
+  /**
+   * 岗位编码
+   */
+  postCode?: string;
+
+  /**
+   * 岗位名称
+   */
+  postName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ComPostQuery extends PageQuery {
+  /**
+   * 岗位编码
+   */
+  postCode?: string;
+
+  /**
+   * 岗位名称
+   */
+  postName?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComStaffVO, ComStaffForm, ComStaffQuery } from '@/api/company/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/company/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;
+}

+ 75 - 0
src/api/company/company/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CompanyVO, CompanyForm, CompanyQuery } from '@/api/company/company/types';
+
+/**
+ * 查询公司信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCompany = (query?: CompanyQuery): AxiosPromise<CompanyVO[]> => {
+  return request({
+    url: '/system/company/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询公司信息详细
+ * @param id
+ */
+export const getCompany = (id: string | number): AxiosPromise<CompanyVO> => {
+  return request({
+    url: '/system/company/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增公司信息
+ * @param data
+ */
+export const addCompany = (data: CompanyForm) => {
+  return request({
+    url: '/system/company',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改公司信息
+ * @param data
+ */
+export const updateCompany = (data: CompanyForm) => {
+  return request({
+    url: '/system/company',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除公司信息
+ * @param id
+ */
+export const delCompany = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/company/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeShowStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/bank/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 410 - 0
src/api/company/company/types.ts

@@ -0,0 +1,410 @@
+export interface CompanyVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 会计主体ID
+   */
+  accBnId: string | number;
+
+  /**
+   * 会计主体编号
+   */
+  accBnNo: string;
+
+  /**
+   * 公司地址
+   */
+  address: string;
+
+  /**
+   * 经营开始日期
+   */
+  begData: string;
+
+  /**
+   * 经营范围
+   */
+  busScp: string;
+
+  /**
+   * 注册资本金额
+   */
+  capAmt: number;
+
+  /**
+   * 公司全名
+   */
+  companyFullName: string;
+
+  /**
+   * 法人代表
+   */
+  corporation: string;
+
+  /**
+   * 电子邮箱
+   */
+  email: string;
+
+  /**
+   * 经营结束日期
+   */
+  endData: string;
+
+  /**
+   * 成立日期
+   */
+  foundDa: string;
+
+  /**
+   * 内部客户ID
+   */
+  inCustId: string | number;
+
+  /**
+   * 内部供应商ID
+   */
+  inSupId: string | number;
+
+  /**
+   * 法律代表人
+   */
+  lelPer: string;
+
+  /**
+   * 联系电话
+   */
+  phone: string;
+
+  /**
+   * 负责人/经办人
+   */
+  principal: string;
+
+  /**
+   * 注册地址
+   */
+  regAddr: string;
+
+  /**
+   * 注册日期
+   */
+  regData: string;
+
+  /**
+   * 注册机关
+   */
+  regOrg: string;
+
+  /**
+   * 税务登记号
+   */
+  taxNo: string;
+
+  /**
+   * 公司编号
+   */
+  companyCode: string;
+
+  /**
+   * 公司名称
+   */
+  companyName: string;
+
+  /**
+   * 是否显示(0-是,1-否)
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface CompanyForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 会计主体ID
+   */
+  accBnId?: string | number;
+
+  /**
+   * 会计主体编号
+   */
+  accBnNo?: string;
+
+  /**
+   * 公司地址
+   */
+  address?: string;
+
+  /**
+   * 经营开始日期
+   */
+  begData?: string;
+
+  /**
+   * 经营范围
+   */
+  busScp?: string;
+
+  /**
+   * 注册资本金额
+   */
+  capAmt?: number;
+
+  /**
+   * 公司全名
+   */
+  companyFullName?: string;
+
+  /**
+   * 法人代表
+   */
+  corporation?: string;
+
+  /**
+   * 电子邮箱
+   */
+  email?: string;
+
+  /**
+   * 经营结束日期
+   */
+  endData?: string;
+
+  /**
+   * 成立日期
+   */
+  foundDa?: string;
+
+  /**
+   * 内部客户ID
+   */
+  inCustId?: string | number;
+
+  /**
+   * 内部供应商ID
+   */
+  inSupId?: string | number;
+
+  /**
+   * 法律代表人
+   */
+  lelPer?: string;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 负责人/经办人
+   */
+  principal?: string;
+
+  /**
+   * 注册地址
+   */
+  regAddr?: string;
+
+  /**
+   * 注册日期
+   */
+  regData?: string;
+
+  /**
+   * 注册机关
+   */
+  regOrg?: string;
+
+  /**
+   * 税务登记号
+   */
+  taxNo?: string;
+
+  /**
+   * 公司编号
+   */
+  companyCode?: string;
+
+  /**
+   * 公司名称
+   */
+  companyName?: string;
+
+  /**
+   * 是否显示(0-是,1-否)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface CompanyQuery extends PageQuery {
+  /**
+   * 会计主体ID
+   */
+  accBnId?: string | number;
+
+  /**
+   * 会计主体编号
+   */
+  accBnNo?: string;
+
+  /**
+   * 公司地址
+   */
+  address?: string;
+
+  /**
+   * 经营开始日期
+   */
+  begData?: string;
+
+  /**
+   * 经营范围
+   */
+  busScp?: string;
+
+  /**
+   * 注册资本金额
+   */
+  capAmt?: number;
+
+  /**
+   * 公司全名
+   */
+  companyFullName?: string;
+
+  /**
+   * 法人代表
+   */
+  corporation?: string;
+
+  /**
+   * 电子邮箱
+   */
+  email?: string;
+
+  /**
+   * 经营结束日期
+   */
+  endData?: string;
+
+  /**
+   * 成立日期
+   */
+  foundDa?: string;
+
+  /**
+   * 内部客户ID
+   */
+  inCustId?: string | number;
+
+  /**
+   * 内部供应商ID
+   */
+  inSupId?: string | number;
+
+  /**
+   * 法律代表人
+   */
+  lelPer?: string;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 负责人/经办人
+   */
+  principal?: string;
+
+  /**
+   * 注册地址
+   */
+  regAddr?: string;
+
+  /**
+   * 注册日期
+   */
+  regData?: string;
+
+  /**
+   * 注册机关
+   */
+  regOrg?: string;
+
+  /**
+   * 税务登记号
+   */
+  taxNo?: string;
+
+  /**
+   * 公司编号
+   */
+  companyCode?: string;
+
+  /**
+   * 公司名称
+   */
+  companyName?: string;
+
+  /**
+   * 是否显示(0-是,1-否)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 63 - 0
src/api/company/logisticsCompany/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { LogisticsCompanyVO, LogisticsCompanyForm, LogisticsCompanyQuery } from '@/api/system/logisticsCompany/types';
+
+/**
+ * 查询物流公司列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listLogisticsCompany = (query?: LogisticsCompanyQuery): AxiosPromise<LogisticsCompanyVO[]> => {
+  return request({
+    url: '/system/logisticsCompany/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询物流公司详细
+ * @param id
+ */
+export const getLogisticsCompany = (id: string | number): AxiosPromise<LogisticsCompanyVO> => {
+  return request({
+    url: '/system/logisticsCompany/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增物流公司
+ * @param data
+ */
+export const addLogisticsCompany = (data: LogisticsCompanyForm) => {
+  return request({
+    url: '/system/logisticsCompany',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改物流公司
+ * @param data
+ */
+export const updateLogisticsCompany = (data: LogisticsCompanyForm) => {
+  return request({
+    url: '/system/logisticsCompany',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除物流公司
+ * @param id
+ */
+export const delLogisticsCompany = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/logisticsCompany/' + id,
+    method: 'delete'
+  });
+};

+ 116 - 0
src/api/company/logisticsCompany/types.ts

@@ -0,0 +1,116 @@
+export interface LogisticsCompanyVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 物流公司编码
+   */
+  logisticsCode: string;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName: string;
+
+  /**
+   * 物流公司描述
+   */
+  logisticsDescription: string;
+
+  /**
+   * 是否显示
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface LogisticsCompanyForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 物流公司编码
+   */
+  logisticsCode?: string;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName?: string;
+
+  /**
+   * 物流公司描述
+   */
+  logisticsDescription?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface LogisticsCompanyQuery extends PageQuery {
+
+  /**
+   * 物流公司编码
+   */
+  logisticsCode?: string;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName?: string;
+
+  /**
+   * 物流公司描述
+   */
+  logisticsDescription?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 75 - 0
src/api/company/warehouse/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { WarehouseVO, WarehouseForm, WarehouseQuery } from '@/api/company/warehouse/types';
+
+/**
+ * 查询仓库信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listWarehouse = (query?: WarehouseQuery): AxiosPromise<WarehouseVO[]> => {
+  return request({
+    url: '/system/warehouse/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询仓库信息详细
+ * @param id
+ */
+export const getWarehouse = (id: string | number): AxiosPromise<WarehouseVO> => {
+  return request({
+    url: '/system/warehouse/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增仓库信息
+ * @param data
+ */
+export const addWarehouse = (data: WarehouseForm) => {
+  return request({
+    url: '/system/warehouse',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改仓库信息
+ * @param data
+ */
+export const updateWarehouse = (data: WarehouseForm) => {
+  return request({
+    url: '/system/warehouse',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除仓库信息
+ * @param id
+ */
+export const delWarehouse = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/warehouse/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/warehouse/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 380 - 0
src/api/company/warehouse/types.ts

@@ -0,0 +1,380 @@
+export interface WarehouseVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 仓库编码
+   */
+  warehouseCode: string;
+
+  /**
+   * 仓库名称
+   */
+  warehouseName: string;
+
+  /**
+   * 库存状态
+   */
+  stkStu: string;
+
+  /**
+   * 所属公司
+   */
+  companyId: string | number;
+
+  /**
+   * 省份
+   */
+  province: string;
+
+  /**
+   * 城市
+   */
+  city: string;
+
+  /**
+   * 区/县
+   */
+  district: string;
+
+  /**
+   * 省市区
+   */
+  provinceCityDistrict: string;
+
+  /**
+   * 仓库类型
+   */
+  warehouseType: string;
+
+  /**
+   * 仓库功能
+   */
+  warehouseFunction: string;
+
+  /**
+   * 是否支持发货
+   */
+  isShip: string;
+
+  /**
+   * 是否支持退货
+   */
+  isReturn: string;
+
+  /**
+   * 是否默认仓库
+   */
+  isDefault: string;
+
+  /**
+   * 是否前台展示
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 联系人姓名
+   */
+  contacts: string;
+
+  /**
+   * 手机号
+   */
+  mobile: string;
+
+  /**
+   * 固定电话
+   */
+  phone: string;
+
+  /**
+   * 详细地址
+   */
+  address: string;
+
+  /**
+   * 邮政编码
+   */
+  zipCode: string;
+
+  /**
+   * 最大配送时效(天)
+   */
+  maxLeadTime: number;
+
+  /**
+   * 最小配送时效(天)
+   */
+  minLeadTime: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface WarehouseForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 仓库编码
+   */
+  warehouseCode?: string;
+
+  /**
+   * 仓库名称
+   */
+  warehouseName?: string;
+
+  /**
+   * 库存状态
+   */
+  stkStu?: string;
+
+  /**
+   * 所属公司
+   */
+  companyId?: string | number;
+
+  /**
+   * 省份
+   */
+  province?: string;
+
+  /**
+   * 城市
+   */
+  city?: string;
+
+  /**
+   * 区/县
+   */
+  district?: string;
+
+  /**
+   * 省市区
+   */
+  provinceCityDistrict?: string;
+
+  /**
+   * 仓库类型
+   */
+  warehouseType?: string;
+
+  /**
+   * 仓库功能
+   */
+  warehouseFunction?: string;
+
+  /**
+   * 是否支持发货
+   */
+  isShip?: string;
+
+  /**
+   * 是否支持退货
+   */
+  isReturn?: string;
+
+  /**
+   * 是否默认仓库
+   */
+  isDefault?: string;
+
+  /**
+   * 是否前台展示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 联系人姓名
+   */
+  contacts?: string;
+
+  /**
+   * 手机号
+   */
+  mobile?: string;
+
+  /**
+   * 固定电话
+   */
+  phone?: string;
+
+  /**
+   * 详细地址
+   */
+  address?: string;
+
+  /**
+   * 邮政编码
+   */
+  zipCode?: string;
+
+  /**
+   * 最大配送时效(天)
+   */
+  maxLeadTime?: number;
+
+  /**
+   * 最小配送时效(天)
+   */
+  minLeadTime?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface WarehouseQuery extends PageQuery {
+  /**
+   * 仓库编码
+   */
+  warehouseCode?: string;
+
+  /**
+   * 仓库名称
+   */
+  warehouseName?: string;
+
+  /**
+   * 库存状态
+   */
+  stkStu?: string;
+
+  /**
+   * 所属公司
+   */
+  companyId?: string | number;
+
+  /**
+   * 省份
+   */
+  province?: string;
+
+  /**
+   * 城市
+   */
+  city?: string;
+
+  /**
+   * 区/县
+   */
+  district?: string;
+
+  /**
+   * 省市区
+   */
+  provinceCityDistrict?: string;
+
+  /**
+   * 仓库类型
+   */
+  warehouseType?: string;
+
+  /**
+   * 仓库功能
+   */
+  warehouseFunction?: string;
+
+  /**
+   * 是否支持发货
+   */
+  isShip?: string;
+
+  /**
+   * 是否支持退货
+   */
+  isReturn?: string;
+
+  /**
+   * 是否默认仓库
+   */
+  isDefault?: string;
+
+  /**
+   * 是否前台展示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 联系人姓名
+   */
+  contacts?: string;
+
+  /**
+   * 手机号
+   */
+  mobile?: string;
+
+  /**
+   * 固定电话
+   */
+  phone?: string;
+
+  /**
+   * 详细地址
+   */
+  address?: string;
+
+  /**
+   * 邮政编码
+   */
+  zipCode?: string;
+
+  /**
+   * 最大配送时效(天)
+   */
+  maxLeadTime?: number;
+
+  /**
+   * 最小配送时效(天)
+   */
+  minLeadTime?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 63 - 0
src/api/customer/customerFile/customerDept/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CustomerDeptVO, CustomerDeptForm, CustomerDeptQuery } from '@/api/customer/customerFile/customerDept/types';
+
+/**
+ * 查询客户部门信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCustomerDept = (query?: CustomerDeptQuery): AxiosPromise<CustomerDeptVO[]> => {
+  return request({
+    url: '/customer/customerDept/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户部门信息详细
+ * @param id
+ */
+export const getCustomerDept = (id: string | number): AxiosPromise<CustomerDeptVO> => {
+  return request({
+    url: '/customer/customerDept/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户部门信息
+ * @param data
+ */
+export const addCustomerDept = (data: CustomerDeptForm) => {
+  return request({
+    url: '/customer/customerDept',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户部门信息
+ * @param data
+ */
+export const updateCustomerDept = (data: CustomerDeptForm) => {
+  return request({
+    url: '/customer/customerDept',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户部门信息
+ * @param id
+ */
+export const delCustomerDept = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/customerDept/' + id,
+    method: 'delete'
+  });
+};

+ 325 - 0
src/api/customer/customerFile/customerDept/types.ts

@@ -0,0 +1,325 @@
+export interface CustomerDeptVO {
+  /**
+   * ID
+   */
+  id: string | number;
+
+  /**
+   * 部门编号
+   */
+  deptNo: string;
+
+  /**
+   * 部门名称
+   */
+  deptName: string;
+
+  /**
+   * 父部门id
+   */
+  parentId: string | number;
+
+  /**
+   * 祖级列表
+   */
+  ancestors: string;
+
+  /**
+   * 客户编号
+   */
+  customerId: string | number;
+
+  /**
+   * 部门层级(如1级、2级等)
+   */
+  departmentLevel: number;
+
+  /**
+   * 年度预算
+   */
+  yearlyBudget: number;
+
+  /**
+   * 已使用预算
+   */
+  usedBudget: number;
+
+  /**
+   * 月度限额
+   */
+  monthLimit: number;
+
+  /**
+   * 月度已用预算
+   */
+  monthUsedBudget: number;
+
+  /**
+   * 绑定状态
+   */
+  bindStatus: string;
+
+  /**
+   * 绑定地址
+   */
+  bindAddress: string;
+
+  /**
+   * 部门负责人
+   */
+  deptManage: string;
+
+  /**
+   * 是否限制预算
+   */
+  isLimit: string;
+
+  /**
+   * 所选年份
+   */
+  selectYear: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType: string;
+
+  /**
+   * 年度剩余预算
+   */
+  residueYearlyBudget: string | number;
+
+  /**
+   * 充值金额
+   */
+  recharge: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 子对象
+   */
+  children: CustomerDeptVO[];
+}
+
+export interface CustomerDeptForm extends BaseEntity {
+  /**
+   * ID
+   */
+  id?: string | number;
+
+  /**
+   * 部门编号
+   */
+  deptNo?: string;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 父部门id
+   */
+  parentId?: string | number;
+
+  /**
+   * 祖级列表
+   */
+  ancestors?: string;
+
+  /**
+   * 客户编号
+   */
+  customerId?: string | number;
+
+  /**
+   * 部门层级(如1级、2级等)
+   */
+  departmentLevel?: number;
+
+  /**
+   * 年度预算
+   */
+  yearlyBudget?: number;
+
+  /**
+   * 已使用预算
+   */
+  usedBudget?: number;
+
+  /**
+   * 月度限额
+   */
+  monthLimit?: number;
+
+  /**
+   * 月度已用预算
+   */
+  monthUsedBudget?: number;
+
+  /**
+   * 绑定状态
+   */
+  bindStatus?: string;
+
+  /**
+   * 绑定地址
+   */
+  bindAddress?: string;
+
+  /**
+   * 部门负责人
+   */
+  deptManage?: string;
+
+  /**
+   * 是否限制预算
+   */
+  isLimit?: string;
+
+  /**
+   * 所选年份
+   */
+  selectYear?: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType?: string;
+
+  /**
+   * 年度剩余预算
+   */
+  residueYearlyBudget?: string | number;
+
+  /**
+   * 充值金额
+   */
+  recharge?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface CustomerDeptQuery {
+  /**
+   * 部门编号
+   */
+  deptNo?: string;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 父部门id
+   */
+  parentId?: string | number;
+
+  /**
+   * 祖级列表
+   */
+  ancestors?: string;
+
+  /**
+   * 客户编号
+   */
+  customerId?: string | number;
+
+  /**
+   * 部门层级(如1级、2级等)
+   */
+  departmentLevel?: number;
+
+  /**
+   * 年度预算
+   */
+  yearlyBudget?: number;
+
+  /**
+   * 已使用预算
+   */
+  usedBudget?: number;
+
+  /**
+   * 月度限额
+   */
+  monthLimit?: number;
+
+  /**
+   * 月度已用预算
+   */
+  monthUsedBudget?: number;
+
+  /**
+   * 绑定状态
+   */
+  bindStatus?: string;
+
+  /**
+   * 绑定地址
+   */
+  bindAddress?: string;
+
+  /**
+   * 部门负责人
+   */
+  deptManage?: string;
+
+  /**
+   * 是否限制预算
+   */
+  isLimit?: string;
+
+  /**
+   * 所选年份
+   */
+  selectYear?: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType?: string;
+
+  /**
+   * 年度剩余预算
+   */
+  residueYearlyBudget?: string | number;
+
+  /**
+   * 充值金额
+   */
+  recharge?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 122 - 0
src/api/customer/customerFile/customerInfo/index.ts

@@ -0,0 +1,122 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CustomerInfoVO, CustomerInfoForm, CustomerInfoQuery } from '@/api/customer/customerFile/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
+  });
+};

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

@@ -0,0 +1,452 @@
+import type { BusinessInfoVO, BusinessInfoForm } from '../businessInfo/types';
+import type { CustomerContactVO, CustomerContactForm } from '../customerContact/types';
+import type { SalesInfoVO, SalesInfoForm } from '../salesInfo/types';
+import type { InvoiceInfoVO, InvoiceInfoForm } from '../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;
+}

+ 80 - 0
src/api/customer/customerFile/shippingAddress/index.ts

@@ -0,0 +1,80 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ShippingAddressVO, ShippingAddressForm, ShippingAddressQuery } from '@/api/customer/customerFile/shippingAddress/types';
+
+/**
+ * 查询客户收货地址列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listShippingAddress = (query?: ShippingAddressQuery): AxiosPromise<ShippingAddressVO[]> => {
+  return request({
+    url: '/customer/shippingAddress/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户收货地址详细
+ * @param id
+ */
+export const getShippingAddress = (id: string | number): AxiosPromise<ShippingAddressVO> => {
+  return request({
+    url: '/customer/shippingAddress/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户收货地址
+ * @param data
+ */
+export const addShippingAddress = (data: ShippingAddressForm) => {
+  return request({
+    url: '/customer/shippingAddress',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户收货地址
+ * @param data
+ */
+export const updateShippingAddress = (data: ShippingAddressForm) => {
+  return request({
+    url: '/customer/shippingAddress',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户收货地址
+ * @param id
+ */
+export const delShippingAddress = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/shippingAddress/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 设置默认地址
+ * @param id
+ * @param defaultAddress 状态
+ */
+export function changeDefaultAddress(id: string | number, defaultAddress: string) {
+  const data = {
+    id,
+    defaultAddress
+  };
+  return request({
+    url: '/customer/shippingAddress/changeDefaultAddress',
+    method: 'put',
+    data: data
+  });
+}

+ 290 - 0
src/api/customer/customerFile/shippingAddress/types.ts

@@ -0,0 +1,290 @@
+export interface ShippingAddressVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 客户id
+   */
+  customerId: string | number;
+
+  /**
+   * 收货地址编号
+   */
+  shippingAddressNo: string;
+
+  /**
+   * 收货人姓名
+   */
+  consignee: string;
+
+  /**
+   * 部门编号
+   */
+  deptId: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone: string;
+
+  /**
+   * 详细地址
+   */
+  address: string;
+
+  /**
+   * 邮政编码
+   */
+  postal: string;
+
+  /**
+   * 是否默认地址(0-是,1-否)
+   */
+  defaultAddress: string;
+
+  /**
+   * 地址标签
+   */
+  addressLabel: string;
+
+  /**
+   * 省份编码
+   */
+  provincialNo: string;
+
+  /**
+   * 城市编码
+   */
+  cityNo: string;
+
+  /**
+   * 区县编码
+   */
+  countryNo: string;
+
+  /**
+   * 区县编码
+   */
+  provincialCityCountry: string;
+
+  /**
+   * 推送状态(0-已推送,1-未推送等)
+   */
+  pushStatus: string;
+
+  /**
+   * 序号/排序号
+   */
+  num: number;
+
+  /**
+   * 部门名称
+   */
+  deptName: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ShippingAddressForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 收货地址编号
+   */
+  shippingAddressNo?: string;
+
+  /**
+   * 收货人姓名
+   */
+  consignee?: string;
+
+  /**
+   * 部门编号
+   */
+  deptId?: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 详细地址
+   */
+  address?: string;
+
+  /**
+   * 邮政编码
+   */
+  postal?: string;
+
+  /**
+   * 是否默认地址(0-是,1-否)
+   */
+  defaultAddress?: string;
+
+  /**
+   * 地址标签
+   */
+  addressLabel?: string;
+
+  /**
+   * 省份编码
+   */
+  provincialNo?: string;
+
+  /**
+   * 城市编码
+   */
+  cityNo?: string;
+
+  /**
+   * 区县编码
+   */
+  countryNo?: string;
+
+  /**
+   * 区县编码
+   */
+  provincialCityCountry?: string;
+
+  /**
+   * 推送状态(0-已推送,1-未推送等)
+   */
+  pushStatus?: string;
+
+  /**
+   * 序号/排序号
+   */
+  num?: number;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ShippingAddressQuery extends PageQuery {
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 收货地址编号
+   */
+  shippingAddressNo?: string;
+
+  /**
+   * 收货人姓名
+   */
+  consignee?: string;
+
+  /**
+   * 部门编号
+   */
+  deptId?: string | number;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 详细地址
+   */
+  address?: string;
+
+  /**
+   * 邮政编码
+   */
+  postal?: string;
+
+  /**
+   * 是否默认地址(0-是,1-否)
+   */
+  defaultAddress?: string;
+
+  /**
+   * 地址标签
+   */
+  addressLabel?: string;
+
+  /**
+   * 省份编码
+   */
+  provincialNo?: string;
+
+  /**
+   * 城市编码
+   */
+  cityNo?: string;
+
+  /**
+   * 区县编码
+   */
+  countryNo?: string;
+
+  /**
+   * 区县编码
+   */
+  provincialCityCountry?: string;
+
+  /**
+   * 推送状态(0-已推送,1-未推送等)
+   */
+  pushStatus?: string;
+
+  /**
+   * 序号/排序号
+   */
+  num?: number;
+
+  /**
+   * 部门名称
+   */
+  deptName?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 75 - 0
src/api/customer/invoiceType/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { InvoiceTypeVO, InvoiceTypeForm, InvoiceTypeQuery } from '@/api/customer/invoiceType/types';
+
+/**
+ * 查询发票类型列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listInvoiceType = (query?: InvoiceTypeQuery): AxiosPromise<InvoiceTypeVO[]> => {
+  return request({
+    url: '/system/invoiceType/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询发票类型详细
+ * @param id
+ */
+export const getInvoiceType = (id: string | number): AxiosPromise<InvoiceTypeVO> => {
+  return request({
+    url: '/system/invoiceType/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增发票类型
+ * @param data
+ */
+export const addInvoiceType = (data: InvoiceTypeForm) => {
+  return request({
+    url: '/system/invoiceType',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改发票类型
+ * @param data
+ */
+export const updateInvoiceType = (data: InvoiceTypeForm) => {
+  return request({
+    url: '/system/invoiceType',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除发票类型
+ * @param id
+ */
+export const delInvoiceType = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/invoiceType/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeShowStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/invoiceType/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 95 - 0
src/api/customer/invoiceType/types.ts

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

+ 63 - 0
src/api/order/orderMain/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderMainVO, OrderMainForm, OrderMainQuery } from '@/api/order/orderMain/types';
+
+/**
+ * 查询订单主信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderMain = (query?: OrderMainQuery): AxiosPromise<OrderMainVO[]> => {
+  return request({
+    url: '/order/orderMain/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单主信息详细
+ * @param id
+ */
+export const getOrderMain = (id: string | number): AxiosPromise<OrderMainVO> => {
+  return request({
+    url: '/order/orderMain/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单主信息
+ * @param data
+ */
+export const addOrderMain = (data: OrderMainForm) => {
+  return request({
+    url: '/order/orderMain',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单主信息
+ * @param data
+ */
+export const updateOrderMain = (data: OrderMainForm) => {
+  return request({
+    url: '/order/orderMain',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单主信息
+ * @param id
+ */
+export const delOrderMain = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderMain/' + id,
+    method: 'delete'
+  });
+};

+ 721 - 0
src/api/order/orderMain/types.ts

@@ -0,0 +1,721 @@
+export interface OrderMainVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo: string;
+
+  /**
+   * 发货单号
+   */
+  shipmentNo: string;
+
+  /**
+   * 子订单编号
+   */
+  subOrderNo: string;
+
+  /**
+   * 所属公司
+   */
+  companyId: string | number;
+
+  /**
+   * 客户ID(关联客户主表)
+   */
+  customerId: string | number;
+
+  /**
+   * 用户ID(关联用户表)
+   */
+  userId: string | number;
+
+  /**
+   * 收货地址ID
+   */
+  shippingAddressId: string | number;
+
+  /**
+   * 采购事由
+   */
+  purchaseReason: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType: string;
+
+  /**
+   * 支付方式
+   */
+  payType: string;
+
+  /**
+   * 发货仓库
+   */
+  warehouseId: string | number;
+
+  /**
+   * 信用额度(元)
+   */
+  creditLimit: number;
+
+  /**
+   * 预计送达时间
+   */
+  expectedDeliveryTime: string;
+
+  /**
+   * 业务员姓名/工号
+   */
+  businessStaff: string;
+
+  /**
+   * 客服人员
+   */
+  customerService: string;
+
+  /**
+   * 业务部门
+   */
+  businessDept: string;
+
+  /**
+   * 用户所属部门
+   */
+  userDept: string;
+
+  /**
+   * 商品总数量
+   */
+  productQuantity: number;
+
+  /**
+   * 运费(元)
+   */
+  shippingFee: number;
+
+  /**
+   * 订单总金额(元)
+   */
+  totalAmount: number;
+
+  /**
+   * 应付金额(元)
+   */
+  payableAmount: number;
+
+  /**
+   * 支付状态
+   */
+  paymentStatus: string;
+
+  /**
+   * 订单来源
+   */
+  orderSource: string;
+
+  /**
+   * 订单状态
+   */
+  orderStatus: string;
+
+  /**
+   * 下单时间
+   */
+  orderTime: string;
+
+  /**
+   * 确认时间
+   */
+  confirmTime: string;
+
+  /**
+   * 发货时间
+   */
+  shippingTime: string;
+
+  /**
+   * 收货时间
+   */
+  receivingTime: string;
+
+  /**
+   * 已发货数量
+   */
+  shippedQuantity: number;
+
+  /**
+   * 未发货数量
+   */
+  unshippedQuantity: number;
+
+  /**
+   * 包裹数量
+   */
+  packageCount: number;
+
+  /**
+   * 签收数量
+   */
+  signedQuantity: number;
+
+  /**
+   * 已完成售后数量
+   */
+  afterSaleCompleted: number;
+
+  /**
+   * 申请售后数量
+   */
+  afterSalePending: number;
+
+  /**
+   * 配送时效描述
+   */
+  deliveryDesc: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus: string;
+
+  /**
+   * 订单附件文件路径
+   */
+  attachmentPath: string;
+
+  /**
+   * 配送类型
+   */
+  deliveryType: string;
+
+  /**
+   * 创建类别
+   */
+  orderCategory: string;
+
+  /**
+   * 商品编码
+   */
+  productCode: string;
+
+  /**
+   * 取消或异常原因
+   */
+  cancelReason: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 用户编号
+   */
+  userNo: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  orderProductList: any[];
+}
+
+export interface OrderMainForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 发货单号
+   */
+  shipmentNo?: string;
+
+  /**
+   * 子订单编号
+   */
+  subOrderNo?: string;
+
+  /**
+   * 所属公司
+   */
+  companyId?: string | number;
+
+  /**
+   * 客户ID(关联客户主表)
+   */
+  customerId?: string | number;
+
+  /**
+   * 用户ID(关联用户表)
+   */
+  userId?: string | number;
+
+  /**
+   * 收货地址ID
+   */
+  shippingAddressId?: string | number;
+
+  /**
+   * 采购事由
+   */
+  purchaseReason?: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType?: string;
+
+  /**
+   * 支付方式
+   */
+  payType?: string;
+
+  /**
+   * 发货仓库
+   */
+  warehouseId?: string | number;
+
+  /**
+   * 信用额度(元)
+   */
+  creditLimit?: number;
+
+  /**
+   * 预计送达时间
+   */
+  expectedDeliveryTime?: string;
+
+  /**
+   * 业务员姓名/工号
+   */
+  businessStaff?: string;
+
+  /**
+   * 客服人员
+   */
+  customerService?: string;
+
+  /**
+   * 业务部门
+   */
+  businessDept?: string;
+
+  /**
+   * 用户所属部门
+   */
+  userDept?: string;
+
+  /**
+   * 商品总数量
+   */
+  productQuantity?: number;
+
+  /**
+   * 运费(元)
+   */
+  shippingFee?: number;
+
+  /**
+   * 订单总金额(元)
+   */
+  totalAmount?: number;
+
+  /**
+   * 应付金额(元)
+   */
+  payableAmount?: number;
+
+  /**
+   * 支付状态
+   */
+  paymentStatus?: string;
+
+  /**
+   * 订单来源
+   */
+  orderSource?: string;
+
+  /**
+   * 订单状态
+   */
+  orderStatus?: string;
+
+  /**
+   * 下单时间
+   */
+  orderTime?: string;
+
+  /**
+   * 确认时间
+   */
+  confirmTime?: string;
+
+  /**
+   * 发货时间
+   */
+  shippingTime?: string;
+
+  /**
+   * 收货时间
+   */
+  receivingTime?: string;
+
+  /**
+   * 已发货数量
+   */
+  shippedQuantity?: number;
+
+  /**
+   * 未发货数量
+   */
+  unshippedQuantity?: number;
+
+  /**
+   * 包裹数量
+   */
+  packageCount?: number;
+
+  /**
+   * 签收数量
+   */
+  signedQuantity?: number;
+
+  /**
+   * 已完成售后数量
+   */
+  afterSaleCompleted?: number;
+
+  /**
+   * 申请售后数量
+   */
+  afterSalePending?: number;
+
+  /**
+   * 配送时效描述
+   */
+  deliveryDesc?: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 订单附件文件路径
+   */
+  attachmentPath?: string;
+
+  /**
+   * 配送类型
+   */
+  deliveryType?: string;
+
+  /**
+   * 创建类别
+   */
+  orderCategory?: string;
+
+  /**
+   * 商品编码
+   */
+  productCode?: string;
+
+  /**
+   * 取消或异常原因
+   */
+  cancelReason?: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType?: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 用户编号
+   */
+  userNo?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  /**
+   * 订单商品明细列表
+   */
+  orderProductBos?: any[];
+
+  customerSalesInfoVo: any;
+}
+
+export interface OrderMainQuery extends PageQuery {
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 发货单号
+   */
+  shipmentNo?: string;
+
+  /**
+   * 子订单编号
+   */
+  subOrderNo?: string;
+
+  /**
+   * 所属公司
+   */
+  companyId?: string | number;
+
+  /**
+   * 客户ID(关联客户主表)
+   */
+  customerId?: string | number;
+
+  /**
+   * 用户ID(关联用户表)
+   */
+  userId?: string | number;
+
+  /**
+   * 收货地址ID
+   */
+  shippingAddressId?: string | number;
+
+  /**
+   * 采购事由
+   */
+  purchaseReason?: string;
+
+  /**
+   * 发票类型
+   */
+  invoiceType?: string;
+
+  /**
+   * 支付方式
+   */
+  payType?: string;
+
+  /**
+   * 发货仓库
+   */
+  warehouseId?: string | number;
+
+  /**
+   * 信用额度(元)
+   */
+  creditLimit?: number;
+
+  /**
+   * 预计送达时间
+   */
+  expectedDeliveryTime?: string;
+
+  /**
+   * 业务员姓名/工号
+   */
+  businessStaff?: string;
+
+  /**
+   * 客服人员
+   */
+  customerService?: string;
+
+  /**
+   * 业务部门
+   */
+  businessDept?: string;
+
+  /**
+   * 用户所属部门
+   */
+  userDept?: string;
+
+  /**
+   * 商品总数量
+   */
+  productQuantity?: number;
+
+  /**
+   * 运费(元)
+   */
+  shippingFee?: number;
+
+  /**
+   * 订单总金额(元)
+   */
+  totalAmount?: number;
+
+  /**
+   * 应付金额(元)
+   */
+  payableAmount?: number;
+
+  /**
+   * 支付状态
+   */
+  paymentStatus?: string;
+
+  /**
+   * 订单来源
+   */
+  orderSource?: string;
+
+  /**
+   * 订单状态
+   */
+  orderStatus?: string;
+
+  /**
+   * 下单时间
+   */
+  orderTime?: string;
+
+  /**
+   * 确认时间
+   */
+  confirmTime?: string;
+
+  /**
+   * 发货时间
+   */
+  shippingTime?: string;
+
+  /**
+   * 收货时间
+   */
+  receivingTime?: string;
+
+  /**
+   * 已发货数量
+   */
+  shippedQuantity?: number;
+
+  /**
+   * 未发货数量
+   */
+  unshippedQuantity?: number;
+
+  /**
+   * 包裹数量
+   */
+  packageCount?: number;
+
+  /**
+   * 签收数量
+   */
+  signedQuantity?: number;
+
+  /**
+   * 已完成售后数量
+   */
+  afterSaleCompleted?: number;
+
+  /**
+   * 申请售后数量
+   */
+  afterSalePending?: number;
+
+  /**
+   * 配送时效描述
+   */
+  deliveryDesc?: string;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 订单附件文件路径
+   */
+  attachmentPath?: string;
+
+  /**
+   * 配送类型
+   */
+  deliveryType?: string;
+
+  /**
+   * 创建类别
+   */
+  orderCategory?: string;
+
+  /**
+   * 商品编码
+   */
+  productCode?: string;
+
+  /**
+   * 取消或异常原因
+   */
+  cancelReason?: string;
+
+  /**
+   * 费用类型
+   */
+  expenseType?: string;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 用户编号
+   */
+  userNo?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+
+  orderSourse?: string;
+}

+ 63 - 0
src/api/order/orderProduct/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderProductVO, OrderProductForm, OrderProductQuery } from '@/api/order/orderProduct/types';
+
+/**
+ * 查询订单商品明细列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderProduct = (query?: OrderProductQuery): AxiosPromise<OrderProductVO[]> => {
+  return request({
+    url: '/order/orderProduct/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单商品明细详细
+ * @param id
+ */
+export const getOrderProduct = (id: string | number): AxiosPromise<OrderProductVO> => {
+  return request({
+    url: '/order/orderProduct/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单商品明细
+ * @param data
+ */
+export const addOrderProduct = (data: OrderProductForm) => {
+  return request({
+    url: '/order/orderProduct',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单商品明细
+ * @param data
+ */
+export const updateOrderProduct = (data: OrderProductForm) => {
+  return request({
+    url: '/order/orderProduct',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单商品明细
+ * @param id
+ */
+export const delOrderProduct = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderProduct/' + id,
+    method: 'delete'
+  });
+};

+ 369 - 0
src/api/order/orderProduct/types.ts

@@ -0,0 +1,369 @@
+export interface OrderProductVO {
+  /**
+   * 订单商品明细ID
+   */
+  id: string | number;
+
+  /**
+   * 订单ID
+   */
+  orderId: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo: string;
+
+  /**
+   * 发货单编号
+   */
+  shipmentNo: string;
+
+  /**
+   * 产品ID
+   */
+  productId: string | number;
+
+  /**
+   * 产品编号(业务编码)
+   */
+  productNo: string;
+
+  /**
+   * 产品名称
+   */
+  productName: string;
+
+  /**
+   * 产品单位
+   */
+  productUnit: string;
+
+  /**
+   * 产品图片URL
+   */
+  productImage: string;
+
+  /**
+   * 产品图片URLUrl
+   */
+  productImageUrl: string;
+  /**
+   * 平台价格(元)
+   */
+  platformPrice: number;
+
+  /**
+   * 最小起订量
+   */
+  minOrderQuantity: number;
+
+  /**
+   * 订单单价(元)
+   */
+  orderPrice: number;
+
+  /**
+   * 订购数量
+   */
+  orderQuantity: number;
+
+  /**
+   * 行小计金额(元)
+   */
+  subtotal: number;
+
+  /**
+   * 最低销售价(元)
+   */
+  minSellingPrice: number;
+
+  /**
+   * 已签收数量
+   */
+  signedQuantity: number;
+
+  /**
+   * 已发货数量
+   */
+  quantitySent: number;
+
+  /**
+   * 未发货数量
+   */
+  unsentQuantity: number;
+
+  /**
+   * 是否申请售后
+   */
+  isAfterSale: string;
+
+  /**
+   * 售后申请数量
+   */
+  afterSaleQuantity: number;
+
+  /**
+   * 退款金额(元)
+   */
+  returnAmount: number;
+
+  /**
+   * 预计送达时间
+   */
+  preDeliveryDate: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface OrderProductForm extends BaseEntity {
+  /**
+   * 订单商品明细ID
+   */
+  id?: string | number;
+
+  /**
+   * 订单ID
+   */
+  orderId?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 发货单编号
+   */
+  shipmentNo?: string;
+
+  /**
+   * 产品ID
+   */
+  productId?: string | number;
+
+  /**
+   * 产品编号(业务编码)
+   */
+  productNo?: string;
+
+  /**
+   * 产品名称
+   */
+  productName?: string;
+
+  /**
+   * 产品单位
+   */
+  productUnit?: string;
+
+  /**
+   * 产品图片URL
+   */
+  productImage?: string;
+
+  /**
+   * 平台价格(元)
+   */
+  platformPrice?: number;
+
+  /**
+   * 最小起订量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 订单单价(元)
+   */
+  orderPrice?: number;
+
+  /**
+   * 订购数量
+   */
+  orderQuantity?: number;
+
+  /**
+   * 行小计金额(元)
+   */
+  subtotal?: number;
+
+  /**
+   * 最低销售价(元)
+   */
+  minSellingPrice?: number;
+
+  /**
+   * 已签收数量
+   */
+  signedQuantity?: number;
+
+  /**
+   * 已发货数量
+   */
+  quantitySent?: number;
+
+  /**
+   * 未发货数量
+   */
+  unsentQuantity?: number;
+
+  /**
+   * 是否申请售后
+   */
+  isAfterSale?: string;
+
+  /**
+   * 售后申请数量
+   */
+  afterSaleQuantity?: number;
+
+  /**
+   * 退款金额(元)
+   */
+  returnAmount?: number;
+
+  /**
+   * 预计送达时间
+   */
+  preDeliveryDate?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface OrderProductQuery extends PageQuery {
+  /**
+   * 订单ID
+   */
+  orderId?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 发货单编号
+   */
+  shipmentNo?: string;
+
+  /**
+   * 产品ID
+   */
+  productId?: string | number;
+
+  /**
+   * 产品编号(业务编码)
+   */
+  productNo?: string;
+
+  /**
+   * 产品名称
+   */
+  productName?: string;
+
+  /**
+   * 产品单位
+   */
+  productUnit?: string;
+
+  /**
+   * 产品图片URL
+   */
+  productImage?: string;
+
+  /**
+   * 平台价格(元)
+   */
+  platformPrice?: number;
+
+  /**
+   * 最小起订量
+   */
+  minOrderQuantity?: number;
+
+  /**
+   * 订单单价(元)
+   */
+  orderPrice?: number;
+
+  /**
+   * 订购数量
+   */
+  orderQuantity?: number;
+
+  /**
+   * 行小计金额(元)
+   */
+  subtotal?: number;
+
+  /**
+   * 最低销售价(元)
+   */
+  minSellingPrice?: number;
+
+  /**
+   * 已签收数量
+   */
+  signedQuantity?: number;
+
+  /**
+   * 已发货数量
+   */
+  quantitySent?: number;
+
+  /**
+   * 未发货数量
+   */
+  unsentQuantity?: number;
+
+  /**
+   * 是否申请售后
+   */
+  isAfterSale?: string;
+
+  /**
+   * 售后申请数量
+   */
+  afterSaleQuantity?: number;
+
+  /**
+   * 退款金额(元)
+   */
+  returnAmount?: number;
+
+  /**
+   * 预计送达时间
+   */
+  preDeliveryDate?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  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'
+  });
+};

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

@@ -0,0 +1,65 @@
+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/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'
+  });
+};

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

@@ -0,0 +1,160 @@
+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;
+}

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

@@ -0,0 +1,156 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BaseVO, BaseForm, BaseQuery } 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
+  });
+};

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

@@ -0,0 +1,674 @@
+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;
+
+  /**
+   * 产品审核状态 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=下架等
+   */
+  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;
+
+  /**
+   * 商品属性值(JSON字符串)
+   */
+  attributesList?: 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?: string;
+
+  /**
+   * 产品审核状态 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=下架等
+   */
+  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;
+}
+
+export interface BaseQuery extends PageQuery {
+  /**
+   * 产品编号
+   */
+  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?: string;
+
+  /**
+   * 产品审核状态 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=下架等
+   */
+  productStatus?: string | number;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 商品标签
+   */
+  productTag?: string;
+
+  /**
+   * 采购性质
+   */
+  purchaseNature?: string;
+
+  /**
+   * 供应商类型
+   */
+  supplierType?: string;
+
+  /**
+   * 供应商性质
+   */
+  supplierNature?: string;
+
+  /**
+   * 项目组织
+   */
+  projectOrg?: 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'
+  });
+};

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

@@ -0,0 +1,309 @@
+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;
+}

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

@@ -0,0 +1,74 @@
+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?: 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'
+  });
+};

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

@@ -0,0 +1,392 @@
+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[];
+}
+
+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/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'
+  });
+};

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

@@ -0,0 +1,65 @@
+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/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'
+  });
+};

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

@@ -0,0 +1,95 @@
+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;
+}

+ 4 - 4
src/views/login.vue

@@ -5,12 +5,12 @@
         <h3 class="title">{{ title }}</h3>
         <lang-select />
       </div>
-      <el-form-item v-if="tenantEnabled" prop="tenantId">
+      <!-- <el-form-item v-if="tenantEnabled" prop="tenantId">
         <el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')" style="width: 100%">
           <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>
           <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item prop="username">
         <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" :placeholder="proxy.$t('login.username')">
           <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
@@ -96,8 +96,8 @@ const { t } = useI18n();
 
 const loginForm = ref<LoginData>({
   tenantId: '000000',
-  username: 'admin',
-  password: 'admin123',
+  username: 'omsadmin',
+  password: '123456',
   rememberMe: false,
   code: '',
   uuid: ''

+ 169 - 0
src/views/order/orderMain/components/addressDialog.vue

@@ -0,0 +1,169 @@
+<template>
+  <el-dialog v-model="dialogVisible" title="添加收货地址" width="650px" @close="handleClose">
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
+      <el-form-item label="收货人" prop="consignee">
+        <el-input v-model="form.consignee" placeholder="请输入收货人姓名" />
+      </el-form-item>
+      <el-form-item label="部门名称" prop="deptName">
+        <el-input v-model="form.deptName" placeholder="请输入部门名称" />
+      </el-form-item>
+      <el-form-item label="手机号码" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入联系电话" />
+      </el-form-item>
+      <el-form-item label="邮政编码" prop="postal">
+        <el-input v-model="form.postal" placeholder="请输入邮政编码" />
+      </el-form-item>
+      <el-form-item label="详细地址" prop="provincialCityCountry">
+        <el-cascader v-model="codeArr" :options="regionData" placeholder="请选择" @change="handleRegionChange" style="width: 100%" />
+      </el-form-item>
+      <el-form-item prop="address">
+        <el-input v-model="form.address" type="textarea" placeholder="请输入详细地址" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button :loading="submitLoading" type="primary" @click="handleSubmit">确 定</el-button>
+        <el-button @click="handleClose">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, watch, getCurrentInstance } from 'vue';
+import { addShippingAddress } from '@/api/customer/customerFile/shippingAddress';
+import { ShippingAddressForm } from '@/api/customer/customerFile/shippingAddress/types';
+import { regionData } from 'element-china-area-data';
+import type { FormInstance, FormRules } from 'element-plus';
+
+interface Props {
+  modelValue: boolean;
+  customerId?: string | number;
+}
+
+interface Emits {
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'success'): void;
+}
+
+const props = defineProps<Props>();
+const emit = defineEmits<Emits>();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const dialogVisible = ref(false);
+const formRef = ref<FormInstance>();
+const submitLoading = ref(false);
+const codeArr = ref<string[]>([]);
+
+const initForm: ShippingAddressForm = {
+  customerId: undefined,
+  consignee: undefined,
+  deptName: undefined,
+  phone: undefined,
+  address: undefined,
+  postal: undefined,
+  provincialNo: undefined,
+  cityNo: undefined,
+  countryNo: undefined,
+  provincialCityCountry: undefined
+};
+
+const form = ref<ShippingAddressForm>({ ...initForm });
+
+const rules: FormRules = {
+  consignee: [{ required: true, message: '收货人姓名不能为空', trigger: 'blur' }],
+  provincialCityCountry: [{ required: true, message: '详细地址不能为空', trigger: 'blur' }]
+};
+
+// 监听 modelValue 变化
+watch(
+  () => props.modelValue,
+  (val) => {
+    dialogVisible.value = val;
+    if (val) {
+      form.value.customerId = props.customerId;
+    }
+  },
+  { immediate: true }
+);
+
+// 监听 dialogVisible 变化,同步到父组件
+watch(dialogVisible, (val) => {
+  emit('update:modelValue', val);
+});
+
+// 处理区域选择变化
+const handleRegionChange = (val: string[]) => {
+  if (!val || val.length === 0) {
+    form.value.provincialNo = undefined;
+    form.value.cityNo = undefined;
+    form.value.countryNo = undefined;
+    form.value.provincialCityCountry = undefined;
+    return;
+  }
+
+  // 保存编码
+  form.value.provincialNo = val[0];
+  form.value.cityNo = val[1];
+  form.value.countryNo = val[2];
+
+  // 根据编码获取名称
+  const names: string[] = [];
+  if (val[0]) {
+    const province = regionData.find((item: any) => item.value === val[0]);
+    if (province) {
+      names.push(province.label);
+
+      if (val[1] && province.children) {
+        const city = province.children.find((item: any) => item.value === val[1]);
+        if (city) {
+          names.push(city.label);
+
+          if (val[2] && city.children) {
+            const county = city.children.find((item: any) => item.value === val[2]);
+            if (county) {
+              names.push(county.label);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // 将省市区名称用斜杠连接
+  form.value.provincialCityCountry = names.join('/');
+};
+
+// 关闭对话框
+const handleClose = () => {
+  emit('update:modelValue', false);
+  resetForm();
+};
+
+// 重置表单
+const resetForm = () => {
+  formRef.value?.resetFields();
+  form.value = { ...initForm };
+  codeArr.value = [];
+};
+
+// 提交表单
+const handleSubmit = async () => {
+  if (!formRef.value) return;
+
+  try {
+    const valid = await formRef.value.validate();
+    if (!valid) return;
+
+    submitLoading.value = true;
+    await addShippingAddress(form.value);
+    proxy?.$modal.msgSuccess('操作成功');
+    emit('success');
+    handleClose();
+  } catch (error) {
+    console.error('添加收货地址失败:', error);
+  } finally {
+    submitLoading.value = false;
+  }
+};
+</script>

+ 131 - 0
src/views/order/orderMain/components/chooseAddress.vue

@@ -0,0 +1,131 @@
+<template>
+  <el-dialog v-model="visible" title="选择地址" width="800px" @close="handleClose">
+    <el-table :data="addressList" border style="width: 100%" highlight-current-row @current-change="handleCurrentChange">
+      <el-table-column label="选择" width="80" align="center">
+        <template #default="scope">
+          <el-radio v-model="selectedAddressId" :value="scope.row.id">
+            <span></span>
+          </el-radio>
+        </template>
+      </el-table-column>
+      <el-table-column prop="consignee" label="收货人" width="120" />
+      <el-table-column prop="phone" label="手机号" width="150" />
+      <el-table-column prop="address" label="地址" show-overflow-tooltip>
+        <template #default="scope"> {{ scope.row.provincialCityCountry }} {{ scope.row.address }} </template>
+      </el-table-column>
+    </el-table>
+
+    <div v-if="addressList.length === 0" class="empty-data">暂无数据</div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleClose">取消</el-button>
+        <el-button type="primary" @click="handleConfirm">确定</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, watch } from 'vue';
+import { listShippingAddress } from '@/api/customer/customerFile/shippingAddress';
+import { ShippingAddressVO, ShippingAddressQuery } from '@/api/customer/customerFile/shippingAddress/types';
+
+interface Props {
+  modelValue: boolean;
+  customerId?: string | number;
+}
+
+interface Emits {
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'confirm', address: ShippingAddressVO): void;
+}
+
+const props = defineProps<Props>();
+const emit = defineEmits<Emits>();
+
+const visible = ref(false);
+const addressList = ref<ShippingAddressVO[]>([]);
+const selectedAddressId = ref<string | number>('');
+const selectedAddress = ref<ShippingAddressVO | null>(null);
+
+// 监听 modelValue 变化
+watch(
+  () => props.modelValue,
+  (val) => {
+    visible.value = val;
+    if (val && props.customerId) {
+      loadAddressList();
+    }
+  },
+  { immediate: true }
+);
+
+// 监听 customerId 变化
+watch(
+  () => props.customerId,
+  (val) => {
+    if (val && visible.value) {
+      loadAddressList();
+    }
+  }
+);
+
+// 加载地址列表
+const loadAddressList = async () => {
+  if (!props.customerId) {
+    addressList.value = [];
+    return;
+  }
+
+  try {
+    const queryParams: ShippingAddressQuery = {
+      customerId: props.customerId,
+      pageNum: 1,
+      pageSize: 100
+    };
+    const res = await listShippingAddress(queryParams);
+    addressList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载地址列表失败:', error);
+    addressList.value = [];
+  }
+};
+
+// 选中行变化
+const handleCurrentChange = (row: ShippingAddressVO | null) => {
+  if (row) {
+    selectedAddressId.value = row.id;
+    selectedAddress.value = row;
+  }
+};
+
+// 关闭对话框
+const handleClose = () => {
+  emit('update:modelValue', false);
+  selectedAddressId.value = '';
+  selectedAddress.value = null;
+};
+
+// 确认选择
+const handleConfirm = () => {
+  if (!selectedAddress.value) {
+    return;
+  }
+  emit('confirm', selectedAddress.value);
+  handleClose();
+};
+</script>
+
+<style scoped lang="scss">
+.empty-data {
+  text-align: center;
+  padding: 40px 0;
+  color: #909399;
+  font-size: 14px;
+}
+
+:deep(.el-radio__label) {
+  display: none;
+}
+</style>

+ 202 - 0
src/views/order/orderMain/components/chooseProduct.vue

@@ -0,0 +1,202 @@
+<template>
+  <el-dialog
+    :model-value="modelValue"
+    title="添加商品"
+    width="1200px"
+    @update:model-value="handleDialogChange"
+    @open="handleOpen"
+    @close="handleClose"
+  >
+    <!-- 搜索条件 -->
+    <el-form :model="queryParams" :inline="true" label-width="80px">
+      <el-form-item label="商品编号">
+        <el-input v-model="queryParams.productNo" placeholder="请输入商品编号" clearable style="width: 200px" />
+      </el-form-item>
+      <el-form-item label="商品名称">
+        <el-input v-model="queryParams.itemName" placeholder="请输入商品名称" clearable style="width: 200px" />
+      </el-form-item>
+      <el-form-item label="商品品牌">
+        <el-select v-model="queryParams.brandId" placeholder="请选择品牌" clearable style="width: 200px">
+          <el-option v-for="brand in brandOptions" :key="brand.id" :label="brand.brandName" :value="brand.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="商品分类">
+        <el-tree-select
+          v-model="queryParams.bottomCategoryId"
+          :data="categoryList"
+          :props="{ value: 'id', label: 'label', children: 'children' } as any"
+          value-key="id"
+          placeholder="请选择商品分类"
+          clearable
+          check-strictly
+        />
+      </el-form-item>
+      <el-form-item label="商品状态">
+        <el-select v-model="queryParams.productStatus" placeholder="请选择" clearable style="width: 200px">
+          <el-option label="上架" value="0" />
+          <el-option label="下架" value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleQuery">查询</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 商品列表 -->
+    <el-table :data="productList" border style="width: 100%" max-height="400px" v-loading="loading">
+      <el-table-column prop="productNo" label="商品编号" width="120" />
+      <el-table-column label="商品图片" width="100">
+        <template #default="scope">
+          <el-image v-if="scope.row.productImage" :src="scope.row.productImage" style="width: 60px; height: 60px" fit="cover" />
+          <span v-else>暂无图片</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="itemName" label="商品信息" min-width="200" show-overflow-tooltip />
+      <el-table-column prop="taxRate" label="税率" width="100">
+        <template #default="scope"> {{ scope.row.taxRate }}% </template>
+      </el-table-column>
+      <el-table-column prop="unit" label="单位" width="80" />
+      <el-table-column prop="certificatePrice" label="最低售价" width="100" />
+      <el-table-column prop="minOrderQuantity" label="起订量" width="100" />
+      <el-table-column prop="unitPrice" label="含税单价" width="100" />
+      <el-table-column prop="productStatus" label="商品状态" width="100">
+        <template #default="scope">
+          <el-tag v-if="scope.row.productStatus === '0'" type="success">上架</el-tag>
+          <el-tag v-else type="danger">下架</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="100" fixed="right">
+        <template #default="scope">
+          <el-button link type="primary" @click="handleAddProduct(scope.row)">加入</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <el-pagination
+      v-model:current-page="queryParams.pageNum"
+      v-model:page-size="queryParams.pageSize"
+      :total="total"
+      :page-sizes="[10, 20, 50, 100]"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="handleQuery"
+      @current-change="handleQuery"
+      class="mt-4"
+    />
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from 'vue';
+import { listBase, brandList, categoryTree } from '@/api/product/base';
+import { BaseVO, BaseQuery } from '@/api/product/base/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { categoryTreeVO } from '@/api/product/category/types';
+
+interface Props {
+  modelValue: boolean;
+}
+
+interface Emits {
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'confirm', product: BaseVO): void;
+}
+
+const props = defineProps<Props>();
+const emit = defineEmits<Emits>();
+
+const loading = ref(false);
+const productList = ref<BaseVO[]>([]);
+const brandOptions = ref<BrandVO[]>([]);
+const categoryList = ref<categoryTreeVO[]>([]);
+const total = ref(0);
+
+const queryParams = ref<BaseQuery>({
+  pageNum: 1,
+  pageSize: 10,
+  productNo: undefined,
+  itemName: undefined,
+  brandId: undefined,
+  topCategoryId: undefined
+});
+
+// 对话框状态变化
+const handleDialogChange = (val: boolean) => {
+  emit('update:modelValue', val);
+};
+
+// 对话框打开时触发
+const handleOpen = () => {
+  loadProductList();
+};
+
+// 对话框关闭时触发
+const handleClose = () => {
+  // 可以在这里重置数据
+};
+
+// 加载商品列表
+const loadProductList = async () => {
+  if (loading.value) return;
+
+  loading.value = true;
+  try {
+    const res = await listBase(queryParams.value);
+    productList.value = res.rows || [];
+    total.value = res.total || 0;
+  } catch (error) {
+    console.error('加载商品列表失败:', error);
+    productList.value = [];
+    total.value = 0;
+  } finally {
+    loading.value = false;
+  }
+};
+
+// 加载品牌列表
+const loadBrandList = async () => {
+  try {
+    const res = await brandList();
+    brandOptions.value = res.data || [];
+  } catch (error) {
+    console.error('加载品牌列表失败:', error);
+    brandOptions.value = [];
+  }
+};
+
+// 加载分类树
+const loadCategoryTree = async () => {
+  try {
+    const res = await categoryTree();
+    categoryList.value = res.data || [];
+  } catch (error) {
+    console.error('加载分类树失败:', error);
+    categoryList.value = [];
+  }
+};
+
+// 查询
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  loadProductList();
+};
+
+// 添加商品
+const handleAddProduct = (product: BaseVO) => {
+  emit('confirm', product);
+  // 关闭对话框
+  emit('update:modelValue', false);
+};
+
+// 初始化
+onMounted(() => {
+  // loadBrandList(); // 暂时注释掉
+  loadCategoryTree();
+});
+</script>
+
+<style scoped lang="scss">
+.mt-4 {
+  margin-top: 16px;
+}
+</style>

+ 904 - 0
src/views/order/orderMain/index.vue

@@ -0,0 +1,904 @@
+<template>
+  <div class="p-2">
+    <!-- 订单流程 -->
+    <el-card shadow="never" class="mb-2">
+      <div class="order-steps">
+        <span class="step-title">A10订单流程</span>
+      </div>
+    </el-card>
+
+    <!-- 订单基本信息 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>订单基本信息</span>
+          <span> 订单日期:<el-date-picker v-model="form.orderTime" type="date" value-format="YYYY-MM-DD" /></span>
+        </div>
+      </template>
+
+      <el-form ref="orderMainFormRef" :model="form" :rules="rules" label-width="100px">
+        <el-row :gutter="20">
+          <!-- 第一行 -->
+          <el-col :span="8">
+            <el-form-item label="归属公司" prop="companyId">
+              <el-select v-model="form.companyId" placeholder="请选择" style="width: 100%" filterable>
+                <el-option v-for="company in companyList" :key="company.id" :label="company.companyName" :value="company.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="客户名称" prop="customerId">
+              <el-select
+                v-model="form.customerId"
+                placeholder="请选择客户"
+                style="width: 100%"
+                filterable
+                :disabled="!form.companyId"
+                :loading="customerLoading"
+                @change="handleCustomerChange"
+              >
+                <el-option v-for="customer in customerList" :key="customer.id" :label="customer.customerName" :value="customer.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第二行 -->
+          <el-col :span="8"> </el-col>
+          <el-col :span="8">
+            <el-form-item label="信用额度" prop="creditLimit">
+              <el-input v-model="form.creditLimit" placeholder="0" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="剩余额度">
+              <el-input value="0" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第三行 -->
+          <el-col :span="8">
+            <el-form-item label="业务人员" prop="businessStaff">
+              <el-input v-model="form.businessStaff" placeholder="请选择" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="客服人员" prop="customerService">
+              <el-input v-model="form.customerService" placeholder="请选择" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="业务部门" prop="businessDept">
+              <el-input v-model="form.businessDept" placeholder="请选择" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第四行 -->
+          <el-col :span="8">
+            <el-form-item label="发票类型" prop="invoiceType">
+              <el-select v-model="form.invoiceType" placeholder="请选择" style="width: 100%" disabled>
+                <el-option label="普通发票" value="1" />
+                <el-option label="增值税发票" value="2" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="支付方式" prop="payType">
+              <el-select v-model="form.payType" placeholder="请选择" style="width: 100%">
+                <el-option v-for="dict in pay_method" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="预收货日" prop="expectedDeliveryTime">
+              <el-date-picker
+                v-model="form.expectedDeliveryTime"
+                type="date"
+                placeholder="请选择"
+                value-format="YYYY-MM-DD"
+                style="width: 100%"
+                :disabled-date="disabledDeliveryDate"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第五行 -->
+          <el-col :span="8">
+            <el-form-item label="发货仓库" prop="warehouseId">
+              <el-select v-model="form.warehouseId" placeholder="请选择" style="width: 100%" filterable>
+                <el-option
+                  v-for="warehouse in warehouseList"
+                  :key="warehouse.id"
+                  :label="`${warehouse.warehouseCode},${warehouse.warehouseName}`"
+                  :value="warehouse.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="费用类型" prop="expenseType">
+              <el-select v-model="form.expenseType" placeholder="请选择" style="width: 100%">
+                <el-option v-for="dict in fee_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="下单部门" prop="userDept">
+              <el-select v-model="form.userDept" placeholder="请选择" style="width: 100%" :disabled="!form.customerId">
+                <el-option v-for="dept in customerDeptList" :key="dept.id" :label="dept.deptName" :value="dept.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第六行 -->
+          <el-col :span="24">
+            <el-form-item label="采购事由" prop="purchaseReason">
+              <el-input v-model="form.purchaseReason" placeholder="请输入采购事由" type="textarea" :rows="2" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第七行 -->
+          <el-col :span="24">
+            <el-form-item label="订单备注" prop="remark">
+              <el-input v-model="form.remark" placeholder="请输入订单备注" type="textarea" :rows="2" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <!-- 第八行 -->
+          <el-col :span="24">
+            <el-form-item label="附件" prop="attachmentPath">
+              <el-upload class="upload-demo" action="#" :auto-upload="false">
+                <el-button type="primary" plain>上传附件</el-button>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+
+    <!-- 收货地址 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>收货地址</span>
+          <div>
+            <el-button type="primary" plain @click="addAddress">添加收货地址</el-button>
+            <el-button type="primary" plain @click="chooseAddress">选择收货地址</el-button>
+          </div>
+        </div>
+      </template>
+
+      <el-form :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="收货人姓名">
+              <el-input v-model="addressDisplay.receiverName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="手机号码">
+              <el-input v-model="addressDisplay.receiverPhone" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="详细地址">
+              <el-input v-model="addressDisplay.receiverProvince" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item>
+              <el-input v-model="addressDisplay.addressDetail" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+
+    <!-- 商品明细 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>商品明细</span>
+          <div>
+            <el-button type="primary" plain @click="handleAddProduct">添加商品</el-button>
+            <el-button type="primary" plain>导入</el-button>
+          </div>
+        </div>
+      </template>
+      <el-table :data="productList" border style="width: 100%">
+        <el-table-column prop="productCode" label="产品编码" width="130" align="center" />
+        <el-table-column label="商品图片" align="center">
+          <template #default="scope">
+            <el-image v-if="scope.row.productImage" :src="scope.row.productImage" style="width: 60px; height: 60px" fit="cover" />
+            <span v-else>暂无图片</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="productName" label="产品信息" align="center" />
+        <el-table-column prop="taxRate" label="税率" align="center">
+          <template #default="scope"> 增值税{{ scope.row.taxRate }}% </template>
+        </el-table-column>
+        <el-table-column prop="unit" label="单位" align="center" />
+        <el-table-column prop="price" label="单价" align="center" />
+        <el-table-column prop="certificatePrice" label="最低售价" align="center" />
+        <el-table-column prop="minOrderQuantity" label="起订量" align="center" />
+        <el-table-column prop="unitPrice" label="含税单价" align="center">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.unitPrice"
+              :min="scope.row.certificatePrice"
+              :precision="2"
+              :controls="false"
+              @blur="handleUnitPriceChange(scope.$index)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column prop="quantity" label="数量" align="center">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.quantity"
+              :min="scope.row.minOrderQuantity || 1"
+              :precision="0"
+              :controls="false"
+              @change="handleQuantityChange(scope.$index)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column prop="amount" label="小计" align="center" />
+        <el-table-column label="操作" align="center">
+          <template #default="scope">
+            <el-button link type="danger" size="small" @click="handleDeleteProduct(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div class="mt-2 text-right">
+        <span>商品数:{{ totalQuantity }} 合计金额:¥ {{ totalAmount.toFixed(2) }}</span>
+      </div>
+    </el-card>
+
+    <!-- 信息汇总 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>信息汇总</span>
+        </div>
+      </template>
+
+      <el-table :data="summaryData" border style="width: 100%">
+        <el-table-column prop="quantity" label="商品数量" align="center" />
+        <el-table-column prop="shippingFee" label="运费" align="center" />
+        <el-table-column prop="totalAmount" label="订单总金额" align="center" />
+        <el-table-column prop="payableAmount" label="应付款金额" align="center" />
+      </el-table>
+    </el-card>
+
+    <!-- 底部按钮 -->
+    <div class="text-center mt-4">
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" :loading="buttonLoading" @click="submitForm">确定</el-button>
+    </div>
+
+    <!-- 选择地址对话框 -->
+    <ChooseAddress v-model="showAddressDialog" :customer-id="form.customerId" @confirm="handleAddressConfirm" />
+
+    <!-- 添加地址对话框 -->
+    <AddAddress v-model="showAddAddressDialog" :customer-id="form.customerId" @success="handleAddAddressSuccess" />
+
+    <!-- 选择商品对话框 -->
+    <ChooseProduct v-model="showProductDialog" @confirm="handleProductConfirm" />
+  </div>
+</template>
+
+<script setup name="OrderMain" lang="ts">
+import { listOrderMain, getOrderMain, delOrderMain, addOrderMain, updateOrderMain } from '@/api/order/orderMain';
+import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+import { listCompany } from '@/api/company/company';
+import { listCustomerDept } from '@/api/customer/customerFile/customerDept';
+import { CustomerDeptVO } from '@/api/customer/customerFile/customerDept/types';
+import { CompanyVO } from '@/api/company/company/types';
+import { listWarehouse, getWarehouse } from '@/api/company/warehouse';
+import { WarehouseVO, WarehouseQuery } from '@/api/company/warehouse/types';
+import { listCustomerInfo, getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
+import { CustomerInfoVO, CustomerInfoQuery, CustomerInfoForm } from '@/api/customer/customerFile/customerInfo/types';
+import { ShippingAddressVO } from '@/api/customer/customerFile/shippingAddress/types';
+import ChooseAddress from './components/chooseAddress.vue';
+import AddAddress from './components/addressDialog.vue';
+import ChooseProduct from './components/chooseProduct.vue';
+import { BaseVO } from '@/api/product/base/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_status, fee_type, pay_method } = toRefs<any>(proxy?.useDict('order_status', 'fee_type', 'pay_method'));
+import { regionData } from 'element-china-area-data';
+const buttonLoading = ref(false);
+const loading = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const orderMainFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+// 商品列表数据
+const productList = ref([]);
+
+// 地址选择对话框
+const showAddressDialog = ref(false);
+
+// 添加地址对话框
+const showAddAddressDialog = ref(false);
+
+// 选择商品对话框
+const showProductDialog = ref(false);
+
+// 计算商品总数(所有商品的数量之和)
+const totalQuantity = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.quantity) || 0);
+  }, 0);
+});
+
+// 计算商品总金额(所有商品的小计之和)
+const totalAmount = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.amount) || 0);
+  }, 0);
+});
+
+// 计算应付款金额(订单总金额 + 运费)
+const payableAmount = computed(() => {
+  const shipping = Number(form.value.shippingFee) || 0;
+  return totalAmount.value + shipping;
+});
+
+// 汇总数据(用于表格显示)
+const summaryData = computed(() => {
+  return [
+    {
+      quantity: totalQuantity.value,
+      shippingFee: `¥${(Number(form.value.shippingFee) || 0).toFixed(2)}`,
+      totalAmount: `¥${totalAmount.value.toFixed(2)}`,
+      payableAmount: `¥${payableAmount.value.toFixed(2)}`
+    }
+  ];
+});
+
+// 公司列表
+const companyList = ref<CompanyVO[]>([]);
+
+// 仓库列表
+const warehouseList = ref<WarehouseVO[]>([]);
+
+// 客户列表
+const customerList = ref<CustomerInfoVO[]>([]);
+const customerLoading = ref(false);
+
+// 客户部门列表
+const customerDeptList = ref<CustomerDeptVO[]>([]);
+
+// 收货地址显示信息(仅用于显示,不提交)
+const addressDisplay = ref({
+  receiverName: '',
+  receiverPhone: '',
+  receiverProvince: '',
+  addressDetail: ''
+});
+
+// 禁用预收货日期的函数(只能选择订单日期之后的日期)
+const disabledDeliveryDate = (time: Date) => {
+  if (!form.value.orderTime) {
+    // 如果没有选择订单日期,禁用今天之前的日期
+    return time.getTime() < Date.now() - 8.64e7;
+  }
+  // 将订单日期转换为时间戳进行比较
+  const orderDate = new Date(form.value.orderTime);
+  orderDate.setHours(0, 0, 0, 0);
+  const compareTime = time.getTime();
+  const orderTime = orderDate.getTime();
+  // 禁用订单日期及之前的日期
+  return compareTime <= orderTime;
+};
+
+const initFormData: OrderMainForm = {
+  id: undefined,
+  orderNo: undefined,
+  shipmentNo: undefined,
+  subOrderNo: undefined,
+  companyId: undefined,
+  customerId: undefined,
+  userId: undefined,
+  shippingAddressId: undefined,
+  purchaseReason: undefined,
+  invoiceType: undefined,
+  payType: undefined,
+  warehouseId: undefined,
+  creditLimit: undefined,
+  expectedDeliveryTime: undefined,
+  businessStaff: undefined,
+  customerService: undefined,
+  businessDept: undefined,
+  userDept: undefined,
+  productQuantity: undefined,
+  shippingFee: undefined,
+  totalAmount: undefined,
+  payableAmount: undefined,
+  paymentStatus: undefined,
+  orderSource: '1',
+  orderStatus: undefined,
+  orderTime: new Date().toISOString().split('T')[0], // 默认今天,格式:YYYY-MM-DD
+  confirmTime: undefined,
+  shippingTime: undefined,
+  receivingTime: undefined,
+  shippedQuantity: undefined,
+  unshippedQuantity: undefined,
+  packageCount: undefined,
+  signedQuantity: undefined,
+  afterSaleCompleted: undefined,
+  afterSalePending: undefined,
+  deliveryDesc: undefined,
+  pushStatus: undefined,
+  attachmentPath: undefined,
+  deliveryType: undefined,
+  orderCategory: undefined,
+  productCode: undefined,
+  cancelReason: undefined,
+  expenseType: undefined,
+  customerNo: undefined,
+  userNo: undefined,
+  status: undefined,
+  remark: undefined,
+  customerSalesInfoVo: {
+    salesPerson: '',
+    serviceStaff: '',
+    belongingDepartment: ''
+  }
+};
+const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orderNo: undefined,
+    shipmentNo: undefined,
+    subOrderNo: undefined,
+    companyId: undefined,
+    customerId: undefined,
+    userId: undefined,
+    shippingAddressId: undefined,
+
+    params: {}
+  },
+  rules: {
+    companyId: [{ required: true, message: '归属公司不能为空', trigger: 'blur' }],
+    customerId: [{ required: true, message: '客户名称不能为空', trigger: 'blur' }],
+    payType: [{ required: true, message: '支付方式不能为空', trigger: 'change' }],
+    warehouseId: [{ required: true, message: '发货仓库不能为空', trigger: 'change' }],
+    expectedDeliveryTime: [{ required: true, message: '预计送达时间不能为空', trigger: 'blur' }],
+    shippingFee: [{ required: true, message: '运费不能为空', trigger: 'blur' }],
+    confirmTime: [{ required: true, message: '确认时间不能为空', trigger: 'blur' }],
+    shippingTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }],
+    expenseType: [{ required: true, message: '费用类型不能为空', trigger: 'change' }],
+    purchaseReason: [{ required: true, message: '采购事由不能为空', trigger: 'change' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+// 监听公司变化,加载该公司的客户列表
+watch(
+  () => form.value.companyId,
+  (newVal, oldVal) => {
+    if (newVal !== oldVal) {
+      // 清空客户选择和相关信息
+      form.value.customerId = undefined;
+      customerList.value = [];
+      customerDeptList.value = [];
+      form.value.creditLimit = undefined;
+      form.value.shippingAddressId = undefined;
+      form.value.userDept = undefined;
+      form.value.businessStaff = undefined;
+      form.value.customerService = undefined;
+      form.value.businessDept = undefined;
+      // 清空收货地址显示信息
+      addressDisplay.value = {
+        receiverName: '',
+        receiverPhone: '',
+        addressDetail: ''
+      } as any;
+
+      // 如果选择了公司,加载该公司的客户列表
+      if (newVal) {
+        loadCustomerListByCompany(newVal);
+      }
+    }
+  }
+);
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderMainFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderMainVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加订单主信息';
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: OrderMainVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getOrderMain(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改订单主信息';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderMainFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      // 验证是否有商品
+      if (!productList.value || productList.value.length === 0) {
+        proxy?.$modal.msgWarning('请至少添加一个商品');
+        return;
+      }
+
+      buttonLoading.value = true;
+
+      try {
+        // 组装订单商品明细数据
+        const orderProductList = productList.value.map((product) => ({
+          productNo: product.productCode, // 产品编号
+          productName: product.productName, // 产品名称
+          productUnit: product.unit, // 产品单位
+          productImage: product.productImage, // 产品图片
+          platformPrice: product.price, // 平台价格(单价)
+          minOrderQuantity: product.minOrderQuantity, // 最小起订量
+          orderPrice: product.unitPrice, // 订单单价(含税单价)
+          orderQuantity: product.quantity, // 订购数量
+          subtotal: product.amount, // 行小计金额
+          minSellingPrice: product.certificatePrice, // 最低销售价
+          preDeliveryDate: form.value.expectedDeliveryTime, // 预计送达时间
+          status: '0' // 状态(0正常)
+        }));
+
+        // 组装提交数据
+        const submitData = {
+          ...form.value,
+          productQuantity: totalQuantity.value, // 商品总数量
+          totalAmount: totalAmount.value, // 订单总金额
+          payableAmount: payableAmount.value, // 应付金额
+          shippingFee: Number(form.value.shippingFee) || 0, // 运费
+          orderProductBos: orderProductList // 订单商品明细列表
+        };
+
+        if (form.value.id) {
+          await updateOrderMain(submitData);
+        } else {
+          await addOrderMain(submitData);
+        }
+
+        proxy?.$modal.msgSuccess('操作成功');
+        // 可以在这里添加跳转逻辑,比如返回列表页
+        router.push('/order-manage/order-list');
+      } catch (error) {
+        console.error('提交订单失败:', error);
+        proxy?.$modal.msgError('提交订单失败,请检查数据后重试');
+      } finally {
+        buttonLoading.value = false;
+      }
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: OrderMainVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delOrderMain(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'system/orderMain/export',
+    {
+      ...queryParams.value
+    },
+    `orderMain_${new Date().getTime()}.xlsx`
+  );
+};
+
+/** 选择收货地址 */
+const chooseAddress = () => {
+  if (!form.value.customerId) {
+    proxy?.$modal.msgWarning('请先选择客户');
+    return;
+  }
+  showAddressDialog.value = true;
+};
+
+/** 添加收货地址 */
+const addAddress = () => {
+  if (!form.value.customerId) {
+    proxy?.$modal.msgWarning('请先选择客户');
+    return;
+  }
+  showAddAddressDialog.value = true;
+};
+
+/** 添加地址成功回调 */
+const handleAddAddressSuccess = () => {
+  proxy?.$modal.msgSuccess('添加地址成功');
+};
+
+/** 打开添加商品对话框 */
+const handleAddProduct = () => {
+  showProductDialog.value = true;
+};
+
+/** 确认选择商品 */
+const handleProductConfirm = (product: BaseVO) => {
+  // 将商品添加到商品列表,按照新的字段映射
+  const newProduct = {
+    productCode: product.productNo, // 产品编码
+    productImage: product.productImage, // 商品图片
+    productName: product.itemName, // 产品信息
+    taxRate: product.taxRate || 0, // 税率
+    unit: product.unitId, // 单位
+    price: product.standardPrice || 0, // 单价(使用平档价)
+    certificatePrice: product.certificatePrice || 0, // 最低售价
+    minOrderQuantity: product.minOrderQuantity || 1, // 起订量
+    unitPrice: product.certificatePrice || 0, // 含税单价(默认使用最低售价)
+    quantity: product.minOrderQuantity || 1, // 数量(默认使用起订量)
+    amount: ((product.certificatePrice || 0) * (product.minOrderQuantity || 1)).toFixed(2) // 小计 = 含税单价 × 数量
+  };
+  productList.value.push(newProduct);
+  proxy?.$modal.msgSuccess('添加商品成功');
+};
+
+/** 删除商品 */
+const handleDeleteProduct = (index: number) => {
+  productList.value.splice(index, 1);
+  proxy?.$modal.msgSuccess('删除成功');
+};
+
+/** 含税单价变化时验证最低售价 */
+const handleUnitPriceChange = (index: number) => {
+  const product = productList.value[index];
+  if (product) {
+    // 如果含税单价小于最低售价,自动设置为最低售价
+    if (Number(product.unitPrice) < Number(product.certificatePrice)) {
+      product.unitPrice = product.certificatePrice;
+    }
+    // 重新计算小计:小计 = 数量 × 含税单价
+    product.amount = (Number(product.quantity) * Number(product.unitPrice)).toFixed(2);
+  }
+};
+
+/** 数量变化时重新计算金额 */
+const handleQuantityChange = (index: number) => {
+  const product = productList.value[index];
+  if (product) {
+    // 小计 = 数量 × 含税单价
+    product.amount = (Number(product.quantity) * Number(product.unitPrice)).toFixed(2);
+  }
+};
+
+/** 确认选择地址 */
+const handleAddressConfirm = (address: ShippingAddressVO) => {
+  form.value.shippingAddressId = address.id;
+  // 更新地址显示信息
+  addressDisplay.value = {
+    receiverName: address.consignee,
+    receiverPhone: address.phone,
+    receiverProvince: address.provincialCityCountry,
+    addressDetail: address.address
+  };
+};
+
+/** 获取公司列表 */
+const getCompanyList = async () => {
+  try {
+    const res = await listCompany({
+      isShow: '0',
+      pageNum: 1,
+      pageSize: 1000
+    });
+    companyList.value = res.rows || [];
+  } catch (error) {
+    console.error('获取公司列表失败:', error);
+    companyList.value = [];
+  }
+};
+
+/** 获取仓库列表 */
+const getWarehouseList = async () => {
+  try {
+    const res = await listWarehouse({
+      isShow: '0',
+      pageNum: 1,
+      pageSize: 1000
+    });
+    warehouseList.value = res.rows || [];
+  } catch (error) {
+    console.error('获取仓库列表失败:', error);
+    warehouseList.value = [];
+  }
+};
+
+/** 根据公司ID加载客户列表 */
+const loadCustomerListByCompany = async (companyId: string | number) => {
+  customerLoading.value = true;
+  try {
+    const params: CustomerInfoQuery = {
+      belongCompanyId: companyId,
+      pageNum: 1,
+      pageSize: 1000 // 加载所有客户
+    };
+    const res = await listCustomerInfo(params);
+    customerList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载客户列表失败:', error);
+    customerList.value = [];
+  } finally {
+    customerLoading.value = false;
+  }
+};
+
+/** 客户变化时获取客户详情 */
+const handleCustomerChange = async (customerId: string | number) => {
+  if (!customerId) {
+    // 清空客户相关信息
+    form.value.creditLimit = undefined;
+    form.value.shippingAddressId = undefined;
+    form.value.userDept = undefined;
+    form.value.businessStaff = undefined;
+    form.value.customerService = undefined;
+    form.value.businessDept = undefined;
+    customerDeptList.value = [];
+    // 清空收货地址显示信息
+    addressDisplay.value = {
+      receiverName: '',
+      receiverPhone: '',
+      addressDetail: ''
+    } as any;
+    return;
+  }
+
+  try {
+    // 获取客户详情
+    const res = await getCustomerInfo(customerId);
+    const customerInfo = res.data;
+
+    // 填充客户相关信息
+    if (customerInfo.customerSalesInfoVo) {
+      const salesInfo = customerInfo.customerSalesInfoVo;
+      form.value.creditLimit = salesInfo.remainingQuota || salesInfo.creditAmount;
+      // 填充业务人员、客服人员、业务部门
+      form.value.businessStaff = salesInfo.salesPerson;
+      form.value.customerService = salesInfo.serviceStaff;
+      form.value.businessDept = salesInfo.belongingDepartment;
+    }
+
+    // 获取客户部门列表
+    await getCustomerDeptList(customerId);
+  } catch (error) {
+    console.error('获取客户详情失败:', error);
+  }
+};
+
+/** 获取客户部门列表 */
+const getCustomerDeptList = async (customerId: string | number) => {
+  try {
+    const res = await listCustomerDept({
+      customerId: customerId
+    });
+    customerDeptList.value = res.rows || [];
+  } catch (error) {
+    console.error('获取客户部门列表失败:', error);
+    customerDeptList.value = [];
+  }
+};
+
+onMounted(() => {
+  getCompanyList();
+  getWarehouseList();
+});
+</script>
+
+<style scoped lang="scss">
+.order-steps {
+  padding: 10px 0;
+
+  .step-title {
+    font-size: 16px;
+    font-weight: bold;
+    color: #303133;
+  }
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-weight: bold;
+}
+
+.mb-2 {
+  margin-bottom: 16px;
+}
+
+.mt-2 {
+  margin-top: 16px;
+}
+
+.mt-4 {
+  margin-top: 32px;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+:deep(.el-form-item__label) {
+  font-weight: normal;
+}
+
+:deep(.el-card__header) {
+  padding: 12px 20px;
+  background-color: #f5f7fa;
+}
+</style>

+ 354 - 0
src/views/order/saleOrder/index.vue

@@ -0,0 +1,354 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户编号" prop="customerNo">
+              <el-input v-model="queryParams.customerNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户名称" prop="customerNo">
+              <el-input v-model="queryParams.customerName" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="订单来源" prop="orderSourse">
+              <el-select v-model="queryParams.orderSourse" placeholder="请选择订单状态" clearable>
+                <el-option v-for="dict in order_sourse" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="订单状态" prop="orderStatus">
+              <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
+                <el-option v-for="dict in order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="提交时间" prop="orderTime">
+              <el-date-picker clearable v-model="queryParams.orderTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择下单时间" />
+            </el-form-item>
+
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="10"> 销售订单信息列表 </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>关闭订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>删除订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>导出订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>全部订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>待付款</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>待发货</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>已发货</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>已完成</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>已关闭</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="orderMainList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="订单时间" align="center" prop="orderTime" />
+        <el-table-column label="订单编号" align="center" prop="orderNo" />
+        <el-table-column label="客户编号" align="center" prop="customerNo" />
+        <el-table-column label="订单总金额" align="center" prop="totalAmount" />
+        <el-table-column label="支付方式" align="center" prop="payType">
+          <template #default="scope">
+            <dict-tag :options="pay_method" :value="scope.row.payType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="业务员" align="center" prop="businessStaff" />
+        <el-table-column label="客服" align="center" prop="customerService" />
+        <el-table-column label="归属部门" align="center" prop="businessDept" />
+        <el-table-column label="订单来源" align="center" prop="orderSource">
+          <template #default="scope">
+            <dict-tag :options="order_source" :value="scope.row.orderSource" />
+          </template>
+        </el-table-column>
+        <el-table-column label="订单状态" align="center" prop="orderStatus">
+          <template #default="scope">
+            <dict-tag :options="order_status" :value="scope.row.orderStatus" />
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" @click="handleReview(scope.row)">查看订单信息</el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+  </div>
+</template>
+
+<script setup name="OrderMain" lang="ts">
+import { listOrderMain, getOrderMain, delOrderMain, addOrderMain, updateOrderMain } from '@/api/order/orderMain';
+import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_status, fee_type, pay_method, order_source } = toRefs<any>(proxy?.useDict('order_status', 'fee_type', 'pay_method', 'order_source'));
+
+const orderMainList = ref<OrderMainVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const orderMainFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: OrderMainForm = {
+  id: undefined,
+  orderNo: undefined,
+  shipmentNo: undefined,
+  subOrderNo: undefined,
+  companyId: undefined,
+  customerId: undefined,
+  userId: undefined,
+  shippingAddressId: undefined,
+  purchaseReason: undefined,
+  invoiceType: undefined,
+  payType: undefined,
+  warehouseId: undefined,
+  creditLimit: undefined,
+  expectedDeliveryTime: undefined,
+  businessStaff: undefined,
+  customerService: undefined,
+  businessDept: undefined,
+  userDept: undefined,
+  productQuantity: undefined,
+  shippingFee: undefined,
+  totalAmount: undefined,
+  payableAmount: undefined,
+  paymentStatus: undefined,
+  orderSource: undefined,
+  orderStatus: undefined,
+  orderTime: undefined,
+  confirmTime: undefined,
+  shippingTime: undefined,
+  receivingTime: undefined,
+  shippedQuantity: undefined,
+  unshippedQuantity: undefined,
+  packageCount: undefined,
+  signedQuantity: undefined,
+  afterSaleCompleted: undefined,
+  afterSalePending: undefined,
+  deliveryDesc: undefined,
+  pushStatus: undefined,
+  attachmentPath: undefined,
+  deliveryType: undefined,
+  orderCategory: undefined,
+  productCode: undefined,
+  cancelReason: undefined,
+  expenseType: undefined,
+  customerNo: undefined,
+  userNo: undefined,
+  status: undefined,
+  remark: undefined,
+  orderProductBos: [],
+  customerSalesInfoVo: {}
+};
+const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orderNo: undefined,
+    shipmentNo: undefined,
+    subOrderNo: undefined,
+    companyId: undefined,
+    customerId: undefined,
+    userId: undefined,
+    shippingAddressId: undefined,
+    purchaseReason: undefined,
+    invoiceType: undefined,
+    payType: undefined,
+    warehouseId: undefined,
+    creditLimit: undefined,
+    expectedDeliveryTime: undefined,
+    businessStaff: undefined,
+    customerService: undefined,
+    businessDept: undefined,
+    userDept: undefined,
+    productQuantity: undefined,
+    shippingFee: undefined,
+    totalAmount: undefined,
+    payableAmount: undefined,
+    paymentStatus: undefined,
+    orderSource: undefined,
+    orderStatus: undefined,
+    orderTime: undefined,
+    confirmTime: undefined,
+    shippingTime: undefined,
+    receivingTime: undefined,
+    shippedQuantity: undefined,
+    unshippedQuantity: undefined,
+    packageCount: undefined,
+    signedQuantity: undefined,
+    afterSaleCompleted: undefined,
+    afterSalePending: undefined,
+    deliveryDesc: undefined,
+    pushStatus: undefined,
+    attachmentPath: undefined,
+    deliveryType: undefined,
+    orderCategory: undefined,
+    productCode: undefined,
+    cancelReason: undefined,
+    expenseType: undefined,
+    customerNo: undefined,
+    orderSourse: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    customerId: [{ required: true, message: '客户ID不能为空', trigger: 'blur' }],
+    payType: [{ required: true, message: '支付方式不能为空', trigger: 'change' }],
+    warehouseId: [{ required: true, message: '发货仓库不能为空', trigger: 'change' }],
+    expectedDeliveryTime: [{ required: true, message: '预计送达时间不能为空', trigger: 'blur' }],
+    shippingFee: [{ required: true, message: '运费不能为空', trigger: 'blur' }],
+    confirmTime: [{ required: true, message: '确认时间不能为空', trigger: 'blur' }],
+    shippingTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }],
+    receivingTime: [{ required: true, message: '收货时间不能为空', trigger: 'blur' }],
+    cancelReason: [{ required: true, message: '取消或异常原因不能为空', trigger: 'blur' }],
+    expenseType: [{ required: true, message: '费用类型不能为空', trigger: 'change' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询订单主信息列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listOrderMain(queryParams.value);
+  orderMainList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderMainFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderMainVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+const handleReview = (row?: OrderMainVO) => {
+  router.push({
+    path: '/order-manage/order-sendDetail',
+    query: { id: row.id }
+  });
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: OrderMainVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getOrderMain(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改订单主信息';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderMainFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateOrderMain(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addOrderMain(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: OrderMainVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delOrderMain(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'system/orderMain/export',
+    {
+      ...queryParams.value
+    },
+    `orderMain_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 453 - 0
src/views/order/saleOrder/sendDetail.vue

@@ -0,0 +1,453 @@
+<template>
+  <div class="app-container">
+    <el-card shadow="never" class="mb-2">
+      <!-- 订单信息 -->
+      <el-descriptions title="订单信息" :column="2" border>
+        <el-descriptions-item label="订单编号">{{ orderDetail.orderNo }}</el-descriptions-item>
+        <el-descriptions-item label="发货单编号">{{ orderDetail.shipmentNo }}</el-descriptions-item>
+        <el-descriptions-item label="订单总金额">{{ orderDetail.totalAmount }}</el-descriptions-item>
+        <el-descriptions-item label="支付状态">
+          <dict-tag :options="payment_status" :value="orderDetail.paymentStatus" />
+        </el-descriptions-item>
+        <el-descriptions-item label="订单状态">
+          <dict-tag :options="order_status" :value="orderDetail.orderStatus" />
+        </el-descriptions-item>
+        <el-descriptions-item label="下单时间">{{ orderDetail.orderTime }}</el-descriptions-item>
+        <el-descriptions-item label="确认时间">{{ orderDetail.confirmTime }}</el-descriptions-item>
+        <el-descriptions-item label="发货时间">{{ orderDetail.shippingTime }}</el-descriptions-item>
+        <el-descriptions-item label="签收时间">{{ orderDetail.receivingTime }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 订单详情信息 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <span>订单基本信息</span>
+      </template>
+      <el-row :gutter="20">
+        <el-col :span="8">
+          <div class="detail-item">
+            <span class="label">归属公司:</span>
+            <span>{{ companyInfo.companyCode || '--' }},{{ companyInfo.companyName || '--' }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">业务人员:</span>
+            <span>{{ orderDetail.businessStaff }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">发票类型:</span>
+            <span>{{ invoiceTypeInfo.invoiceTypeNo || '--' }},{{ invoiceTypeInfo.invoiceTypeName || '--' }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">发货仓库:</span>
+            <span>{{ warehouseInfo.warehouseName || '--' }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">采购事由:</span>
+            <span>{{ orderDetail.purchaseReason }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">订单备注:</span>
+            <span>{{ orderDetail.remark }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">附件:</span>
+            <span>{{ orderDetail.attachmentPath || '' }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="detail-item">
+            <span class="label">客户名称:</span>
+            <span>{{ customerInfo.customerNo || '--' }},{{ customerInfo.customerName || '--' }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">客服人员:</span>
+            <span>{{ orderDetail.customerService }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">支付方式:</span>
+            <span>{{ getDictLabel(pay_method, orderDetail.payType) }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">费用类型:</span>
+            <span>{{ getDictLabel(fee_type, orderDetail.expenseType) }}</span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <div class="detail-item">
+            <span class="label">所属项目</span>
+            <span>{{ '--' }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">业务部门:</span>
+            <span>{{ orderDetail.businessDept }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">下单部门:</span>
+            <span>{{ orderDetail.userDept }}</span>
+          </div>
+          <div class="detail-item">
+            <span class="label">订单状态:</span>
+            <span>{{ getDictLabel(order_status, orderDetail.orderStatus) }}</span>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+
+    <!-- 收货信息 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <span>收货信息</span>
+      </template>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="收货人姓名">{{ shippingAddress.consignee }}</el-descriptions-item>
+        <el-descriptions-item label="联系电话">{{ shippingAddress.phone }}</el-descriptions-item>
+        <el-descriptions-item label="收货地址">{{ shippingAddress.provincialCityCountry }} {{ shippingAddress.address }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 商品明细 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <span>商品明细</span>
+      </template>
+      <el-table :data="productList" border style="width: 100%">
+        <el-table-column label="产品图片" width="100">
+          <template #default="scope">
+            <el-image v-if="scope.row.productImage" :src="scope.row.productImage" style="width: 60px; height: 60px" fit="cover" />
+            <span v-else>暂无图片</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="productNo" label="商品编号" />
+
+        <el-table-column prop="productName" label="商品信息" min-width="150" />
+        <el-table-column prop="taxRate" label="税率" align="center">
+          <template #default="scope"> 增值税{{ scope.row.taxRate }}% </template>
+        </el-table-column>
+        <el-table-column prop="productUnit" label="单位" />
+        <el-table-column prop="minSellingPrice" label="最低售价" />
+        <el-table-column prop="orderPrice" label="含税单价" />
+        <el-table-column prop="subtotal" label="小计" />
+        <el-table-column prop="orderQuantity" label="采购数量" />
+        <el-table-column prop="quantitySent" label="已发货数量" />
+        <el-table-column prop="unsentQuantity" label="未发货数量" />
+      </el-table>
+    </el-card>
+    <div class="mt-2 text-right">
+      <span
+        >商品数:{{ totalQuantity }}, 其中有<span style="color: #f56c6c">{{ totalQuantitySent }}已经发货</span></span
+      >
+    </div>
+    <!-- 信息汇总 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>信息汇总</span>
+        </div>
+      </template>
+
+      <el-table :data="summaryData" border style="width: 100%">
+        <el-table-column prop="quantity" label="商品数量" align="center" />
+        <el-table-column prop="shippingFee" label="运费" align="center" />
+        <el-table-column prop="totalAmount" label="订单总金额" align="center" />
+        <el-table-column prop="payableAmount" label="应付款金额" align="center" />
+      </el-table>
+    </el-card>
+
+    <!-- 发货信息 -->
+    <el-card shadow="never" class="mb-2" v-show="totalQuantitySent > 0">
+      <template #header>
+        <div class="card-header">
+          <span>发货信息:共{{ 0 }}个包裹</span>
+        </div>
+      </template>
+      <div style="white-space: nowrap" class="mb-2">
+        <span style="margin-right: 16px">发货单号:--</span>
+        <span style="margin-right: 16px">发货时间:--</span>
+        <span style="margin-right: 16px">发货方式:--</span>
+        <span style="margin-right: 16px">送货人:--</span>
+        <span style="margin-right: 16px">手机:--</span>
+        <span style="margin-right: 16px">物流状态:--</span>
+        <span>发货备注:--</span>
+      </div>
+      <el-table border style="width: 100%">
+        <el-table-column label="产品编号" align="center" />
+        <el-table-column label="商品名称" align="center" />
+        <el-table-column label="单位" align="center" />
+        <el-table-column label="发货数量" align="center" />
+      </el-table>
+    </el-card>
+
+    <!-- A10备货信息 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>A10备货信息</span>
+        </div>
+      </template>
+
+      <el-table border style="width: 100%">
+        <el-table-column label="副点人员编号" align="center" />
+        <el-table-column label="单据编号" align="center" />
+        <el-table-column label="清货人员编号" align="center" />
+        <el-table-column label="配货人员编号" align="center" />
+        <el-table-column label="快递编号" align="center" />
+        <el-table-column label="快递单号" align="center" />
+        <el-table-column label="付款方式" align="center" />
+        <el-table-column label="库存记录单号" align="center" />
+        <el-table-column label="回签信息" align="center" />
+      </el-table>
+    </el-card>
+
+    <!-- 底部按钮 -->
+    <div class="text-center mt-4">
+      <el-button @click="goBack">返回</el-button>
+      <el-button type="primary" @click="handlePrint">打印</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup name="SendDetail" lang="ts">
+import { ref, computed, onMounted } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import { getOrderMain } from '@/api/order/orderMain';
+import { OrderMainVO } from '@/api/order/orderMain/types';
+import { listOrderProduct } from '@/api/order/orderProduct';
+import { OrderProductVO } from '@/api/order/orderProduct/types';
+import { getShippingAddress } from '@/api/customer/customerFile/shippingAddress';
+import { ShippingAddressVO } from '@/api/customer/customerFile/shippingAddress/types';
+import { getWarehouse } from '@/api/company/warehouse';
+import { WarehouseVO } from '@/api/company/warehouse/types';
+import { getCompany } from '@/api/company/company';
+import { CompanyVO } from '@/api/company/company/types';
+import { getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
+import { CustomerInfoVO } from '@/api/customer/customerFile/customerInfo/types';
+import { getInvoiceType } from '@/api/customer/invoiceType';
+import { InvoiceTypeVO } from '@/api/customer/invoiceType/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_status, payment_status, fee_type, pay_method } = toRefs<any>(
+  proxy?.useDict('order_status', 'payment_status', 'fee_type', 'pay_method')
+);
+const route = useRoute();
+const router = useRouter();
+
+// 订单详情
+const orderDetail = ref<OrderMainVO>({} as OrderMainVO);
+
+// 仓库信息
+const warehouseInfo = ref<WarehouseVO>({} as WarehouseVO);
+
+// 公司信息
+const companyInfo = ref<CompanyVO>({} as CompanyVO);
+
+// 客户信息
+const customerInfo = ref<CustomerInfoVO>({} as CustomerInfoVO);
+
+// 发票类型信息
+const invoiceTypeInfo = ref<InvoiceTypeVO>({} as InvoiceTypeVO);
+
+// 商品明细列表
+const productList = ref<OrderProductVO[]>([]);
+
+// 收货地址信息
+const shippingAddress = ref<ShippingAddressVO>({} as ShippingAddressVO);
+
+// 计算商品总数(所有商品的采购数量之和)
+const totalQuantity = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.orderQuantity) || 0);
+  }, 0);
+});
+
+// 计算已发货总数(所有商品的已发货数量之和)
+const totalQuantitySent = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.quantitySent) || 0);
+  }, 0);
+});
+
+// 获取订单详情
+const getOrderDetail = async () => {
+  const orderId = route.query.id || route.params.id;
+  if (!orderId) {
+    proxy?.$modal.msgError('订单ID不能为空');
+    return;
+  }
+
+  try {
+    const res = await getOrderMain(orderId);
+    orderDetail.value = res.data;
+
+    // 获取商品明细
+    if (orderDetail.value.orderProductList) {
+      productList.value = orderDetail.value.orderProductList;
+    } else if (orderDetail.value.id) {
+      await getProductList(orderDetail.value.id);
+    }
+
+    // 获取收货地址
+    if (orderDetail.value.shippingAddressId) {
+      await getShippingAddressDetail(orderDetail.value.shippingAddressId);
+    }
+
+    // 获取仓库信息
+    if (orderDetail.value.warehouseId) {
+      await getWarehouseDetail(orderDetail.value.warehouseId);
+    }
+
+    // 获取公司信息
+    if (orderDetail.value.companyId) {
+      await getCompanyDetail(orderDetail.value.companyId);
+    }
+
+    // 获取客户信息
+    if (orderDetail.value.customerId) {
+      await getCustomerDetail(orderDetail.value.customerId);
+    }
+
+    // 获取发票类型信息
+    if (orderDetail.value.invoiceType) {
+      await getInvoiceTypeDetail(orderDetail.value.invoiceType);
+    }
+  } catch (error) {
+    console.error('获取订单详情失败:', error);
+    proxy?.$modal.msgError('获取订单详情失败');
+  }
+};
+
+// 获取商品明细列表
+const getProductList = async (orderId: string | number) => {
+  try {
+    const res = await listOrderProduct({ orderId: orderId });
+    productList.value = res.rows || [];
+  } catch (error) {
+    console.error('获取商品明细失败:', error);
+  }
+};
+
+// 获取收货地址详情
+const getShippingAddressDetail = async (addressId: string | number) => {
+  try {
+    const res = await getShippingAddress(addressId);
+    shippingAddress.value = res.data;
+  } catch (error) {
+    console.error('获取收货地址失败:', error);
+  }
+};
+
+// 计算商品总金额(所有商品的小计之和)
+const totalAmount = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.subtotal) || 0);
+  }, 0);
+});
+
+// 计算应付款金额(订单总金额 + 运费)
+const payableAmount = computed(() => {
+  const shipping = Number(orderDetail.value.shippingFee) || 0;
+  return totalAmount.value + shipping;
+});
+// 汇总数据(用于表格显示)
+const summaryData = computed(() => {
+  return [
+    {
+      quantity: totalQuantity.value,
+      shippingFee: `¥${(Number(orderDetail.value.shippingFee) || 0).toFixed(2)}`,
+      totalAmount: `¥${totalAmount.value.toFixed(2)}`,
+      payableAmount: `¥${payableAmount.value.toFixed(2)}`
+    }
+  ];
+});
+
+// 获取仓库详情
+const getWarehouseDetail = async (warehouseId: string | number) => {
+  try {
+    const res = await getWarehouse(warehouseId);
+    warehouseInfo.value = res.data;
+  } catch (error) {
+    console.error('获取仓库信息失败:', error);
+  }
+};
+
+// 获取公司详情
+const getCompanyDetail = async (companyId: string | number) => {
+  try {
+    const res = await getCompany(companyId);
+    companyInfo.value = res.data;
+  } catch (error) {
+    console.error('获取公司信息失败:', error);
+  }
+};
+
+// 获取客户详情
+const getCustomerDetail = async (customerId: string | number) => {
+  try {
+    const res = await getCustomerInfo(customerId);
+    customerInfo.value = res.data;
+  } catch (error) {
+    console.error('获取客户信息失败:', error);
+  }
+};
+
+// 获取发票类型详情
+const getInvoiceTypeDetail = async (invoiceTypeId: string | number) => {
+  try {
+    const res = await getInvoiceType(invoiceTypeId);
+    invoiceTypeInfo.value = res.data;
+  } catch (error) {
+    console.error('获取发票类型信息失败:', error);
+  }
+};
+
+// 字典label工具
+function getDictLabel(dictList: any[], value: string) {
+  if (!dictList || !Array.isArray(dictList)) return value || '--';
+  const found = dictList.find((item) => item.value === value);
+  return found ? found.label : value || '--';
+}
+
+// 返回
+const goBack = () => {
+  router.back();
+};
+
+// 打印
+const handlePrint = () => {
+  window.print();
+};
+
+onMounted(() => {
+  getOrderDetail();
+});
+</script>
+
+<style scoped lang="scss">
+.mb-2 {
+  margin-bottom: 16px;
+}
+
+.mt-4 {
+  margin-top: 32px;
+}
+
+.text-center {
+  text-align: center;
+}
+
+.detail-item {
+  padding: 8px 0;
+  line-height: 1.8;
+
+  .label {
+    color: #909399;
+    margin-right: 8px;
+  }
+}
+
+@media print {
+  .el-button {
+    display: none;
+  }
+}
+</style>