real-time-export.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <template>
  2. <div class="real-time-export" v-loading="loading">
  3. <div class="financeReport-ul-box">
  4. <ul class="financeReport-ul clearfix">
  5. <li v-for="item in options" :key="item.value">
  6. <div class="label">{{ item.label }}:</div>
  7. <div class="time">
  8. <period-date-picker
  9. :start="item.start"
  10. :end="item.end"
  11. :type="3"
  12. :width="'135px'"
  13. :size="searchSize"
  14. @timeReturned="timeReturned($event, item.value)"
  15. />
  16. </div>
  17. <div class="operation">
  18. <el-button
  19. type="primary"
  20. class="fr"
  21. icon="el-icon-download"
  22. style="margin-left: 15px"
  23. :size="searchSize"
  24. @click="batchExport(item.value)"
  25. >下载</el-button
  26. >
  27. <el-button
  28. type="warning"
  29. class="fr"
  30. :size="searchSize"
  31. @click="restSearch(item.value)"
  32. >
  33. 重置
  34. </el-button>
  35. </div>
  36. </li>
  37. </ul>
  38. </div>
  39. </div>
  40. </template>
  41. <script>
  42. import resToken from "@/mixins/resToken";
  43. import urlConfig from "@/apis/url-config";
  44. import PeriodDatePicker from "./components/PeriodDatePicker";
  45. import { mapGetters } from "vuex";
  46. export default {
  47. name: "financeReport",
  48. mixins: [resToken],
  49. components: {
  50. PeriodDatePicker,
  51. },
  52. computed: {
  53. //组件SIZE设置
  54. ...mapGetters(["tablebtnSize", "searchSize", "size"]),
  55. //组件SIZE设置
  56. powers() {
  57. const tran =
  58. this.$store.getters.btnList.find(
  59. (item) => item.menu_route == "financeReport"
  60. ) || {};
  61. const { action } = tran ?? {};
  62. return action ?? [];
  63. },
  64. },
  65. data() {
  66. return {
  67. options: [
  68. // {
  69. // value: "13",
  70. // label: "出入库明细表",
  71. // start: "",
  72. // end: "",
  73. // url: "outinreport",
  74. // },
  75. // {
  76. // value: "14",
  77. // label: "收入明细表",
  78. // start: "",
  79. // end: "",
  80. // url: "inforeport",
  81. // },
  82. // {
  83. // value: "15",
  84. // label: "回票公司明细表",
  85. // start: "",
  86. // end: "",
  87. // url: "invcomreport",
  88. // },
  89. // {
  90. // value: "16",
  91. // label: "回票明细表",
  92. // start: "",
  93. // end: "",
  94. // url: "invreport",
  95. // },
  96. // {
  97. // value: "11",
  98. // label: "应收账款账龄表",
  99. // start: "",
  100. // end: "",
  101. // url: "downqrdpay",
  102. // },
  103. // {
  104. // value: "12",
  105. // label: "应收账款开票汇总表",
  106. // start: "",
  107. // end: "",
  108. // url: "downqrdinv",
  109. // },
  110. // {
  111. // value: "6",
  112. // label: "应收台账",
  113. // start: "",
  114. // end: "",
  115. // url: "Admin/downreportcwtz",
  116. // },
  117. // {
  118. // value: "1",
  119. // label: "确认单台账",
  120. // start: "",
  121. // end: "",
  122. // url: "Admin/downreportqrdtz",
  123. // },
  124. // {
  125. // value: "2",
  126. // label: "确认单明细",
  127. // start: "",
  128. // end: "",
  129. // url: "Admin/downreportqrd",
  130. // },
  131. {
  132. value: "16",
  133. label: "经营分析报表",
  134. start: "",
  135. end: "",
  136. url: "Admin/getjingfen",
  137. },
  138. // {
  139. // value: "3",
  140. // label: "采购单台账",
  141. // start: "",
  142. // end: "",
  143. // url: "Admin/downreportcgdtz",
  144. // },
  145. // {
  146. // value: "4",
  147. // label: "采购单明细",
  148. // start: "",
  149. // end: "",
  150. // url: "Admin/downreportcgd",
  151. // },
  152. // {
  153. // value: "5",
  154. // label: "退货台账",
  155. // start: "",
  156. // end: "",
  157. // url: "Admin/downreportthtz",
  158. // },
  159. // {
  160. // value: "7",
  161. // label: "核算确认单",
  162. // start: "",
  163. // end: "",
  164. // url: "downqrd",
  165. // },
  166. // {
  167. // value: "8",
  168. // label: "核算采购单",
  169. // start: "",
  170. // end: "",
  171. // url: "downcgd",
  172. // },
  173. // {
  174. // value: "9",
  175. // label: "业绩确认采购单",
  176. // start: "",
  177. // end: "",
  178. // url: "downqrdtz",
  179. // },
  180. // {
  181. // value: "10",
  182. // label: "业绩退货单",
  183. // start: "",
  184. // end: "",
  185. // url: "downth",
  186. // },
  187. ],
  188. loading: false,
  189. fileUrl: urlConfig.baseURL,
  190. };
  191. },
  192. methods: {
  193. restSearch(type) {
  194. let index = this.resType(type);
  195. if (index !== -1) {
  196. this.options[index].start = "";
  197. this.options[index].end = "";
  198. }
  199. },
  200. async timeReturned(e, type) {
  201. let index = this.resType(type);
  202. if (index !== -1) {
  203. if (e.startTime !== "") {
  204. this.options[index].start = e.startTime;
  205. } else {
  206. this.options[index].start = "";
  207. }
  208. if (e.endTime !== "") {
  209. this.options[index].end = e.endTime;
  210. } else {
  211. this.options[index].end = "";
  212. }
  213. }
  214. },
  215. resType(value) {
  216. return this.options.findIndex((v1) => v1.value === value);
  217. },
  218. /**
  219. * 批量下载开票信息
  220. * * @param {Array} selection //选中的对账编码
  221. */
  222. async batchExport(type) {
  223. let index = this.resType(type);
  224. if (index !== -1) {
  225. let url = this.options[index].url;
  226. let title = this.options[index].label;
  227. let model = {
  228. start: this.options[index].start,
  229. end: this.options[index].end,
  230. };
  231. if (!this.loading) {
  232. if (model.start === "" || model.end === "") {
  233. this.$message.warning("请选择时间区间!");
  234. return;
  235. }
  236. this.loading = true;
  237. let httpType = `aplication/zip`;
  238. axios({
  239. method: "post",
  240. url: this.fileUrl + url,
  241. responseType: "blob",
  242. data: model,
  243. headers: {
  244. Accept: httpType,
  245. },
  246. })
  247. .then((res) => {
  248. if (res && res.status == 200 && res.data) {
  249. let blob = new Blob([res.data], {
  250. type: httpType,
  251. });
  252. let url = window.URL.createObjectURL(blob);
  253. let aLink = document.createElement("a");
  254. aLink.style.display = "none";
  255. aLink.href = url;
  256. aLink.setAttribute(
  257. "download",
  258. `${model.start}至${model.end}${title}.zip`
  259. );
  260. document.body.appendChild(aLink);
  261. aLink.click();
  262. document.body.removeChild(aLink); //下载完成移除元素
  263. window.URL.revokeObjectURL(url); //释放掉blob对象
  264. this.$message.success(title + `信息下载成功!`);
  265. setTimeout(() => {
  266. this.loading = false;
  267. }, 500);
  268. } else {
  269. this.$message.error("时间区间过长,请修改后再试!");
  270. setTimeout(() => {
  271. this.loading = false;
  272. }, 500);
  273. }
  274. })
  275. .catch((error) => {
  276. this.$message.error("时间区间过长,请修改后再试!");
  277. this.loading = false;
  278. });
  279. }
  280. }
  281. },
  282. },
  283. };
  284. </script>
  285. <style lang="scss" scoped>
  286. .real-time-export {
  287. .financeReport-ul-box {
  288. width: 100%;
  289. padding: 0 10% 0 4%;
  290. text-align: center;
  291. .financeReport-ul {
  292. width: 680px;
  293. display: block;
  294. box-sizing: border-box;
  295. text-align: left;
  296. margin: 0 auto;
  297. li {
  298. float: left;
  299. width: 100%;
  300. display: block;
  301. box-sizing: border-box;
  302. padding: 10px 0;
  303. .label {
  304. width: 180px;
  305. float: left;
  306. height: 32px;
  307. text-align: right;
  308. line-height: 32px;
  309. padding: 0 15px 0 0;
  310. }
  311. .time {
  312. float: left;
  313. width: 300px;
  314. }
  315. .operation {
  316. float: left;
  317. width: 160px;
  318. }
  319. }
  320. }
  321. }
  322. }
  323. </style>