printList.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <template>
  2. <div class="mod-user">
  3. <div class="search-bar">
  4. <el-form :inline="true" class="search-form" ref="searchForm" :model="searchForm" size="small">
  5. <div class="input-row">
  6. <el-form-item prop="orderNumber" label="订单编号:">
  7. <el-input v-model="searchForm.orderNumber" type="text" clearable placeholder="订单编号"></el-input>
  8. </el-form-item>
  9. <el-form-item prop="pdfName" label="文件名:">
  10. <el-input v-model="searchForm.pdfName" type="text" clearable placeholder="文件名"></el-input>
  11. </el-form-item>
  12. <el-form-item label="生成时间:">
  13. <el-date-picker size="small" v-model="createDateRange" type="datetimerange"
  14. :default-time="['00:00:00', '23:59:59']"
  15. range-separator="至" value-format="yyyy-MM-dd HH:mm:ss"
  16. :start-placeholder="$t('text.startTime')" end-placeholder="结束日期"
  17. @change="createTimeChange"></el-date-picker>
  18. </el-form-item>
  19. <el-form-item>
  20. <div class="default-btn primary-btn" @click="searchChange(true)">{{ $t('crud.searchBtn') }}</div>
  21. <div class="default-btn" @click="resetForm('searchForm')">重置</div>
  22. </el-form-item>
  23. </div>
  24. </el-form>
  25. </div>
  26. <div class="main-container">
  27. <div class="operation-bar">
  28. <div class=" default-btn" @click="downLoadZIP()"
  29. :disabled="importDisabled">批量下载ZIP</div>
  30. </div>
  31. <div class="table-con">
  32. <el-table :data="dataList" header-cell-class-name="table-header" row-class-name="table-row-low"
  33. style="width: 100%">
  34. <el-table-column prop="orderNumber" width="300" label="订单号" />
  35. <el-table-column fixed label="文件名" prop="pdfName" align="left" />
  36. <el-table-column fixed prop="pdfUrl" label="文件地址">
  37. <template slot-scope="scope">
  38. <div class="">
  39. <a target="blank" :href="resourcesUrl + scope.row.pdfUrl">
  40. {{ scope.row.pdfUrl }}</a>
  41. </div>
  42. </template>
  43. </el-table-column>
  44. <el-table-column width="230" prop="createTime" label="创建时间" />
  45. <el-table-column width="230" prop="orderTime" label="下单时间" />
  46. <el-table-column fixed="right" align="center" :label="$t('crud.menu')" width="230">
  47. <template slot-scope="scope">
  48. <div class="text-btn-con">
  49. <div class="default-btn text-btn" @click="downLoadPDF(scope.row)">下载PDF文件</div>
  50. <div class="default-btn text-btn" style="color: red" @click="deletePdf(scope.row)">删除</div>
  51. </div>
  52. </template>
  53. </el-table-column>
  54. </el-table>
  55. </div>
  56. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  57. :current-page="page.currentPage" :page-sizes="[10, 20, 50, 100]" :page-size="page.pageSize"
  58. :total="page.total" layout="total, sizes, prev, pager, next, jumper"></el-pagination>
  59. </div>
  60. <!-- 弹窗, 新增 / 修改 -->
  61. <tags-select v-if="tagsSelectVisible" :limit="5" ref="tagsSelect" @refreshTagsArr="refreshTagsSelect"></tags-select>
  62. </div>
  63. </template>
  64. <script>
  65. import JSzip from 'jszip';
  66. import { saveAs } from 'file-saver';
  67. export default {
  68. data() {
  69. return {
  70. theData: null, // 保存上次点击查询的请求条件
  71. dataList: [],
  72. dataListLoading: false,
  73. exportDisabled: false,
  74. importDisabled: false,
  75. tagsSelectVisible: false,
  76. updateBalanceVisible: false,
  77. updateCouponVisible: false,
  78. dataListSelections: [],
  79. addOrUpdateVisible: false,
  80. updateGrowthVisible: false,
  81. updateScoreVisible: false,
  82. updateTagsVisible: false,
  83. importUserVisible: false,
  84. createDateRange: [], // 时间范围
  85. resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
  86. dynamicTags: [],
  87. page: {
  88. total: 0, // 总页数
  89. currentPage: 1, // 当前页数
  90. pageSize: 10 // 每页显示多少条
  91. },
  92. searchForm: {
  93. printChannel: 'Lightning',
  94. orderNumber: undefined,
  95. startTime: undefined, // 起始时间
  96. endTime: undefined, // 结束时间,
  97. pdfName: null,
  98. },
  99. levelTypes: [
  100. {
  101. label: this.$i18n.t('user.ordinaryMember'),
  102. value: 0
  103. }, {
  104. label: this.$i18n.t('user.paidMembership'),
  105. value: 1
  106. }
  107. ],
  108. status: [
  109. {
  110. label: this.$i18n.t('publics.disable'),
  111. value: 0
  112. }, {
  113. label: this.$i18n.t('publics.normal'),
  114. value: 1
  115. }
  116. ]
  117. }
  118. },
  119. components: {
  120. },
  121. mounted() {
  122. this.getDataList(this.page)
  123. },
  124. methods: {
  125. deletePdf(pdf){
  126. this.$confirm("确定要删除PDF文件吗"+ '?', "提示", {
  127. confirmButtonText: this.$i18n.t('crud.filter.submitBtn'),
  128. cancelButtonText: this.$i18n.t('crud.filter.cancelBtn'),
  129. type: 'warning'
  130. }).then(() => {
  131. this.$http({
  132. url: this.$http.adornUrl('/printOrderPdf/printOrderPdf/' + pdf.orderPdfId),
  133. method: 'delete',
  134. data: this.$http.adornData({})
  135. }).then(({ data }) => {
  136. this.$message({
  137. message: this.$i18n.t('publics.operation'),
  138. type: 'success',
  139. duration: 200,
  140. });
  141. this.getDataList(this.page)
  142. })
  143. }).catch(() => { })
  144. },
  145. downLoadPDF(pdf) {
  146. let randomStr = Math.floor(Math.random() * 100000).toString();
  147. this.getPdfFile(this.resourcesUrl + pdf.pdfUrl + "?a=" + randomStr).then(data => {
  148. saveAs(data, pdf.pdfName)
  149. })
  150. },
  151. getPdfFile(url) {
  152. return new Promise((resolve, reject) => {
  153. let xmlhttp = new XMLHttpRequest();
  154. xmlhttp.open("GET", url, true);
  155. xmlhttp.responseType = "blob";
  156. xmlhttp.onload = function () {
  157. if (this.status == 200) {
  158. resolve(this.response);
  159. } else {
  160. reject(this.status);
  161. }
  162. }
  163. xmlhttp.send();
  164. });
  165. },
  166. getAllNeed() {
  167. if (!this.theData) {
  168. this.theData = JSON.parse(JSON.stringify(this.searchForm))
  169. }
  170. this.$http({
  171. url: this.$http.adornUrl('/printOrderPdf/printOrderPdf/page'),
  172. method: 'get',
  173. params: this.$http.adornParams(
  174. Object.assign(
  175. {
  176. current: 1,
  177. size: 9999
  178. },
  179. this.theData
  180. )
  181. )
  182. }).then(({ data }) => {
  183. console.log(data.records)
  184. let pdfList = data.records;
  185. // const arr = [{fileDownUrl:'地址', fileDownName:'文件名'}] // 需要下载打包的路径, 可以是本地相对路径, 也可以是跨域的全路径
  186. const zip = new JSzip()
  187. const cache = {}
  188. const promises = []
  189. pdfList.forEach((pdf, j) => {
  190. let randomStr = Math.floor(Math.random() * 100000).toString();
  191. const promise = this.getPdfFile(this.resourcesUrl + pdf.pdfUrl + "?a=" + randomStr).then(data => {
  192. // 下载文件, 并存成blob对象
  193. const fileName = pdf.pdfFolderName + "/" + pdf.pdfName; // 获取文件名,一定要包含文件的后缀名(因为重复的文件名只会下载一个,故需要加入下标 不同名)
  194. // zip.folder(pdf.pdfFolderName).file(pdf.pdfName, data);
  195. zip.file(pdf.pdfName, data);
  196. cache[fileName] = data
  197. })
  198. promises.push(promise)
  199. });
  200. Promise.all(promises).then(() => {
  201. zip.generateAsync({ type: "blob" }).then(content => {
  202. // 生成二进制流 然后保存文件(如果这个下载不了 也可以将下方这一行换成a标签下载逻辑)
  203. saveAs(content, "批量下载PDF压缩包.zip") // 利用file-saver保存文件 自定义文件名
  204. // this.wavePrintOrderPdfDownloadLoading = false;
  205. })
  206. })
  207. });
  208. },
  209. downLoadZIP() {
  210. if (!!this.searchForm.startTime && !!this.searchForm.endTime) {
  211. if ((Date.parse(new Date(this.searchForm.endTime).toString()) - Date.parse(new Date(this.searchForm.startTime).toString())) / 1000 / 60 / 60 <= 24) {
  212. this.getAllNeed()
  213. } else {
  214. this.$message({
  215. message: '批量下载ZIP范围最大为24小时',
  216. type: 'warning'
  217. });
  218. }
  219. } else {
  220. this.$message({
  221. message: '请先选择创建时间,范围最大为24小时',
  222. type: 'warning'
  223. });
  224. }
  225. },
  226. // 获取数据列表 /admin/user/page
  227. getDataList(page, newData = false) {
  228. if (newData || !this.theData) {
  229. this.theData = JSON.parse(JSON.stringify(this.searchForm))
  230. }
  231. this.dataListLoading = true
  232. this.$http({
  233. url: this.$http.adornUrl('/printOrderPdf/printOrderPdf/page'),
  234. method: 'get',
  235. params: this.$http.adornParams(
  236. Object.assign(
  237. {
  238. current: page == null ? this.page.currentPage : page.currentPage,
  239. size: page == null ? this.page.pageSize : page.pageSize
  240. },
  241. this.theData
  242. )
  243. )
  244. }).then(({ data }) => {
  245. this.dataList = data.records
  246. this.page.total = data.total
  247. this.dataListLoading = false
  248. })
  249. },
  250. // 新增 / 修改
  251. addOrUpdateHandle(id) {
  252. this.addOrUpdateVisible = true
  253. this.$nextTick(() => {
  254. this.$refs.addOrUpdate.init(id)
  255. })
  256. },
  257. // 条件查询 JSON.stringify(arr)
  258. searchChange(newData = false) {
  259. this.page.currentPage = 1
  260. this.getDataList(this.page, newData)
  261. },
  262. handleSizeChange(val) {
  263. this.page.pageSize = val
  264. this.getDataList(this.page)
  265. },
  266. handleCurrentChange(val) {
  267. this.page.currentPage = val
  268. this.getDataList(this.page)
  269. },
  270. resetForm(formName) {
  271. this.$refs[formName].resetFields()
  272. this.searchForm.startTime = undefined
  273. this.searchForm.endTime = undefined
  274. this.searchForm.orderNumber = undefined
  275. this.createDateRange = []
  276. this.theData = null
  277. this.getDataList(this.page)
  278. },
  279. createTimeChange() {
  280. if (!this.createDateRange || this.createDateRange.length === 0) {
  281. this.searchForm.startTime = undefined
  282. this.searchForm.endTime = undefined
  283. } else {
  284. this.searchForm.startTime = this.createDateRange[0]
  285. this.searchForm.endTime = this.createDateRange[1]
  286. }
  287. this.searchChange(true)
  288. },
  289. // 多选变化
  290. selectionChange(val) {
  291. this.dataListSelections = val
  292. },
  293. updateGrowth(id) {
  294. if (this.dataListSelections.length <= 0) {
  295. return
  296. }
  297. var ids = id ? [id] : this.dataListSelections.map(item => {
  298. return item.userId
  299. })
  300. // console.log(ids)
  301. this.updateGrowthVisible = true
  302. this.$nextTick(() => {
  303. this.$refs.updateGrowth.init(ids)
  304. })
  305. },
  306. // 修改成长值
  307. updateScore(id) {
  308. if (this.dataListSelections.length <= 0) {
  309. return
  310. }
  311. var ids = id ? [id] : this.dataListSelections.map(item => {
  312. return item.userId
  313. })
  314. // console.log(ids)
  315. this.updateScoreVisible = true
  316. this.$nextTick(() => {
  317. this.$refs.updateScore.init(ids)
  318. })
  319. },
  320. /**
  321. * 导出单品
  322. */
  323. exportUser() {
  324. this.exportDisabled = true
  325. this.$http({
  326. url: this.$http.adornUrl('/admin/user/exportUser'),
  327. method: 'get',
  328. params: this.$http.adornParams(this.searchForm),
  329. responseType: 'blob' // 解决文件下载乱码问题
  330. }).then(({ data }) => {
  331. this.exportDisabled = false
  332. var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' })
  333. const fileName = this.$i18n.t('user.userInformationForm')
  334. const elink = document.createElement('a')
  335. if ('download' in elink) { // 非IE下载
  336. elink.download = fileName
  337. elink.style.display = 'none'
  338. elink.href = URL.createObjectURL(blob)
  339. document.body.appendChild(elink)
  340. elink.click()
  341. URL.revokeObjectURL(elink.href) // 释放URL 对象
  342. document.body.removeChild(elink)
  343. } else { // IE10+下载
  344. navigator.msSaveBlob(blob, fileName)
  345. }
  346. })
  347. }
  348. }
  349. }
  350. </script>
  351. <style lang="scss" scoped>
  352. .mod-user {
  353. .tips .text {
  354. color: #FF0000;
  355. }
  356. }
  357. .TagS {
  358. margin-right: 10px !important;
  359. }
  360. </style>