real-time-export.vue 8.5 KB

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