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

新增对接快递100查询物流信息 等

hurx 2 месяцев назад
Родитель
Сommit
5143b5008b

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { BusinessInfoVO, BusinessInfoForm, BusinessInfoQuery } from '@/api/customer/customerFile/businessInfo/types';
+
+/**
+ * 查询客户工商注册信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listBusinessInfo = (query?: BusinessInfoQuery): AxiosPromise<BusinessInfoVO[]> => {
+  return request({
+    url: '/customer/businessInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户工商注册信息详细
+ * @param customerId
+ */
+export const getBusinessInfo = (customerId: string | number): AxiosPromise<BusinessInfoVO> => {
+  return request({
+    url: '/customer/businessInfo/' + customerId,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户工商注册信息
+ * @param data
+ */
+export const addBusinessInfo = (data: BusinessInfoForm) => {
+  return request({
+    url: '/customer/businessInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户工商注册信息
+ * @param data
+ */
+export const updateBusinessInfo = (data: BusinessInfoForm) => {
+  return request({
+    url: '/customer/businessInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户工商注册信息
+ * @param customerId
+ */
+export const delBusinessInfo = (customerId: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/businessInfo/' + customerId,
+    method: 'delete'
+  });
+};

+ 230 - 0
src/api/customer/customerFile/businessInfo/types.ts

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

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ContractVO, ContractForm, ContractQuery } from '@/api/customer/customerFile/contract/types';
+
+/**
+ * 查询客户合同列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listContract = (query?: ContractQuery): AxiosPromise<ContractVO[]> => {
+  return request({
+    url: '/customer/contract/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户合同详细
+ * @param id
+ */
+export const getContract = (id: string | number): AxiosPromise<ContractVO> => {
+  return request({
+    url: '/customer/contract/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户合同
+ * @param data
+ */
+export const addContract = (data: ContractForm) => {
+  return request({
+    url: '/customer/contract',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户合同
+ * @param data
+ */
+export const updateContract = (data: ContractForm) => {
+  return request({
+    url: '/customer/contract',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户合同
+ * @param id
+ */
+export const delContract = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/contract/' + id,
+    method: 'delete'
+  });
+};

+ 264 - 0
src/api/customer/customerFile/contract/types.ts

@@ -0,0 +1,264 @@
+export interface ContractVO {
+  /**
+   * ID
+   */
+  id: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 客户id
+   */
+  customerId: string | number;
+
+  /**
+   * 合同编号
+   */
+  contractNo: string;
+
+  /**
+   * 合同名称
+   */
+  contractName: string;
+
+  customerName: string;
+
+  /**
+   * 合同金额
+   */
+  contractAmount: string;
+
+  /**
+   * 客服负责人
+   */
+  customerLeader: string;
+
+  /**
+   * 项目负责人
+   */
+  projectLeader: string;
+
+  /**
+   * 合同类型
+   */
+  contractType: string;
+
+  /**
+   * 合同开始时间
+   */
+  startTime: string;
+
+  /**
+   * 合同结束时间
+   */
+  endTime: string;
+
+  /**
+   * 合同上传时间
+   */
+  uploadTime: string;
+
+  /**
+   * 结算方式
+   */
+  settlementType: string;
+
+  /**
+   * 合同状态
+   */
+  contractStatus: string;
+
+  /**
+   * 审批状态(如:0-待审批,1-已通过,2-已驳回等)
+   */
+  approvalStatus: string;
+
+  /**
+   * 附件路径或信息
+   */
+  annex: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ContractForm extends BaseEntity {
+  /**
+   * ID
+   */
+  id?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  customerName?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 合同编号
+   */
+  contractNo?: string;
+
+  /**
+   * 合同名称
+   */
+  contractName?: string;
+
+  /**
+   * 合同金额
+   */
+  contractAmount?: string;
+
+  /**
+   * 客服负责人
+   */
+  customerLeader?: string;
+
+  /**
+   * 项目负责人
+   */
+  projectLeader?: string;
+
+  /**
+   * 合同类型
+   */
+  contractType?: string;
+
+  /**
+   * 合同开始时间
+   */
+  startTime?: string;
+
+  /**
+   * 合同结束时间
+   */
+  endTime?: string;
+
+  /**
+   * 合同上传时间
+   */
+  uploadTime?: string;
+
+  /**
+   * 结算方式
+   */
+  settlementType?: string;
+
+  /**
+   * 合同状态
+   */
+  contractStatus?: string;
+
+  /**
+   * 审批状态(如:0-待审批,1-已通过,2-已驳回等)
+   */
+  approvalStatus?: string;
+
+  /**
+   * 附件路径或信息
+   */
+  annex?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ContractQuery extends PageQuery {
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 合同编号
+   */
+  contractNo?: string;
+
+  /**
+   * 合同名称
+   */
+  contractName?: string;
+
+  /**
+   * 合同金额
+   */
+  contractAmount?: string;
+
+  /**
+   * 客服负责人
+   */
+  customerLeader?: string;
+
+  /**
+   * 项目负责人
+   */
+  projectLeader?: string;
+
+  /**
+   * 合同类型
+   */
+  contractType?: string;
+
+  /**
+   * 合同开始时间
+   */
+  startTime?: string;
+
+  /**
+   * 合同结束时间
+   */
+  endTime?: string;
+
+  /**
+   * 合同上传时间
+   */
+  uploadTime?: string;
+
+  /**
+   * 结算方式
+   */
+  settlementType?: string;
+
+  /**
+   * 合同状态
+   */
+  contractStatus?: string;
+
+  /**
+   * 审批状态(如:0-待审批,1-已通过,2-已驳回等)
+   */
+  approvalStatus?: string;
+
+  /**
+   * 附件路径或信息
+   */
+  annex?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { CustomerContactVO, CustomerContactForm, CustomerContactQuery } from '@/api/customer/customerFile/customerContact/types';
+
+/**
+ * 查询客户联系人信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listCustomerContact = (query?: CustomerContactQuery): AxiosPromise<CustomerContactVO[]> => {
+  return request({
+    url: '/customer/customerContact/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户联系人信息详细
+ * @param id
+ */
+export const getCustomerContact = (id: string | number): AxiosPromise<CustomerContactVO> => {
+  return request({
+    url: '/customer/customerContact/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户联系人信息
+ * @param data
+ */
+export const addCustomerContact = (data: CustomerContactForm) => {
+  return request({
+    url: '/customer/customerContact',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户联系人信息
+ * @param data
+ */
+export const updateCustomerContact = (data: CustomerContactForm) => {
+  return request({
+    url: '/customer/customerContact',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户联系人信息
+ * @param id
+ */
+export const delCustomerContact = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/customerContact/' + id,
+    method: 'delete'
+  });
+};

+ 261 - 0
src/api/customer/customerFile/customerContact/types.ts

@@ -0,0 +1,261 @@
+export interface CustomerContactVO {
+  /**
+   * 联系人ID
+   */
+  id: string | number;
+
+  /**
+   * 所属客户ID
+   */
+  customerId: string | number;
+
+  /**
+   * 联系人姓名
+   */
+  contactName: string;
+
+  customLoginName: string;
+
+  /**
+   * 手机号码
+   */
+  phone: string;
+
+  /**
+   * 办公电话
+   */
+  officePhone: string;
+
+  /**
+   * 办公电话2
+   */
+  officePhoneTwo: string;
+
+  /**
+   * 性别
+   */
+  gender: string;
+
+  /**
+   * 采购角色(如:采购经理、财务)
+   */
+  roleId: string | number;
+
+  deptId: string | number;
+
+  /**
+   * 是否主联系人:0=是,1=否
+   */
+  isPrimary: string;
+
+  birthday: Date;
+
+  /**
+   * 详细地址
+   */
+  addressDetail: string;
+
+  /**
+   * 所在省编码
+   */
+  addressProvince: string;
+
+  /**
+   * 所在市编码
+   */
+  addressCity: string;
+
+  /**
+   * 所在区县编码
+   */
+  addressCounty: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface CustomerContactForm extends BaseEntity {
+  /**
+   * 联系人ID
+   */
+  id?: string | number;
+
+  /**
+   * 所属客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 联系人姓名
+   */
+  contactName?: string;
+
+  customLoginName?: string;
+
+  /**
+   * 手机号码
+   */
+  phone?: string;
+
+  /**
+   * 办公电话
+   */
+  officePhone?: string;
+
+  /**
+   * 办公电话2
+   */
+  officePhoneTwo?: string;
+
+  /**
+   * 性别
+   */
+  gender?: string;
+
+  /**
+   * 采购角色(如:采购经理、财务)
+   */
+  roleId?: string | number;
+
+  deptId?: string | number;
+
+  email: string;
+
+  /**
+   * 是否主联系人:0=是,1=否
+   */
+  isPrimary?: string;
+
+  birthday?: Date;
+
+  /**
+   * 详细地址
+   */
+  addressDetail?: string;
+
+  /**
+   * 所在省编码
+   */
+  addressProvince?: string;
+
+  /**
+   * 所在市编码
+   */
+  addressCity?: string;
+
+  /**
+   * 所在区县编码
+   */
+  addressCounty?: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface CustomerContactQuery extends PageQuery {
+  /**
+   * 所属客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 联系人姓名
+   */
+  contactName?: string;
+
+  /**
+   * 手机号码
+   */
+  phone?: string;
+
+  email?: string;
+
+  /**
+   * 办公电话
+   */
+  officePhone?: string;
+
+  /**
+   * 办公电话2
+   */
+  officePhoneTwo?: string;
+
+  /**
+   * 性别
+   */
+  gender?: string;
+
+  /**
+   * 采购角色(如:采购经理、财务)
+   */
+  roleId?: string | number;
+
+  /**
+   * 是否主联系人:0=是,1=否
+   */
+  isPrimary?: string;
+
+  /**
+   * 详细地址
+   */
+  addressDetail?: string;
+
+  /**
+   * 所在省编码
+   */
+  addressProvince?: string;
+
+  /**
+   * 所在市编码
+   */
+  addressCity?: string;
+
+  /**
+   * 所在区县编码
+   */
+  addressCounty?: string;
+
+  /**
+   * 省市区
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { InvoiceInfoVO, InvoiceInfoForm, InvoiceInfoQuery } from '@/api/customer/customerFile/invoiceInfo/types';
+
+/**
+ * 查询客户开票信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listInvoiceInfo = (query?: InvoiceInfoQuery): AxiosPromise<InvoiceInfoVO[]> => {
+  return request({
+    url: '/customer/invoiceInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户开票信息详细
+ * @param id
+ */
+export const getInvoiceInfo = (id: string | number): AxiosPromise<InvoiceInfoVO> => {
+  return request({
+    url: '/customer/invoiceInfo/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户开票信息
+ * @param data
+ */
+export const addInvoiceInfo = (data: InvoiceInfoForm) => {
+  return request({
+    url: '/customer/invoiceInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户开票信息
+ * @param data
+ */
+export const updateInvoiceInfo = (data: InvoiceInfoForm) => {
+  return request({
+    url: '/customer/invoiceInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户开票信息
+ * @param id
+ */
+export const delInvoiceInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/invoiceInfo/' + id,
+    method: 'delete'
+  });
+};

+ 185 - 0
src/api/customer/customerFile/invoiceInfo/types.ts

@@ -0,0 +1,185 @@
+export interface InvoiceInfoVO {
+  /**
+   * 开票信息ID
+   */
+  id: string | number;
+
+  /**
+   * 所属客户ID
+   */
+  customerId: string | number;
+
+  /**
+   * 纳税人识别号
+   */
+  taxId: string | number;
+
+  /**
+   * 开户行行号
+   */
+  bankCode: string;
+
+  /**
+   * 开户行
+   */
+  bankId: string | number;
+
+  /**
+   * 开户行名称
+   */
+  bankName: string;
+
+  /**
+   * 银行账户
+   */
+  bankAccount: string;
+
+  /**
+   * 联系电话
+   */
+  phone: string;
+
+  /**
+   * 开户行地址
+   */
+  address: string;
+
+  /**
+   * 是否主账号:0=是,1=否
+   */
+  isPrimaryAccount: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface InvoiceInfoForm extends BaseEntity {
+  /**
+   * 开票信息ID
+   */
+  id?: string | number;
+
+  /**
+   * 所属客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 纳税人识别号
+   */
+  taxId?: string | number;
+
+  /**
+   * 开户行行号
+   */
+  bankCode?: string;
+
+  /**
+   * 开户行
+   */
+  bankId?: string | number;
+
+  /**
+   * 开户行名称
+   */
+  bankName?: string;
+
+  /**
+   * 银行账户
+   */
+  bankAccount?: string;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 开户行地址
+   */
+  address?: string;
+
+  /**
+   * 是否主账号:0=是,1=否
+   */
+  isPrimaryAccount?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface InvoiceInfoQuery extends PageQuery {
+  /**
+   * 所属客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 纳税人识别号
+   */
+  taxId?: string | number;
+
+  /**
+   * 开户行行号
+   */
+  bankCode?: string;
+
+  /**
+   * 开户行
+   */
+  bankId?: string | number;
+
+  /**
+   * 开户行名称
+   */
+  bankName?: string;
+
+  /**
+   * 银行账户
+   */
+  bankAccount?: string;
+
+  /**
+   * 联系电话
+   */
+  phone?: string;
+
+  /**
+   * 开户行地址
+   */
+  address?: string;
+
+  /**
+   * 是否主账号:0=是,1=否
+   */
+  isPrimaryAccount?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { SalesInfoVO, SalesInfoForm, SalesInfoQuery } from '@/api/customer/customerFile/salesInfo/types';
+
+/**
+ * 查询客户销售信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listSalesInfo = (query?: SalesInfoQuery): AxiosPromise<SalesInfoVO[]> => {
+  return request({
+    url: '/customer/salesInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询客户销售信息详细
+ * @param id
+ */
+export const getSalesInfo = (id: string | number): AxiosPromise<SalesInfoVO> => {
+  return request({
+    url: '/customer/salesInfo/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增客户销售信息
+ * @param data
+ */
+export const addSalesInfo = (data: SalesInfoForm) => {
+  return request({
+    url: '/customer/salesInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改客户销售信息
+ * @param data
+ */
+export const updateSalesInfo = (data: SalesInfoForm) => {
+  return request({
+    url: '/customer/salesInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除客户销售信息
+ * @param id
+ */
+export const delSalesInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/customer/salesInfo/' + id,
+    method: 'delete'
+  });
+};

+ 275 - 0
src/api/customer/customerFile/salesInfo/types.ts

@@ -0,0 +1,275 @@
+export interface SalesInfoVO {
+  /**
+   * 销售信息ID
+   */
+  id: string | number;
+
+  /**
+   * 关联客户ID
+   */
+  customerId: string | number;
+
+  /**
+   * 信用额度
+   */
+  creditAmount: number;
+
+  /**
+   * 剩余额度
+   */
+  remainingQuota: number;
+
+  /**
+   * 临时额度
+   */
+  temporaryQuota: number;
+
+  /**
+   * 账期(如:30天)
+   */
+  accountPeriod: string;
+
+  /**
+   * 账单日(每月几号)
+   */
+  billDate: number;
+
+  /**
+   * 计费日(如:每月1日)
+   */
+  billingDay: number;
+
+  /**
+   * 订单审核方式
+   */
+  orderAudit: string;
+
+  /**
+   * 信用管理方式
+   */
+  creditManagementId: number | string;
+
+  /**
+   * 信用支付密码
+   */
+  creditPaymentPassword: string;
+
+  /**
+   * 付款天数
+   */
+  payDays: number;
+
+  /**
+   * 销售人员
+   */
+  salesPersonId: string | number;
+
+  /**
+   * 服务人员
+   */
+  serviceStaffId: string | number;
+
+  /**
+   * 所属部门
+   */
+  belongingDepartmentId: string | number;
+
+  /**
+   * 应收账款
+   */
+  accountsReceivable: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface SalesInfoForm extends BaseEntity {
+  /**
+   * 销售信息ID
+   */
+  id?: string | number;
+
+  /**
+   * 关联客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 信用额度
+   */
+  creditAmount?: number;
+
+  /**
+   * 剩余额度
+   */
+  remainingQuota?: number;
+
+  /**
+   * 临时额度
+   */
+  temporaryQuota?: number;
+
+  /**
+   * 账期(如:30天)
+   */
+  accountPeriod?: string;
+
+  /**
+   * 账单日(每月几号)
+   */
+  billDate?: number;
+
+  /**
+   * 计费日(如:每月1日)
+   */
+  billingDay?: number;
+
+  /**
+   * 订单审核方式
+   */
+  orderAudit?: string;
+
+  /**
+   * 信用管理方式
+   */
+  creditManagementId?: number | string;
+
+  /**
+   * 信用支付密码
+   */
+  creditPaymentPassword?: string;
+
+  /**
+   * 付款天数
+   */
+  payDays?: number;
+
+  /**
+   * 销售人员
+   */
+  salesPersonId?: string | number;
+
+  /**
+   * 服务人员
+   */
+  serviceStaffId?: string | number;
+
+  /**
+   * 所属部门
+   */
+  belongingDepartmentId?: string | number;
+
+  /**
+   * 应收账款
+   */
+  accountsReceivable?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface SalesInfoQuery extends PageQuery {
+  /**
+   * 关联客户ID
+   */
+  customerId?: string | number;
+
+  /**
+   * 信用额度
+   */
+  creditAmount?: number;
+
+  /**
+   * 剩余额度
+   */
+  remainingQuota?: number;
+
+  /**
+   * 临时额度
+   */
+  temporaryQuota?: number;
+
+  /**
+   * 账期(如:30天)
+   */
+  accountPeriod?: string;
+
+  /**
+   * 账单日(每月几号)
+   */
+  billDate?: number;
+
+  /**
+   * 计费日(如:每月1日)
+   */
+  billingDay?: number;
+
+  /**
+   * 订单审核方式
+   */
+  orderAudit?: string;
+
+  /**
+   * 信用管理方式
+   */
+  creditManagementId?: number | string;
+
+  /**
+   * 信用支付密码
+   */
+  creditPaymentPassword?: string;
+
+  /**
+   * 付款天数
+   */
+  payDays?: number;
+
+  /**
+   * 销售人员
+   */
+  salesPersonId?: string | number;
+
+  /**
+   * 服务人员
+   */
+  serviceStaffId?: string | number;
+
+  /**
+   * 所属部门
+   */
+  belongingDepartmentId?: string | number;
+
+  /**
+   * 应收账款
+   */
+  accountsReceivable?: number;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 6 - 1
src/api/order/orderAssignmentLog/types.ts

@@ -108,10 +108,15 @@ export interface OrderSplitAssignForm extends BaseEntity {
 
   remark?: string;
 }
+
 export interface OrderProductAssignRule {
   itemId?: string | number;
 
-  targetPlatform?: string;
+  assigneeId?: string | number; // 供应商ID 或 伙伴商ID
+
+  assigneeType?: string; // "srm" 或 "bp"
+
+  targetPlatform?: string; // 保留旧字段以兼容
 }
 
 export interface OrderAssignmentQuery extends PageQuery {

+ 14 - 0
src/api/order/orderDeliver/index.ts

@@ -61,3 +61,17 @@ export const delOrderDeliver = (id: string | number | Array<string | number>) =>
     method: 'delete'
   });
 };
+
+/**
+ * 查询订单发货物流信息
+ * @param query
+ * @returns {*}
+ */
+
+export const queryTrack = (query?: OrderDeliverQuery): AxiosPromise<OrderDeliverVO[]> => {
+  return request({
+    url: '/order/orderDeliver/queryTrack',
+    method: 'get',
+    params: query
+  });
+};

+ 12 - 2
src/api/order/orderDeliver/types.ts

@@ -52,7 +52,12 @@ export interface OrderDeliverVO {
   /**
    * 承运物流公司
    */
-  logisticsCompany: number;
+  logisticsCompanyId: number;
+
+  /**
+   * 承运物流公司编码
+   */
+  logisticsCompanyCode: string;
 
   /**
    * 物流单号
@@ -133,7 +138,12 @@ export interface OrderDeliverForm extends BaseEntity {
   /**
    * 承运物流公司
    */
-  logisticsCompany?: number;
+  logisticsCompanyId?: number;
+
+  /**
+   * 承运物流公司编码
+   */
+  logisticsCompanyCode?: string;
 
   /**
    * 物流单号

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

@@ -89,6 +89,11 @@ export const queryOrderStatusStats = () => {
   });
 };
 
+/**
+ * 修改审核状态
+ * @param id
+ * @param checkStatus
+ */
 export function changeCheckStatus(id: string | number, checkStatus: string) {
   const data = {
     id,
@@ -100,3 +105,20 @@ export function changeCheckStatus(id: string | number, checkStatus: string) {
     data: data
   });
 }
+
+/**
+ * 修改订单状态
+ * @param id
+ * @param orderStatus
+ */
+export function changeStatus(id: string | number, orderStatus: string) {
+  const data = {
+    id,
+    orderStatus
+  };
+  return request({
+    url: '/order/orderMain/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

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

@@ -34,6 +34,8 @@ export interface OrderMainVO {
    */
   customerCode: string;
 
+  customerName: string;
+
   /**
    * 用户ID(关联用户表)
    */
@@ -99,6 +101,21 @@ export interface OrderMainVO {
    */
   productQuantity: number;
 
+  /**
+   * 商品种数
+   */
+  productTotal: number;
+
+  /**
+   * 已分配数量
+   */
+  assigned: number;
+
+  /**
+   * 未分配数量
+   */
+  unassigned: number;
+
   /**
    * 运费(元)
    */

+ 8 - 8
src/views/order/orderAssignment/index.vue

@@ -24,7 +24,7 @@
               </el-select>
             </el-form-item> -->
 
-            <el-form-item label="提交时间" prop="dateRange">
+            <el-form-item label="订单时间" prop="dateRange">
               <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
             </el-form-item>
 
@@ -41,7 +41,7 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="18"> 订单分配列表 </el-col>
-          <el-col :span="1.5">
+          <!-- <el-col :span="1.5">
             <el-button type="primary" :disabled="!ids.length" plain @click="handleAssignment(null)">批量整单分配</el-button>
           </el-col>
           <el-col :span="1.5">
@@ -52,7 +52,7 @@
           </el-col>
           <el-col :span="1.5">
             <el-button type="primary" :disabled="!ids.length" plain>导出订单</el-button>
-          </el-col>
+          </el-col> -->
         </el-row>
       </template>
 
@@ -80,17 +80,17 @@
             <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
           </template>
         </el-table-column>
-        <el-table-column label="当前平台" align="center" prop="platformCode">
+        <!-- <el-table-column label="当前平台" align="center" prop="platformCode">
           <template #default="scope">
             <dict-tag :options="sys_platform_code" :value="scope.row.platformCode" />
           </template>
-        </el-table-column>
+        </el-table-column> -->
 
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="180">
           <template #default="scope">
-            <el-button link type="primary" @click="handleReview(scope.row)">查看</el-button>
-            <el-button link type="primary" v-if="scope.row.assignmentStatus == '0'" @click="handleAssignment(scope.row)">订单分配</el-button>
-            <el-button link type="primary" v-if="scope.row.assignmentStatus == '1'" @click="handleAssignment(scope.row)">重新分配</el-button>
+            <el-button link type="primary" @click="handleReview(scope.row)">详情</el-button>
+            <el-button link type="primary" v-if="scope.row.assignmentStatus != '1'" @click="handleAssignment(scope.row)">分配</el-button>
+            <!-- <el-button link type="primary" v-if="scope.row.assignmentStatus == '1'" @click="handleAssignment(scope.row)">重新分配</el-button> -->
           </template>
         </el-table-column>
       </el-table>

+ 328 - 0
src/views/order/orderAssignment/splitAssignDialog copy.vue

@@ -0,0 +1,328 @@
+<template>
+  <el-drawer v-model="drawer.visible" :title="drawer.title" size="70%" direction="rtl" :before-close="handleClose">
+    <div class="drawer-content">
+      <!-- 分配方式选择 -->
+      <div class="assign-type-selector">
+        <el-radio-group v-model="assignType" @change="handleAssignTypeChange">
+          <el-radio-button value="whole">整单分配</el-radio-button>
+          <el-radio-button value="split">拆单分配</el-radio-button>
+        </el-radio-group>
+      </div>
+
+      <el-divider />
+
+      <!-- 整单分配表单 -->
+      <div v-show="assignType === 'whole'" class="whole-assign-form">
+        <el-form ref="wholeAssignFormRef" :model="wholeForm" :rules="wholeRules" label-width="120px">
+          <el-form-item label="订单编号" v-if="orderInfo.orderNo">
+            <span class="form-value">{{ orderInfo.orderNo }}</span>
+          </el-form-item>
+
+          <el-form-item label="当前平台" v-if="orderInfo.platformCode">
+            <dict-tag :options="sys_platform_code" :value="orderInfo.platformCode" />
+          </el-form-item>
+
+          <el-form-item label="分配后平台" prop="platformAfter">
+            <el-select v-model="wholeForm.platformAfter" placeholder="请选择平台" style="width: 100%" filterable clearable>
+              <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+            </el-select>
+          </el-form-item>
+
+          <el-divider content-position="left">分配原因</el-divider>
+
+          <el-form-item label-width="0" prop="remark">
+            <el-input v-model="wholeForm.remark" type="textarea" :rows="6" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <!-- 拆单分配表单 -->
+      <div v-show="assignType === 'split'" class="split-assign-form">
+        <el-form ref="splitAssignFormRef" :model="form" label-width="100px">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="订单编号">
+                <span class="form-value">{{ orderInfo.orderNo }}</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="当前平台">
+                <dict-tag :options="sys_platform_code" :value="orderInfo.platformCode" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-divider content-position="left">商品列表</el-divider>
+
+          <el-form-item label-width="0">
+            <el-table :data="form.productList" border style="width: 100%" max-height="500">
+              <el-table-column type="index" label="序号" width="60" align="center" />
+              <el-table-column label="商品图片" width="100" align="center">
+                <template #default="scope">
+                  <el-image
+                    v-if="scope.row.productImage"
+                    :src="scope.row.productImage"
+                    style="width: 60px; height: 60px"
+                    fit="cover"
+                    :preview-src-list="[scope.row.productImage]"
+                  />
+                  <span v-else style="color: #999">暂无图片</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="商品编号" prop="productNo" width="140" align="center" />
+              <el-table-column label="商品名称" prop="productName" show-overflow-tooltip />
+              <el-table-column label="数量" prop="orderQuantity" width="100" align="center" />
+              <el-table-column label="单价" prop="orderPrice" width="120" align="center">
+                <template #default="scope">
+                  <span>¥{{ scope.row.orderPrice }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="小计" width="120" align="center">
+                <template #default="scope">
+                  <span>¥{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="分配平台" align="center" fixed="right">
+                <template #default="scope">
+                  <el-select v-model="scope.row.targetPlatform" placeholder="请选择平台" style="width: 100%">
+                    <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+                  </el-select>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form-item>
+
+          <el-divider content-position="left">分配原因</el-divider>
+
+          <el-form-item label-width="0" prop="remark">
+            <el-input v-model="form.remark" type="textarea" :rows="4" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="drawer-footer">
+        <el-button @click="cancel">取 消</el-button>
+        <el-button v-if="assignType === 'whole'" :loading="buttonLoading" type="primary" @click="submitWholeForm">确 定</el-button>
+        <el-button v-else :loading="buttonLoading" type="primary" @click="submitSplitForm">确 定</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<style scoped lang="scss">
+.drawer-content {
+  padding: 0 20px 20px;
+  height: calc(100% - 60px);
+  overflow-y: auto;
+}
+
+.assign-type-selector {
+  display: flex;
+  justify-content: center;
+  padding: 10px 0;
+
+  :deep(.el-radio-button__inner) {
+    padding: 12px 30px;
+    font-size: 14px;
+  }
+}
+
+.drawer-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+  padding: 10px 20px;
+  border-top: 1px solid #e4e7ed;
+}
+
+.form-value {
+  font-weight: 500;
+  color: #303133;
+}
+
+:deep(.el-divider__text) {
+  font-weight: 600;
+  font-size: 14px;
+}
+</style>
+
+<script setup name="SplitAssignDialog" lang="ts">
+import { getOrderMain } from '@/api/order/orderMain';
+import { addOrderSplitAssign, addOrderAssignment } from '@/api/order/orderAssignmentLog';
+import { OrderSplitAssignForm, OrderProductAssignRule, OrderAssignmentForm } from '@/api/order/orderAssignmentLog/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_code } = toRefs<any>(proxy?.useDict('sys_platform_code'));
+
+const emit = defineEmits(['success']);
+
+const buttonLoading = ref(false);
+const splitAssignFormRef = ref<ElFormInstance>();
+const wholeAssignFormRef = ref<ElFormInstance>();
+
+// 分配类型:whole-整单分配,split-拆单分配
+const assignType = ref<'whole' | 'split'>('whole');
+
+const drawer = reactive<DialogOption>({
+  visible: false,
+  title: '订单分配'
+});
+
+const orderInfo = ref<any>({
+  orderNo: '',
+  id: undefined,
+  platformCode: ''
+});
+
+// 拆单分配表单
+const form = reactive({
+  productList: [] as any[],
+  remark: ''
+});
+
+// 整单分配表单
+const wholeForm = reactive({
+  platformAfter: '',
+  remark: ''
+});
+
+const wholeRules = {
+  platformAfter: [{ required: true, message: '分配后平台不能为空', trigger: 'blur' }]
+};
+
+/** 打开对话框 */
+const open = async (orderId: string | number) => {
+  reset();
+  drawer.visible = true;
+  assignType.value = 'whole'; // 默认显示整单分配
+
+  try {
+    // 获取订单详情
+    const res = await getOrderMain(orderId);
+    orderInfo.value = {
+      orderNo: res.data.orderNo,
+      id: res.data.id,
+      platformCode: res.data.platformCode
+    };
+
+    // 加载订单商品列表(用于拆单分配)
+    if (res.data.orderProductList && res.data.orderProductList.length > 0) {
+      form.productList = res.data.orderProductList.map((item: any) => ({
+        ...item,
+        itemId: item.id, // 商品行ID
+        targetPlatform: '' // 初始化分配平台为空
+      }));
+    }
+  } catch (error) {
+    proxy?.$modal.msgError('获取订单信息失败');
+    drawer.visible = false;
+  }
+};
+
+/** 分配类型切换 */
+const handleAssignTypeChange = (value: 'whole' | 'split') => {
+  // 切换时可以做一些清理工作
+  if (value === 'split' && form.productList.length === 0) {
+    proxy?.$modal.msgWarning('该订单没有商品信息,无法进行拆单分配');
+    assignType.value = 'whole';
+  }
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.productList = [];
+  form.remark = '';
+  wholeForm.platformAfter = '';
+  wholeForm.remark = '';
+  assignType.value = 'whole';
+  orderInfo.value = {
+    orderNo: '',
+    id: undefined,
+    platformCode: ''
+  };
+  splitAssignFormRef.value?.resetFields();
+  wholeAssignFormRef.value?.resetFields();
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  drawer.visible = false;
+  reset();
+};
+
+/** 关闭前的回调 */
+const handleClose = (done: () => void) => {
+  if (buttonLoading.value) {
+    return;
+  }
+  done();
+  reset();
+};
+
+/** 提交整单分配 */
+const submitWholeForm = async () => {
+  wholeAssignFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      try {
+        const submitData: OrderAssignmentForm = {
+          orderIds: orderInfo.value.id,
+          platformAfter: wholeForm.platformAfter,
+          assignType: '0', // 整单分配
+          remark: wholeForm.remark
+        };
+
+        await addOrderAssignment(submitData);
+        proxy?.$modal.msgSuccess('整单分配成功');
+        drawer.visible = false;
+        emit('success');
+      } catch (error) {
+        proxy?.$modal.msgError('整单分配失败');
+      } finally {
+        buttonLoading.value = false;
+      }
+    }
+  });
+};
+
+/** 提交拆单分配 */
+const submitSplitForm = async () => {
+  // 验证每个商品都选择了平台
+  const unassignedProducts = form.productList.filter((item) => !item.targetPlatform);
+  if (unassignedProducts.length > 0) {
+    proxy?.$modal.msgWarning('请为所有商品选择分配平台');
+    return;
+  }
+
+  buttonLoading.value = true;
+  try {
+    // 组装数据结构
+    const submitData: OrderSplitAssignForm = {
+      orderId: orderInfo.value.id,
+      itemRules: form.productList.map(
+        (product): OrderProductAssignRule => ({
+          itemId: product.itemId,
+          targetPlatform: product.targetPlatform
+        })
+      ),
+      remark: form.remark
+    };
+
+    // 调用拆单分配接口
+    await addOrderSplitAssign(submitData);
+    proxy?.$modal.msgSuccess('拆单分配成功');
+    drawer.visible = false;
+    emit('success');
+  } catch (error) {
+    proxy?.$modal.msgError('拆单分配失败');
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+defineExpose({
+  open
+});
+</script>

+ 508 - 225
src/views/order/orderAssignment/splitAssignDialog.vue

@@ -1,202 +1,323 @@
 <template>
-  <el-drawer v-model="drawer.visible" :title="drawer.title" size="70%" direction="rtl" :before-close="handleClose">
-    <div class="drawer-content">
-      <!-- 分配方式选择 -->
-      <div class="assign-type-selector">
-        <el-radio-group v-model="assignType" @change="handleAssignTypeChange">
-          <el-radio-button value="whole">整单分配</el-radio-button>
-          <el-radio-button value="split">拆单分配</el-radio-button>
-        </el-radio-group>
+  <!-- 订单分配详情抽屉 -->
+  <el-drawer v-model="drawer.visible" size="65%" direction="rtl" :close-on-click-modal="true" :before-close="handleDrawerClose">
+    <template #header>
+      <div class="drawer-header">
+        <!-- <el-icon color="#f56c6c" :size="24"><WarningFilled /></el-icon> -->
+        <span class="order-title">订单分配 {{ orderInfo.orderNo }}</span>
       </div>
+    </template>
 
-      <el-divider />
-
-      <!-- 整单分配表单 -->
-      <div v-show="assignType === 'whole'" class="whole-assign-form">
-        <el-form ref="wholeAssignFormRef" :model="wholeForm" :rules="wholeRules" label-width="120px">
-          <el-form-item label="订单编号" v-if="orderInfo.orderNo">
-            <span class="form-value">{{ orderInfo.orderNo }}</span>
-          </el-form-item>
-
-          <el-form-item label="当前平台" v-if="orderInfo.platformCode">
-            <dict-tag :options="sys_platform_code" :value="orderInfo.platformCode" />
-          </el-form-item>
-
-          <el-form-item label="分配后平台" prop="platformAfter">
-            <el-select v-model="wholeForm.platformAfter" placeholder="请选择平台" style="width: 100%" filterable clearable>
-              <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
-            </el-select>
-          </el-form-item>
+    <div class="drawer-content">
+      <div class="detail-header">
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <div class="info-item">
+              <span class="label">客户</span>
+              <span class="value">{{ orderInfo.customerName }}</span>
+            </div>
+          </el-col>
+          <el-col :span="6">
+            <div class="info-item">
+              <span class="label">负责人</span>
+              <span class="value">{{ orderInfo.businessStaff }}</span>
+            </div>
+          </el-col>
+          <el-col :span="4">
+            <div class="info-item">
+              <span class="label">商品总数</span>
+              <span class="value">{{ orderInfo.productTotal }}</span>
+            </div>
+          </el-col>
+          <el-col :span="4">
+            <div class="info-item">
+              <span class="label">待分配</span>
+              <span class="value">{{ orderInfo.unassigned }}</span>
+            </div>
+          </el-col>
+          <el-col :span="4">
+            <div class="info-item">
+              <span class="label">已分配</span>
+              <span class="value">{{ orderInfo.assigned }}</span>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
 
-          <el-divider content-position="left">分配原因</el-divider>
+      <el-tabs v-model="activeTab" class="detail-tabs">
+        <el-tab-pane label="待分配" name="pending">
+          <div class="tab-actions">
+            <el-button type="primary" @click="handleBatchAssign">+ 批量分配</el-button>
+          </div>
+          <el-table
+            ref="pendingTableRef"
+            :data="pendingProducts"
+            border
+            style="width: 100%"
+            max-height="400"
+            @selection-change="handlePendingSelectionChange"
+          >
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="序号" width="80" align="center">
+              <template #default="scope">{{ scope.$index + 1 }}</template>
+            </el-table-column>
+            <el-table-column label="商品图片" width="100" align="center">
+              <template #default="scope">
+                <el-image
+                  v-if="scope.row.productImage"
+                  :src="scope.row.productImage"
+                  style="width: 60px; height: 60px"
+                  fit="cover"
+                  :preview-src-list="[scope.row.productImage]"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="商品编号" prop="productNo" align="center" />
+            <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip align="center" />
+            <el-table-column label="数量" prop="orderQuantity" align="center" />
+            <el-table-column label="单价" prop="orderPrice" align="center" />
+            <el-table-column label="小计" align="center">
+              <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
+            </el-table-column>
+            <el-table-column label="状态" width="100" align="center">
+              <template #default="scope">
+                <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="120" align="center" fixed="right">
+              <template #default="scope">
+                <el-button link type="primary" size="small" @click="handleAssignProduct(scope.row)">分配</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
+
+        <el-tab-pane label="已分配" name="assigned">
+          <el-table :data="assignedProducts" border style="width: 100%" max-height="400">
+            <el-table-column label="序号" width="80" align="center">
+              <template #default="scope">{{ scope.$index + 1 }}</template>
+            </el-table-column>
+            <el-table-column label="商品图片" width="100" align="center">
+              <template #default="scope">
+                <el-image
+                  v-if="scope.row.productImage"
+                  :src="scope.row.productImage"
+                  style="width: 60px; height: 60px"
+                  fit="cover"
+                  :preview-src-list="[scope.row.productImage]"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="商品编号" prop="productNo" align="center" />
+            <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip align="center" />
+            <el-table-column label="数量" prop="orderQuantity" align="center" />
+            <el-table-column label="单价" prop="orderPrice" align="center" />
+            <el-table-column label="小计" align="center">
+              <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
+            </el-table-column>
+            <el-table-column label="状态" width="100" align="center">
+              <template #default="scope">
+                <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="150" align="center" fixed="right">
+              <template #default="scope">
+                <el-button link type="warning" size="small" @click="handleReassign(scope.row)">转分配</el-button>
+                <el-button link type="primary" size="small" @click="handleAssignProduct(scope.row)">分配</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
+
+        <el-tab-pane label="记录" name="record">
+          <el-table :data="assignRecords" border style="width: 100%" max-height="400">
+            <el-table-column label="序号" type="index" width="80" align="center" />
+            <el-table-column label="分配时间" prop="assignTime" align="center" />
+            <el-table-column label="分配人" prop="assignedBy" align="center" />
+            <el-table-column label="分配目标" prop="assignTarget" align="center" />
+            <el-table-column label="商品数量" prop="productCount" align="center" />
+            <el-table-column label="备注" prop="remark" min-width="200" show-overflow-tooltip />
+          </el-table>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </el-drawer>
 
-          <el-form-item label-width="0" prop="remark">
-            <el-input v-model="wholeForm.remark" type="textarea" :rows="6" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
-          </el-form-item>
-        </el-form>
+  <!-- 分配对话框 -->
+  <el-dialog v-model="assignDialog.visible" title="分配" width="60%" :close-on-click-modal="false">
+    <div class="assign-dialog-content">
+      <!-- 提示信息 -->
+      <!-- <el-alert
+        title="说明:根据是自营还是伙伴商去进行展示分配给供应商还是伙伴商"
+        type="warning"
+        :closable="false"
+        show-icon
+        style="margin-bottom: 20px"
+      /> -->
+
+      <!-- 分配目标选择 -->
+      <div class="assign-target-section">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <div class="target-input-wrapper">
+              <span class="required-mark">*</span>
+              <span class="label">分配对象类型:</span>
+              <el-select v-model="assignForm.targetType" placeholder="请选择分配对象类型" clearable style="flex: 1" @change="handleTargetTypeChange">
+                <el-option label="SRM供应商" value="srm" />
+                <el-option label="BP伙伴商" value="bp" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="12">
+            <div class="target-input-wrapper">
+              <span class="required-mark">*</span>
+              <span class="label">{{ assignForm.targetType === 'srm' ? '供应商:' : '伙伴商:' }}</span>
+              <el-select
+                v-model="assignForm.targetId"
+                :placeholder="assignForm.targetType === 'srm' ? '请选择供应商' : '请选择伙伴商'"
+                clearable
+                filterable
+                style="flex: 1"
+                :disabled="!assignForm.targetType"
+              >
+                <el-option
+                  v-for="item in assignForm.targetType === 'srm' ? supplierList : partnerList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </div>
+          </el-col>
+        </el-row>
       </div>
 
-      <!-- 拆单分配表单 -->
-      <div v-show="assignType === 'split'" class="split-assign-form">
-        <el-form ref="splitAssignFormRef" :model="form" label-width="100px">
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="订单编号">
-                <span class="form-value">{{ orderInfo.orderNo }}</span>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="当前平台">
-                <dict-tag :options="sys_platform_code" :value="orderInfo.platformCode" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-divider content-position="left">商品列表</el-divider>
-
-          <el-form-item label-width="0">
-            <el-table :data="form.productList" border style="width: 100%" max-height="500">
-              <el-table-column type="index" label="序号" width="60" align="center" />
-              <el-table-column label="商品图片" width="100" align="center">
-                <template #default="scope">
-                  <el-image
-                    v-if="scope.row.productImage"
-                    :src="scope.row.productImage"
-                    style="width: 60px; height: 60px"
-                    fit="cover"
-                    :preview-src-list="[scope.row.productImage]"
-                  />
-                  <span v-else style="color: #999">暂无图片</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="商品编号" prop="productNo" width="140" align="center" />
-              <el-table-column label="商品名称" prop="productName" show-overflow-tooltip />
-              <el-table-column label="数量" prop="orderQuantity" width="100" align="center" />
-              <el-table-column label="单价" prop="orderPrice" width="120" align="center">
-                <template #default="scope">
-                  <span>¥{{ scope.row.orderPrice }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="小计" width="120" align="center">
-                <template #default="scope">
-                  <span>¥{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column label="分配平台" align="center" fixed="right">
-                <template #default="scope">
-                  <el-select v-model="scope.row.targetPlatform" placeholder="请选择平台" style="width: 100%">
-                    <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
-                  </el-select>
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-form-item>
-
-          <el-divider content-position="left">分配原因</el-divider>
-
-          <el-form-item label-width="0" prop="remark">
-            <el-input v-model="form.remark" type="textarea" :rows="4" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
-          </el-form-item>
-        </el-form>
+      <!-- 商品列表 -->
+      <div class="product-list-section">
+        <el-table
+          ref="assignProductTableRef"
+          :data="assignForm.productList"
+          border
+          style="width: 100%"
+          max-height="400"
+          @selection-change="handleAssignProductSelectionChange"
+        >
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="序号" width="80" align="center">
+            <template #default="scope">{{ scope.$index + 1 }}</template>
+          </el-table-column>
+          <el-table-column label="商品图片" width="100" align="center">
+            <template #default="scope">
+              <el-image
+                v-if="scope.row.productImage"
+                :src="scope.row.productImage"
+                style="width: 60px; height: 60px"
+                fit="cover"
+                :preview-src-list="[scope.row.productImage]"
+              />
+              <span v-else style="color: #999">暂无图片</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="商品编号" prop="productNo" width="140" align="center" />
+          <el-table-column label="商品名称" prop="productName" min-width="200" show-overflow-tooltip />
+          <el-table-column label="分配数量" width="150" align="center" prop="orderQuantity">
+            <!-- <template #default="scope">
+              <el-input-number v-model="scope.row.assignQuantity" :min="1" :max="scope.row.orderQuantity" :controls="false" style="width: 100%" />
+            </template> -->
+          </el-table-column>
+          <el-table-column label="单价" prop="orderPrice" width="120" align="center" />
+          <el-table-column label="小计" width="120" align="center">
+            <template #default="scope">{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</template>
+          </el-table-column>
+        </el-table>
       </div>
     </div>
 
     <template #footer>
-      <div class="drawer-footer">
-        <el-button @click="cancel">取 消</el-button>
-        <el-button v-if="assignType === 'whole'" :loading="buttonLoading" type="primary" @click="submitWholeForm">确 定</el-button>
-        <el-button v-else :loading="buttonLoading" type="primary" @click="submitSplitForm">确 定</el-button>
-      </div>
+      <el-button @click="assignDialog.visible = false">取 消</el-button>
+      <el-button :loading="buttonLoading" type="primary" @click="submitAssign">确定分配</el-button>
     </template>
-  </el-drawer>
+  </el-dialog>
 </template>
 
-<style scoped lang="scss">
-.drawer-content {
-  padding: 0 20px 20px;
-  height: calc(100% - 60px);
-  overflow-y: auto;
-}
-
-.assign-type-selector {
-  display: flex;
-  justify-content: center;
-  padding: 10px 0;
-
-  :deep(.el-radio-button__inner) {
-    padding: 12px 30px;
-    font-size: 14px;
-  }
-}
-
-.drawer-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
-  padding: 10px 20px;
-  border-top: 1px solid #e4e7ed;
-}
-
-.form-value {
-  font-weight: 500;
-  color: #303133;
-}
-
-:deep(.el-divider__text) {
-  font-weight: 600;
-  font-size: 14px;
-}
-</style>
-
 <script setup name="SplitAssignDialog" lang="ts">
 import { getOrderMain } from '@/api/order/orderMain';
 import { addOrderSplitAssign, addOrderAssignment } from '@/api/order/orderAssignmentLog';
 import { OrderSplitAssignForm, OrderProductAssignRule, OrderAssignmentForm } from '@/api/order/orderAssignmentLog/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_platform_code } = toRefs<any>(proxy?.useDict('sys_platform_code'));
+const { sys_platform_code, order_assignment_status } = toRefs<any>(proxy?.useDict('sys_platform_code', 'order_assignment_status'));
 
 const emit = defineEmits(['success']);
 
 const buttonLoading = ref(false);
-const splitAssignFormRef = ref<ElFormInstance>();
-const wholeAssignFormRef = ref<ElFormInstance>();
-
-// 分配类型:whole-整单分配,split-拆单分配
-const assignType = ref<'whole' | 'split'>('whole');
+const pendingTableRef = ref();
+const assignProductTableRef = ref();
+const selectedPendingProducts = ref<any[]>([]);
+const selectedAssignProducts = ref<any[]>([]); // 分配对话框中选中的商品
 
+// 订单分配详情抽屉
 const drawer = reactive<DialogOption>({
   visible: false,
   title: '订单分配'
 });
 
+// 分配对话框
+const assignDialog = reactive({
+  visible: false
+});
+
 const orderInfo = ref<any>({
   orderNo: '',
   id: undefined,
-  platformCode: ''
+  platformCode: '',
+  customerName: '',
+  businessStaff: '',
+  productQuantity: 0,
+  pendingCount: 0,
+  assignedCount: 0,
+  productTotal: 0,
+  assigned: 0,
+  unassigned: 0
 });
 
-// 拆单分配表单
-const form = reactive({
-  productList: [] as any[],
-  remark: ''
+// 分配表单
+const assignForm = reactive({
+  targetType: '', // 分配对象类型:srm-供应商,bp-伙伴商
+  targetId: '', // 分配目标ID
+  productList: [] as any[]
 });
 
-// 整单分配表单
-const wholeForm = reactive({
-  platformAfter: '',
-  remark: ''
-});
+// 供应商列表
+const supplierList = ref<any[]>([
+  { id: '1', name: '供应商A' },
+  { id: '2', name: '供应商B' },
+  { id: '3', name: '供应商C' }
+]);
 
-const wholeRules = {
-  platformAfter: [{ required: true, message: '分配后平台不能为空', trigger: 'blur' }]
-};
+// 伙伴商列表
+const partnerList = ref<any[]>([
+  { id: '1', name: '伙伴商A' },
+  { id: '2', name: '伙伴商B' },
+  { id: '3', name: '伙伴商C' }
+]);
 
-/** 打开对话框 */
+// 标签页
+const activeTab = ref('pending');
+
+// 待分配商品列表
+const pendingProducts = ref<any[]>([]);
+
+// 已分配商品列表
+const assignedProducts = ref<any[]>([]);
+
+// 分配记录
+const assignRecords = ref<any[]>([]);
+
+/** 打开订单分配详情抽屉 */
 const open = async (orderId: string | number) => {
   reset();
   drawer.visible = true;
-  assignType.value = 'whole'; // 默认显示整单分配
 
   try {
     // 获取订单详情
@@ -204,56 +325,73 @@ const open = async (orderId: string | number) => {
     orderInfo.value = {
       orderNo: res.data.orderNo,
       id: res.data.id,
-      platformCode: res.data.platformCode
+      platformCode: res.data.platformCode,
+      customerName: res.data.customerName || '--',
+      businessStaff: res.data.businessStaff || '--',
+      productQuantity: res.data.productQuantity || 0,
+
+      productTotal: res.data.productTotal || 0,
+      assigned: res.data.assigned || 0,
+      unassigned: res.data.unassigned || 0
     };
 
-    // 加载订单商品列表(用于拆单分配)
+    // 加载订单商品列表
     if (res.data.orderProductList && res.data.orderProductList.length > 0) {
-      form.productList = res.data.orderProductList.map((item: any) => ({
+      const productList = res.data.orderProductList.map((item: any) => ({
         ...item,
-        itemId: item.id, // 商品行ID
-        targetPlatform: '' // 初始化分配平台为空
+        itemId: item.id,
+        assignQuantity: item.orderQuantity
       }));
+
+      // 模拟待分配和已分配商品
+      pendingProducts.value = productList.slice(0, 8);
+      assignedProducts.value = productList.slice(8);
     }
+
+    // 模拟分配记录
+    assignRecords.value = [
+      {
+        assignTime: '2024-01-14 10:30:00',
+        assignedBy: '张三',
+        assignTarget: '供应商A',
+        productCount: 2,
+        remark: '紧急订单优先处理'
+      }
+    ];
   } catch (error) {
     proxy?.$modal.msgError('获取订单信息失败');
     drawer.visible = false;
   }
 };
 
-/** 分配类型切换 */
-const handleAssignTypeChange = (value: 'whole' | 'split') => {
-  // 切换时可以做一些清理工作
-  if (value === 'split' && form.productList.length === 0) {
-    proxy?.$modal.msgWarning('该订单没有商品信息,无法进行拆单分配');
-    assignType.value = 'whole';
-  }
-};
-
 /** 表单重置 */
 const reset = () => {
-  form.productList = [];
-  form.remark = '';
-  wholeForm.platformAfter = '';
-  wholeForm.remark = '';
-  assignType.value = 'whole';
+  assignForm.targetType = '';
+  assignForm.targetId = '';
+  assignForm.productList = [];
+  selectedPendingProducts.value = [];
+  selectedAssignProducts.value = [];
+  pendingProducts.value = [];
+  assignedProducts.value = [];
+  assignRecords.value = [];
+  activeTab.value = 'pending';
   orderInfo.value = {
     orderNo: '',
     id: undefined,
-    platformCode: ''
+    platformCode: '',
+    customerName: '',
+    businessStaff: '',
+    productQuantity: 0,
+    pendingCount: 0,
+    assignedCount: 0,
+    productTotal: 0,
+    assigned: 0,
+    unassigned: 0
   };
-  splitAssignFormRef.value?.resetFields();
-  wholeAssignFormRef.value?.resetFields();
-};
-
-/** 取消按钮 */
-const cancel = () => {
-  drawer.visible = false;
-  reset();
 };
 
-/** 关闭前的回调 */
-const handleClose = (done: () => void) => {
+/** 关闭抽屉前的回调 */
+const handleDrawerClose = (done: () => void) => {
   if (buttonLoading.value) {
     return;
   }
@@ -261,68 +399,213 @@ const handleClose = (done: () => void) => {
   reset();
 };
 
-/** 提交整单分配 */
-const submitWholeForm = async () => {
-  wholeAssignFormRef.value?.validate(async (valid: boolean) => {
-    if (valid) {
-      buttonLoading.value = true;
-      try {
-        const submitData: OrderAssignmentForm = {
-          orderIds: orderInfo.value.id,
-          platformAfter: wholeForm.platformAfter,
-          assignType: '0', // 整单分配
-          remark: wholeForm.remark
-        };
-
-        await addOrderAssignment(submitData);
-        proxy?.$modal.msgSuccess('整单分配成功');
-        drawer.visible = false;
-        emit('success');
-      } catch (error) {
-        proxy?.$modal.msgError('整单分配失败');
-      } finally {
-        buttonLoading.value = false;
-      }
-    }
+/** 待分配商品选择变化 */
+const handlePendingSelectionChange = (selection: any[]) => {
+  selectedPendingProducts.value = selection;
+};
+
+/** 分配对话框中商品选择变化 */
+const handleAssignProductSelectionChange = (selection: any[]) => {
+  selectedAssignProducts.value = selection;
+};
+
+/** 批量分配 */
+const handleBatchAssign = () => {
+  // 验证是否选择了商品
+  if (selectedPendingProducts.value.length === 0) {
+    proxy?.$modal.msgWarning('请至少选择一个商品进行分配');
+    return;
+  }
+  // 打开分配对话框
+  assignForm.productList = [...selectedPendingProducts.value];
+  assignDialog.visible = true;
+
+  // 等待对话框渲染后,默认全选所有商品
+  nextTick(() => {
+    assignForm.productList.forEach((row) => {
+      assignProductTableRef.value?.toggleRowSelection(row, true);
+    });
   });
 };
 
-/** 提交拆单分配 */
-const submitSplitForm = async () => {
-  // 验证每个商品都选择了平台
-  const unassignedProducts = form.productList.filter((item) => !item.targetPlatform);
-  if (unassignedProducts.length > 0) {
-    proxy?.$modal.msgWarning('请为所有商品选择分配平台');
+/** 分配单个商品 */
+const handleAssignProduct = (row: any) => {
+  // 打开分配对话框,只包含当前商品
+  assignForm.productList = [row];
+  assignDialog.visible = true;
+
+  // 等待对话框渲染后,默认选中该商品
+  nextTick(() => {
+    assignProductTableRef.value?.toggleRowSelection(row, true);
+  });
+};
+
+/** 转分配 */
+const handleReassign = (row: any) => {
+  proxy?.$modal.confirm('确认要转分配该商品吗?').then(() => {
+    // 打开分配对话框
+    assignForm.productList = [row];
+    assignDialog.visible = true;
+
+    // 等待对话框渲染后,默认选中该商品
+    nextTick(() => {
+      assignProductTableRef.value?.toggleRowSelection(row, true);
+    });
+  });
+};
+
+/** 提交分配 */
+const submitAssign = async () => {
+  // 验证是否选择了商品
+  if (selectedAssignProducts.value.length === 0) {
+    proxy?.$modal.msgWarning('请至少勾选一个商品进行分配');
+    return;
+  }
+
+  // 验证分配对象类型
+  if (!assignForm.targetType) {
+    proxy?.$modal.msgWarning('请选择分配对象类型');
+    return;
+  }
+
+  // 验证分配目标
+  if (!assignForm.targetId) {
+    proxy?.$modal.msgWarning(`请选择${assignForm.targetType === 'srm' ? '供应商' : '伙伴商'}`);
     return;
   }
 
   buttonLoading.value = true;
   try {
-    // 组装数据结构
+    // 组装提交数据,只提交勾选的商品
     const submitData: OrderSplitAssignForm = {
-      orderId: orderInfo.value.id,
-      itemRules: form.productList.map(
+      orderId: orderInfo.value.id, // 父订单ID
+      itemRules: selectedAssignProducts.value.map(
         (product): OrderProductAssignRule => ({
-          itemId: product.itemId,
-          targetPlatform: product.targetPlatform
+          itemId: product.itemId, // 商品行ID
+          assigneeId: assignForm.targetId, // 供应商ID 或 伙伴商ID
+          assigneeType: assignForm.targetType // "srm" 或 "bp"
         })
       ),
-      remark: form.remark
+      remark: '' // 分配备注(可选)
     };
 
     // 调用拆单分配接口
     await addOrderSplitAssign(submitData);
-    proxy?.$modal.msgSuccess('拆单分配成功');
-    drawer.visible = false;
+    proxy?.$modal.msgSuccess('分配成功');
+    assignDialog.visible = false;
+
+    // 清空选中状态
+    selectedAssignProducts.value = [];
+
+    // 刷新抽屉数据
+    await open(orderInfo.value.id);
     emit('success');
   } catch (error) {
-    proxy?.$modal.msgError('拆单分配失败');
+    console.error('分配失败:', error);
+    proxy?.$modal.msgError('分配失败');
   } finally {
     buttonLoading.value = false;
   }
 };
 
+/** 分配对象类型变化 */
+const handleTargetTypeChange = () => {
+  // 切换类型时清空已选择的目标
+  assignForm.targetId = '';
+};
+
 defineExpose({
   open
 });
 </script>
+
+<style scoped lang="scss">
+.drawer-header {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+
+  .order-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+  }
+}
+
+.drawer-content {
+  padding: 0 20px 20px;
+  height: calc(100% - 60px);
+  overflow-y: auto;
+}
+
+.assign-dialog-content {
+  padding: 0 10px;
+}
+
+.assign-target-section {
+  margin-bottom: 20px;
+
+  .target-input-wrapper {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+
+    .required-mark {
+      color: #f56c6c;
+      font-size: 14px;
+    }
+
+    .label {
+      font-size: 14px;
+      color: #606266;
+      white-space: nowrap;
+    }
+  }
+
+  .or-divider {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 14px;
+    color: #909399;
+  }
+}
+
+.product-list-section {
+  margin-top: 20px;
+}
+
+.detail-header {
+  padding: 15px 20px;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  margin-bottom: 20px;
+
+  .info-item {
+    display: flex;
+    flex-direction: column;
+    gap: 5px;
+
+    .label {
+      font-size: 12px;
+      color: #909399;
+    }
+
+    .value {
+      font-size: 14px;
+      color: #303133;
+      font-weight: 500;
+    }
+  }
+}
+
+.detail-tabs {
+  .tab-actions {
+    margin-bottom: 15px;
+  }
+}
+
+:deep(.el-alert__title) {
+  font-size: 13px;
+}
+</style>

+ 1 - 0
src/views/order/orderDeliver/index.vue

@@ -135,6 +135,7 @@ const orderStatusStats = ref({
 
 const initFormData: OrderMainForm = {
   id: undefined,
+  isSplitChild: undefined,
   orderNo: undefined,
   shipmentNo: undefined,
   subOrderNo: undefined,

+ 7 - 1
src/views/order/orderMain/index.vue

@@ -619,6 +619,12 @@ const submitForm = () => {
         return;
       }
 
+      // 验证是否有商品
+      if (!form.value.shippingAddressId) {
+        proxy?.$modal.msgWarning('收货地址不能为空');
+        return;
+      }
+
       buttonLoading.value = true;
 
       try {
@@ -884,7 +890,7 @@ const handleCustomerChange = async (customerId: string | number) => {
     form.value.customerCode = customerInfo.customerNo;
     // 填充客户相关信息
     if (customerInfo.customerSalesInfoVo) {
-      const salesInfo = customerInfo.customerSalesInfoVo;
+      const salesInfo = customerInfo.customerSalesInfoVo as any;
       form.value.creditLimit = salesInfo.remainingQuota || salesInfo.creditAmount;
       // 填充业务人员、客服人员、业务部门
       form.value.businessStaff = salesInfo.salesPerson;

+ 4 - 4
src/views/order/revenueHeader/add.vue

@@ -353,10 +353,10 @@ const handleCustomerChange = async (customerNo: string) => {
 
     // 从客户销售信息中获取业务信息
     if (customerInfo.customerSalesInfoVo) {
-      const salesInfo = customerInfo.customerSalesInfoVo;
-      form.value.businessStaff = salesInfo.businessStaffName || '';
-      form.value.customerService = salesInfo.customerServiceName || '';
-      form.value.businessDept = salesInfo.businessDeptName || '';
+      const salesInfo = customerInfo.customerSalesInfoVo as any;
+      form.value.businessStaff = salesInfo.salesPerson || '';
+      form.value.customerService = salesInfo.serviceStaff || '';
+      form.value.businessDept = salesInfo.belongingDepartment || '';
     }
 
     // 获取所属公司信息

+ 19 - 8
src/views/order/saleOrder/deliverDialog.vue

@@ -14,8 +14,8 @@
           </el-form-item>
         </el-col>
         <el-col :span="12" v-if="form.deliverMethod === '1'">
-          <el-form-item label="物流公司名称" prop="logisticsCompany">
-            <el-select v-model="form.logisticsCompany" placeholder="请选择" style="width: 100%" filterable>
+          <el-form-item label="物流公司名称" prop="logisticsCompanyId">
+            <el-select v-model="form.logisticsCompanyId" placeholder="请选择" style="width: 100%" filterable @change="handleLogisticsCompanyChange">
               <el-option v-for="company in logisticsCompanyList" :key="company.id" :label="company.logisticsName" :value="company.id" />
             </el-select>
           </el-form-item>
@@ -168,7 +168,8 @@ const form = reactive<OrderDeliverForm>({
   logisticsStatus: '',
   deliverRemark: '',
   checklistRemark: '',
-  logisticsCompany: undefined,
+  logisticsCompanyId: undefined,
+  logisticsCompanyCode: '',
   logisticNo: '',
   logisticPackStatus: '',
   consigneePhone: '',
@@ -184,10 +185,10 @@ const rules = computed(() => {
 
   // 第三方物流(deliverMethod === '1')
   if (form.deliverMethod === '1') {
-    baseRules.logisticsCompany = [{ required: true, message: '请选择物流公司', trigger: 'change' }];
+    baseRules.logisticsCompanyId = [{ required: true, message: '请选择物流公司', trigger: 'change' }];
     baseRules.logisticNo = [{ required: true, message: '请输入物流单号', trigger: 'blur' }];
     baseRules.consigneePhone = [
-      { required: true, message: '请输入收货人手机', trigger: 'blur' },
+      { required: true, message: '请输入收货人手机号码', trigger: 'blur' },
       { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
     ];
   }
@@ -229,7 +230,8 @@ const handleClose = () => {
 const resetForm = () => {
   form.orderId = undefined;
   form.orderCode = '';
-  form.logisticsCompany = undefined;
+  form.logisticsCompanyId = undefined;
+  form.logisticsCompanyCode = '';
   form.logisticNo = '';
   form.deliverMethod = '1';
   form.deliverMan = '';
@@ -241,6 +243,13 @@ const resetForm = () => {
   formRef.value?.clearValidate();
 };
 
+const handleLogisticsCompanyChange = (val: any) => {
+  const selectedCompany = logisticsCompanyList.value.find((item) => item.id === val);
+  if (selectedCompany) {
+    form.logisticsCompanyCode = selectedCompany.logisticsCode;
+  }
+};
+
 // 加载商品列表
 const loadProductList = async () => {
   try {
@@ -253,7 +262,8 @@ const loadProductList = async () => {
       deliverNum: 0,
       productNo: item.productNo,
       productId: item.productId,
-      productUnitId: item.productUnit
+      productUnit: item.productUnit,
+      productUnitId: item.productUnitId
     }));
     total.value = res.data.orderProductList.length || 0;
   } catch (error) {
@@ -335,7 +345,8 @@ const handleSubmit = async () => {
     const deliveryData: OrderDeliverForm = {
       orderId: form.orderId,
       orderCode: form.orderCode,
-      logisticsCompany: form.logisticsCompany,
+      logisticsCompanyId: form.logisticsCompanyId,
+      logisticsCompanyCode: form.logisticsCompanyCode,
       logisticNo: form.logisticNo,
       deliverMethod: form.deliverMethod,
       deliverMan: form.deliverMan,

+ 42 - 7
src/views/order/saleOrder/index.vue

@@ -45,7 +45,7 @@
             <el-button type="primary" plain>关闭订单</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>删除订单</el-button>
+            <el-button type="primary" @click="handleDelete()" plain>删除订单</el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button type="primary" plain>导出订单</el-button>
@@ -130,13 +130,14 @@
               @click="handleReview(scope.row)"
               >查看订单信息</el-button
             >
-            <el-button link type="primary" v-if="scope.row.orderStatus === '4' || scope.row.orderStatus === '5'">查看物流</el-button>
             <el-button
               link
               type="primary"
-              v-if="scope.row.orderStatus === '0' || scope.row.orderStatus === '3' || scope.row.orderStatus === '4' || scope.row.orderStatus === '5'"
-              >取消订单</el-button
+              v-if="scope.row.orderStatus === '4' || scope.row.orderStatus === '5'"
+              @click="handleViewLogistics(scope.row)"
+              >查看物流</el-button
             >
+            <el-button link type="primary" @click="handleCancel(scope.row)" v-if="scope.row.orderStatus != '7'">取消订单</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -146,6 +147,9 @@
 
     <!-- 发货对话框 -->
     <DeliverDialog v-model="showDeliverDialog" :order-id="currentOrderId" :order-no="currentOrderNo" @success="handleDeliverSuccess" />
+
+    <!-- 物流详情对话框 -->
+    <LogisticsDetail v-model="showLogisticsDialog" :order-id="logisticsOrderId" />
   </div>
 </template>
 
@@ -157,13 +161,12 @@ import {
   addOrderMain,
   updateOrderMain,
   queryOrderStatusStats,
+  changeStatus,
   changeCheckStatus
 } from '@/api/order/orderMain';
 import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
 import DeliverDialog from './deliverDialog.vue';
-import { ElMessageBox } from 'element-plus';
-import { h } from 'vue';
-
+import LogisticsDetail from './logisticsDetail.vue';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { order_status, order_check_status, pay_method, order_source } = toRefs<any>(
   proxy?.useDict('order_status', 'order_check_status', 'pay_method', 'order_source')
@@ -188,6 +191,9 @@ const currentOrderId = ref<string | number>();
 const currentOrderNo = ref<string>();
 const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 
+const showLogisticsDialog = ref(false);
+const logisticsOrderId = ref<string | number>();
+
 const dialog = reactive<DialogOption>({
   visible: false,
   title: ''
@@ -466,6 +472,25 @@ const handleCheck = async (row?: OrderMainVO) => {
   }
 };
 
+/** 审核按钮操作 */
+const handleCancel = async (row?: OrderMainVO) => {
+  const oldValue = row.checkStatus; // 保存旧值
+
+  // 弹出审核选择对话框
+  try {
+    // 调用接口,传入用户选择的值
+    await changeStatus(row.id, '7');
+    getList();
+    proxy?.$modal.msgSuccess('操作成功');
+  } catch (error) {
+    // 用户取消或操作失败
+    if (error !== 'cancel' && error !== 'close') {
+      row.checkStatus = oldValue; // 失败回滚
+      proxy?.$modal.msgError('操作失败,请重试');
+    }
+  }
+};
+
 /** 发货按钮操作 */
 const handleDeliver = (row?: OrderMainVO) => {
   if (!row?.id) {
@@ -482,6 +507,16 @@ const handleDeliverSuccess = () => {
   getList();
 };
 
+/** 查看物流按钮操作 */
+const handleViewLogistics = (row?: OrderMainVO) => {
+  if (!row?.id) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+  logisticsOrderId.value = row.id;
+  showLogisticsDialog.value = true;
+};
+
 /** 修改按钮操作 */
 const handleUpdate = async (row?: OrderMainVO) => {
   reset();

+ 196 - 0
src/views/order/saleOrder/logisticsDetail.vue

@@ -0,0 +1,196 @@
+<template>
+  <el-dialog v-model="visible" title="物流信息" width="700px" :before-close="handleClose">
+    <div class="logistics-detail">
+      <div class="section-title">单号查询</div>
+
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="物流单号">
+          <el-select v-model="form.selectedLogisticNo" placeholder="请选择物流单号" @change="handleLogisticNoChange" style="width: 100%">
+            <el-option
+              v-for="item in logisticsList"
+              :key="item.id"
+              :label="`${item.logisticNo},${getDictLabel(deliver_method, item.deliverMethod)}`"
+              :value="item.logisticNo"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <div class="section-title">物流信息</div>
+
+      <el-timeline v-if="logisticsInfo.length > 0">
+        <el-timeline-item v-for="(item, index) in logisticsInfo" :key="index" :timestamp="item.time" placement="top">
+          <div class="timeline-content">
+            <div class="timeline-status">{{ index }}</div>
+            <div class="timeline-detail">
+              <div>{{ item.time }}</div>
+              <div>{{ item.location }}</div>
+              <div>{{ item.status }}</div>
+            </div>
+          </div>
+        </el-timeline-item>
+      </el-timeline>
+
+      <el-empty v-else description="暂无物流信息" />
+    </div>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { listOrderDeliver, queryTrack } from '@/api/order/orderDeliver';
+import { OrderDeliverVO } from '@/api/order/orderDeliver/types';
+
+interface Props {
+  modelValue: boolean;
+  orderId?: string | number;
+}
+
+interface LogisticsInfo {
+  time: string;
+  location: string;
+  status: string;
+}
+
+const props = defineProps<Props>();
+const emit = defineEmits(['update:modelValue']);
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { deliver_method } = toRefs<any>(proxy?.useDict('deliver_method'));
+
+const visible = ref(false);
+const logisticsList = ref<OrderDeliverVO[]>([]);
+const form = ref({
+  selectedLogisticNo: ''
+});
+const logisticsInfo = ref<LogisticsInfo[]>([]);
+
+watch(
+  () => props.modelValue,
+  (val) => {
+    visible.value = val;
+    if (val && props.orderId) {
+      loadLogisticsList();
+    }
+  }
+);
+
+watch(visible, (val) => {
+  emit('update:modelValue', val);
+});
+
+const loadLogisticsList = async () => {
+  try {
+    const res = await listOrderDeliver({
+      orderId: props.orderId,
+      pageNum: 1,
+      pageSize: 100
+    });
+    logisticsList.value = res.rows || [];
+
+    if (logisticsList.value.length > 0) {
+      form.value.selectedLogisticNo = logisticsList.value[0].logisticNo;
+      handleLogisticNoChange(form.value.selectedLogisticNo);
+    }
+  } catch (error) {
+    console.error('Failed to load logistics list:', error);
+  }
+};
+
+const handleLogisticNoChange = async (logisticNo: string) => {
+  const selected = logisticsList.value.find((item) => item.logisticNo === logisticNo);
+  if (!selected) return;
+
+  try {
+    const res = await queryTrack({
+      logisticNo: logisticNo,
+      pageNum: 1,
+      pageSize: 100
+    });
+
+    if (res.data && Array.isArray(res.data) && res.data.length > 0) {
+      logisticsInfo.value = res.data.map((item: any) => ({
+        time: item.acceptTime || item.time || '',
+        location: selected.orderCode ? `${selected.orderCode}` : '',
+        status: item.context || ''
+      }));
+    } else {
+      logisticsInfo.value = [
+        {
+          time: (selected as any).createTime || '',
+          location: selected.orderCode ? `${selected.orderCode}` : '',
+          status: '已下单'
+        }
+      ];
+    }
+  } catch (error) {
+    console.error('Failed to query track:', error);
+    logisticsInfo.value = [
+      {
+        time: (selected as any).createTime || '',
+        location: selected.orderCode ? `${selected.orderCode}` : '',
+        status: '已下单'
+      }
+    ];
+  }
+};
+
+const getDictLabel = (dictOptions: any[], value: string) => {
+  if (!dictOptions || !value) return value;
+  const dict = dictOptions.find((item) => item.value === value);
+  return dict ? dict.label : value;
+};
+
+const handleClose = () => {
+  visible.value = false;
+  form.value.selectedLogisticNo = '';
+  logisticsInfo.value = [];
+};
+</script>
+
+<style scoped lang="scss">
+.logistics-detail {
+  .section-title {
+    font-size: 16px;
+    font-weight: 500;
+    margin-bottom: 16px;
+    color: #303133;
+  }
+
+  .timeline-content {
+    display: flex;
+    align-items: flex-start;
+    gap: 12px;
+
+    .timeline-status {
+      width: 24px;
+      height: 24px;
+      border-radius: 50%;
+      background-color: #409eff;
+      color: white;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 12px;
+      flex-shrink: 0;
+    }
+
+    .timeline-detail {
+      flex: 1;
+
+      div {
+        margin-bottom: 4px;
+        color: #606266;
+        font-size: 14px;
+
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+
+  :deep(.el-timeline-item__timestamp) {
+    display: none;
+  }
+}
+</style>

+ 1 - 2
src/views/order/saleOrder/sendDetail.vue

@@ -99,7 +99,7 @@
       <template #header>
         <span>收货信息</span>
       </template>
-      <el-descriptions :column="2" border>
+      <el-descriptions :column="2" border class="custom-descriptions">
         <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>
@@ -216,7 +216,6 @@ import DeliverDialog from './deliverDialog.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 { DeliverProductVO } from '@/api/order/deliverProduct/types';
 import { getShippingAddress } from '@/api/customer/customerFile/shippingAddress';