소스 검색

销售、销售退货、采购 导出excel功能

chenrui 3 년 전
부모
커밋
9d359662bb

+ 8 - 0
src/api/purchase.js

@@ -159,3 +159,11 @@ export const purchaseDetailBatchInsert = params => {
     method: 'post'
   })
 }
+// 销售 详情  导出
+export const purchaseDetailExport = params => {
+  return axios.request({
+    url: `/purchase/excel/${params.sn}`,
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 8 - 0
src/api/sales.js

@@ -139,3 +139,11 @@ export const salesDetailPrint = params => {
     responseType: 'blob'
   })
 }
+// 销售 详情  导出
+export const salesDetailExport = params => {
+  return axios.request({
+    url: `sales/excel/${params.sn}`,
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 8 - 0
src/api/salesReturn.js

@@ -168,3 +168,11 @@ export const salesReturnDetailPrint = params => {
     responseType: 'blob'
   })
 }
+// 销售退货 详情  导出
+export const salesDetailExport = params => {
+  return axios.request({
+    url: `salesReturn/excel/${params.sn}`,
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 36 - 6
src/views/purchasingManagement/purchaseOrder/detail.vue

@@ -11,12 +11,19 @@
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <template slot="extra" v-if="$hasPermissions('B_purchasePrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="purchaseOrderDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="purchaseOrderDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="purchaseOrderDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="purchaseOrderDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="purchaseOrderDetail-export-btn"
+            :disabled="localDataSource.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <!-- 基础信息 -->
@@ -139,8 +146,9 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { STable, VSelect } from '@/components'
-import { purchaseDetailBySn, purchaseDetailPrint } from '@/api/purchase'
+import { purchaseDetailBySn, purchaseDetailPrint, purchaseDetailExport } from '@/api/purchase'
 import { purchaseDetailList } from '@/api/purchaseDetail'
 export default {
   components: { STable, VSelect },
@@ -199,7 +207,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      purchaseDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = purchaseDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = purchaseDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -212,7 +226,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -228,6 +246,18 @@ export default {
         window.frames['printf'].focus()
         window.frames['printf'].print()
       }
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '采购' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
     }
   },
   mounted () {

+ 36 - 6
src/views/purchasingManagement/purchaseOrder/edit.vue

@@ -9,12 +9,19 @@
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <template slot="extra" v-if="$hasPermissions('B_purchasePrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="purchaseOrderEdit-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="purchaseOrderEdit-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="purchaseOrderEdit-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="purchaseOrderEdit-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="purchaseOrderEdit-export-btn"
+            :disabled="localDataSource.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <!-- 基础信息 -->
@@ -238,12 +245,13 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { STable, VSelect } from '@/components'
 import basicInfoModal from './basicInfoModal.vue'
 import ImportGuideModal from './importGuideModal.vue'
 import ProductType from '../../common/productType.js'
 import ProductBrand from '../../common/productBrand.js'
-import { purchaseDetailBySn, purchaseWriteSubmit, purchaseDetailPrint, purchaseDetailBatchInsert } from '@/api/purchase'
+import { purchaseDetailBySn, purchaseWriteSubmit, purchaseDetailPrint, purchaseDetailBatchInsert, purchaseDetailExport } from '@/api/purchase'
 import { purchaseDetailList, purchaseDetailSave, purchaseDetailDel, purchaseDetailCount } from '@/api/purchaseDetail'
 import { productListPurchase } from '@/api/product'
 export default {
@@ -496,7 +504,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      purchaseDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = purchaseDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = purchaseDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -509,7 +523,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -526,6 +544,18 @@ export default {
         window.frames['printf'].print()
       }
     },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '采购' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
+    },
     //  返回列表
     handleBack () {
       this.$router.push({ path: '/purchasingManagement/purchaseOrder/list', query: { closeLastOldTab: true } })

+ 36 - 25
src/views/salesManagement/salesQuery/detail.vue

@@ -13,21 +13,19 @@
             @click.stop="handleEdit">编辑</a-button>
         </template>
         <template slot="extra" v-if="$hasPermissions('B_salesPrint')">
-          <!-- <span>打印字段:</span>
-          <a-select key="1" style="width:150px" id="salesDetail-pritKey" placeholder="请选择打印字段" allowClear>
-            <a-select-option v-for="item in pritKey" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
-          </a-select>
-          <span><i style="color: red;">*</i>打印模板:</span>
-          <a-select key="2" style="width:150px" id="salesDetail-pritKey" placeholder="请选择打印模板" allowClear>
-            <a-select-option v-for="item in pritModal" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
-          </a-select> -->
-          <!-- <a-button key="5" id="salesDetail-export-btn">导出</a-button> -->
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="salesDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="salesDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="salesDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="salesDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="salesDetail-export-btn"
+            :disabled="localDataSource.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <!-- 基础信息 -->
@@ -93,9 +91,10 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { STable, VSelect } from '@/components'
-import { salesDetailBySn, salesDetailPrint } from '@/api/sales'
+import { salesDetailBySn, salesDetailPrint, salesDetailExport } from '@/api/sales'
 import { salesDetailList } from '@/api/salesDetail'
 export default {
   name: 'SalesDetail',
@@ -110,16 +109,6 @@ export default {
     return {
       spinning: false,
       disabled: false,
-      pritKey: [
-        { id: 0, name: '打印促销' },
-        { id: 1, name: '打印支付方式' },
-        { id: 2, name: '打印收款方式' }
-      ],
-      pritModal: [
-        { id: 0, name: '普通模板一' },
-        { id: 1, name: '普通模板二' },
-        { id: 2, name: '仓库模板一' }
-      ],
       // 表头
       columns: [
         { title: '序号', dataIndex: 'no', width: 80, align: 'center' },
@@ -193,7 +182,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      salesDetailPrint({ sn: this.outBizSn || this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = salesDetailPrint
+      let params = { sn: this.outBizSn || this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = salesDetailExport
+        params = { sn: this.outBizSn || this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -206,7 +201,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -222,6 +221,18 @@ export default {
         window.frames['printf'].focus()
         window.frames['printf'].print()
       }
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '销售' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
     }
   },
   mounted () {

+ 36 - 6
src/views/salesManagement/salesQuery/edit.vue

@@ -9,12 +9,19 @@
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <template slot="extra" v-if="$hasPermissions('B_salesPrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="salesEdit-preview-btn" :disabled="dataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="salesEdit-print-btn" :disabled="dataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="salesEdit-preview-btn" :disabled="dataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="salesEdit-print-btn" :disabled="dataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="salesEdit-export-btn"
+            :disabled="dataSource.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <a-card size="small" :bordered="false" class="salesEdit-cont">
@@ -164,10 +171,11 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { STable, VSelect } from '@/components'
 import queryPart from './queryPart.vue'
 import chooseCustomModal from './chooseCustomModal.vue'
-import { salesDetail, salesWriteSubmit, salesWriteDiscount, salesDetailPrint } from '@/api/sales'
+import { salesDetail, salesWriteSubmit, salesWriteDiscount, salesDetailPrint, salesDetailExport } from '@/api/sales'
 import { salesDetailList, salesDetailInsert, salesDetailUpdatePrice, salesDetailUpdateQty, salesDetailDel, salesDetailDelAll } from '@/api/salesDetail'
 export default {
   name: 'SalesDetail',
@@ -271,7 +279,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      salesDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = salesDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = salesDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -284,7 +298,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -301,6 +319,18 @@ export default {
         window.frames['printf'].print()
       }
     },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '销售' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
+    },
     // 更新产品列表
     updateData (priceType) {
       // 价格类型变更

+ 35 - 5
src/views/salesManagement/salesReturn/detail.vue

@@ -6,12 +6,19 @@
           <a href="javascript:;" @click="handleBack"><a-icon type="left"></a-icon> 返回列表</a>
         </template>
         <template slot="extra" v-if="$hasPermissions('B_salesReturnPrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="salesReturnDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="salesReturnDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="salesReturnDetail-preview-btn" :disabled="localDataSource.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="salesReturnDetail-print-btn" :disabled="localDataSource.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="salesReturnDetail-export-btn"
+            :disabled="localDataSource.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <!-- 基础信息 -->
@@ -69,6 +76,7 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { STable, VSelect } from '@/components'
 import { salesReturnDetail, salesReturnQueryCount, salesReturnDetailList, salesReturnDetailPrint } from '@/api/salesReturn'
@@ -151,7 +159,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      salesReturnDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = salesReturnDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = salesDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -164,7 +178,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -180,6 +198,18 @@ export default {
         window.frames['printf'].focus()
         window.frames['printf'].print()
       }
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '销售退货' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
     }
   },
   mounted () {

+ 37 - 9
src/views/salesManagement/salesReturn/salesReturnEdit.vue

@@ -9,12 +9,19 @@
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <template slot="extra" v-if="$hasPermissions('B_salesReturnPrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="salesReturnEdit-preview-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="salesReturnEdit-print-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="salesReturnEdit-preview-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="salesReturnEdit-print-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="salesReturnEdit-export-btn"
+            :disabled="chooseLoadData.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <a-card size="small" :bordered="false" class="pages-wrap">
@@ -180,11 +187,12 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { STable, VSelect } from '@/components'
 import queryPart from './queryPart.vue'
 import chooseCustomModal from './chooseCustomModal.vue'
 import { warehouseCascadeList } from '@/api/warehouse'
-import { salesReturnDetail, salesReturnQueryCount, salesReturnDetailList, salesReturnDiscount, salesReturnDelAll, salesReturnDetailDel, salesReturnSaveProduct, salesReturnSubmit, salesReturnDetailPrint } from '@/api/salesReturn'
+import { salesReturnDetail, salesReturnQueryCount, salesReturnDetailList, salesReturnDiscount, salesReturnDelAll, salesReturnDetailDel, salesReturnSaveProduct, salesReturnSubmit, salesReturnDetailPrint, salesDetailExport } from '@/api/salesReturn'
 export default {
   name: 'SalesDetail',
   components: {
@@ -266,9 +274,7 @@ export default {
       this.$router.push({ path: '/salesManagement/salesReturn/list', query: { closeLastOldTab: true } })
     },
     // 选择客户成功
-    chooseCustomOk (data) {
-
-    },
+    chooseCustomOk (data) {},
     handleEditCustom () {
       this.openModal = true
     },
@@ -485,7 +491,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      salesReturnDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = salesReturnDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = salesDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -498,7 +510,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -514,6 +530,18 @@ export default {
         window.frames['printf'].focus()
         window.frames['printf'].print()
       }
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '销售退货' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
     }
   },
   mounted () {

+ 37 - 9
src/views/salesManagement/salesReturn/salesReturnGrabEdit.vue

@@ -9,12 +9,19 @@
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <template slot="extra" v-if="$hasPermissions('B_salesReturnPrint')">
-          <a-radio-group key="3" v-model="printerType">
+          <a-radio-group key="4" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
           </a-radio-group>
-          <a-button key="2" id="salesReturnEdit-preview-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('preview')">打印预览</a-button>
-          <a-button key="1" type="primary" id="salesReturnEdit-print-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button key="3" id="salesReturnEdit-preview-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('preview')">打印预览</a-button>
+          <a-button key="2" type="primary" id="salesReturnEdit-print-btn" :disabled="chooseLoadData.length==0" @click="handlePrint('print')">快捷打印</a-button>
+          <a-button
+            key="1"
+            type="primary"
+            class="button-warning"
+            id="salesReturnEdit-export-btn"
+            :disabled="chooseLoadData.length==0"
+            @click="handlePrint('export')">导出Excel</a-button>
         </template>
       </a-page-header>
       <a-card size="small" :bordered="false" class="pages-wrap">
@@ -174,11 +181,12 @@
 </template>
 
 <script>
+import moment from 'moment'
 import { STable, VSelect } from '@/components'
 import queryPart from './queryPart.vue'
 import chooseCustomModal from './chooseCustomModal.vue'
 import { warehouseCascadeList } from '@/api/warehouse'
-import { salesReturnDetail, salesReturnQueryCount, salesReturnDetailList, salesReturnDiscount, salesReturnDelAll, salesReturnDetailDel, salesReturnSaveProduct, salesReturnSubmit, salesReturnDetailPrint } from '@/api/salesReturn'
+import { salesReturnDetail, salesReturnQueryCount, salesReturnDetailList, salesReturnDiscount, salesReturnDelAll, salesReturnDetailDel, salesReturnSaveProduct, salesReturnSubmit, salesReturnDetailPrint, salesDetailExport } from '@/api/salesReturn'
 export default {
   name: 'SalesDetail',
   components: {
@@ -261,9 +269,7 @@ export default {
       this.$router.push({ path: '/salesManagement/salesReturn/list', query: { closeLastOldTab: true } })
     },
     // 选择客户成功
-    chooseCustomOk (data) {
-
-    },
+    chooseCustomOk (data) {},
     handleEditCustom () {
       this.openModal = true
     },
@@ -479,7 +485,13 @@ export default {
     handlePrint (type) {
       const _this = this
       _this.spinning = true
-      salesReturnDetailPrint({ sn: this.$route.params.sn, type: this.printerType }).then(res => {
+      let url = salesReturnDetailPrint
+      let params = { sn: this.$route.params.sn, type: this.printerType }
+      if (type == 'export') { //  导出
+        url = salesDetailExport
+        params = { sn: this.$route.params.sn }
+      }
+      url(params).then(res => {
         _this.spinning = false
         if (res.type == 'application/json') {
           var reader = new FileReader()
@@ -492,7 +504,11 @@ export default {
           })
           reader.readAsText(res)
         } else {
-          this.print(res, type)
+          if (type == 'export') { //  导出
+            this.download(res)
+          } else {
+            this.print(res, type)
+          }
         }
       })
     },
@@ -508,6 +524,18 @@ export default {
         window.frames['printf'].focus()
         window.frames['printf'].print()
       }
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const a = moment().format('YYYYMMDDHHmmss')
+      const fname = '销售退货' + a
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
     }
   },
   mounted () {