diff --git a/src/api/erp/sale/exchange/index.ts b/src/api/erp/sale/exchange/index.ts
new file mode 100644
index 0000000..11571fd
--- /dev/null
+++ b/src/api/erp/sale/exchange/index.ts
@@ -0,0 +1,102 @@
+import request from '@/config/axios'
+
+// ERP 销售换货 VO
+export interface SaleExchangeVO {
+ id: number // 换货编号
+ no: string // 换货单号
+ exchangeTime: Date // 换货时间
+ outId: number // 关联出库单编号
+ outNo: string // 关联出库单号
+ customerId: number // 客户编号
+ customerName: string // 客户名称
+ saleUserId: number // 销售人员编号
+ saleUserName: string // 销售人员名称
+ accountId: number // 结算账户编号
+ totalOutCount: number // 换出商品总数
+ totalInCount: number // 换入商品总数
+ totalPrice: number // 差价金额,单位:元
+ otherPrice: number // 其它费用,单位:元
+ status: number // 状态
+ remark: string // 备注
+ fileUrl: string // 附件地址
+ outItems: SaleExchangeOutItemVO[] // 换出商品明细
+ inItems: SaleExchangeInItemVO[] // 换入商品明细
+}
+
+// ERP 销售换货换出商品明细 VO
+export interface SaleExchangeOutItemVO {
+ id: number // 明细编号
+ exchangeId: number // 换货编号
+ productId: number // 产品编号
+ productName: string // 产品名称
+ productBarCode: string // 产品条码
+ productUnitId: number // 产品单位编号
+ productUnitName: string // 产品单位名称
+ warehouseId: number // 仓库编号
+ warehouseName: string // 仓库名称
+ count: number // 换出数量
+ productPrice: number // 产品单价,单位:元
+ totalPrice: number // 合计金额,单位:元
+}
+
+// ERP 销售换货换入商品明细 VO
+export interface SaleExchangeInItemVO {
+ id: number // 明细编号
+ exchangeId: number // 换货编号
+ productId: number // 产品编号
+ productName: string // 产品名称
+ productBarCode: string // 产品条码
+ productUnitId: number // 产品单位编号
+ productUnitName: string // 产品单位名称
+ warehouseId: number // 仓库编号
+ warehouseName: string // 仓库名称
+ count: number // 换入数量
+ productPrice: number // 产品单价,单位:元
+ totalPrice: number // 合计金额,单位:元
+}
+
+// 查询销售换货分页
+export const getSaleExchangePage = async (params: any) => {
+ return await request.get({ url: `/erp/sale-exchange/page`, params })
+}
+
+// 查询销售换货详情
+export const getSaleExchange = async (id: number) => {
+ return await request.get({ url: `/erp/sale-exchange/get?id=` + id })
+}
+
+// 新增销售换货
+export const createSaleExchange = async (data: SaleExchangeVO) => {
+ return await request.post({ url: `/erp/sale-exchange/create`, data })
+}
+
+// 修改销售换货
+export const updateSaleExchange = async (data: SaleExchangeVO) => {
+ return await request.put({ url: `/erp/sale-exchange/update`, data })
+}
+
+// 更新销售换货的状态
+export const updateSaleExchangeStatus = async (id: number, status: number) => {
+ return await request.put({
+ url: `/erp/sale-exchange/update-status`,
+ params: {
+ id,
+ status
+ }
+ })
+}
+
+// 删除销售换货
+export const deleteSaleExchange = async (ids: number[]) => {
+ return await request.delete({
+ url: `/erp/sale-exchange/delete`,
+ params: {
+ ids: ids.join(',')
+ }
+ })
+}
+
+// 导出销售换货 Excel
+export const exportSaleExchange = async (params: any) => {
+ return await request.download({ url: `/erp/sale-exchange/export-excel`, params })
+}
diff --git a/src/views/erp/sale/exchange/SaleExchangeForm.vue b/src/views/erp/sale/exchange/SaleExchangeForm.vue
new file mode 100644
index 0000000..2ddf46f
--- /dev/null
+++ b/src/views/erp/sale/exchange/SaleExchangeForm.vue
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/erp/sale/exchange/components/ProductEnableList.vue b/src/views/erp/sale/exchange/components/ProductEnableList.vue
new file mode 100644
index 0000000..5d59481
--- /dev/null
+++ b/src/views/erp/sale/exchange/components/ProductEnableList.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
diff --git a/src/views/erp/sale/exchange/components/SaleExchangeInItemForm.vue b/src/views/erp/sale/exchange/components/SaleExchangeInItemForm.vue
new file mode 100644
index 0000000..607ca53
--- /dev/null
+++ b/src/views/erp/sale/exchange/components/SaleExchangeInItemForm.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + 添加换入商品
+
+
+
+
+
+
+
diff --git a/src/views/erp/sale/exchange/components/SaleExchangeOutItemForm.vue b/src/views/erp/sale/exchange/components/SaleExchangeOutItemForm.vue
new file mode 100644
index 0000000..b3d499b
--- /dev/null
+++ b/src/views/erp/sale/exchange/components/SaleExchangeOutItemForm.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + 添加换出商品
+
+
+
+
+
+
+
diff --git a/src/views/erp/sale/exchange/components/SaleOutEnableList.vue b/src/views/erp/sale/exchange/components/SaleOutEnableList.vue
new file mode 100644
index 0000000..6cc4afc
--- /dev/null
+++ b/src/views/erp/sale/exchange/components/SaleOutEnableList.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
diff --git a/src/views/erp/sale/exchange/index.vue b/src/views/erp/sale/exchange/index.vue
new file mode 100644
index 0000000..a1beedb
--- /dev/null
+++ b/src/views/erp/sale/exchange/index.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+ item.id))"
+ v-hasPermi="['erp:sale-exchange:delete']"
+ :disabled="selectionList.length === 0"
+ >
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.outNo }}
+
+
+
+
+
+
+
+ {{ erpPriceInputFormatter(scope.row.totalPrice) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 详情
+
+
+
+
+ 编辑
+
+
+
+
+ 审核
+
+
+
+
+ 反审核
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+