reportRule.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. <template>
  2. <basic-container>
  3. <div class="tabStyle">
  4. <avue-crud
  5. :data="tableData"
  6. :option="option"
  7. :page="page"
  8. :table-loading="tableLoading"
  9. @on-load="getList"
  10. @search-change="searchVal"
  11. @size-change="sizeChange"
  12. @current-change="currentChange"
  13. >
  14. <template slot="menu" slot-scope="scope">
  15. <el-button
  16. type="text"
  17. size="small"
  18. icon="el-icon-tickets"
  19. v-if="
  20. scope.row.reportStatus == '1' || scope.row.reportStatus == '4'
  21. "
  22. @click="submitBtn(scope.row, scope.index)"
  23. >提交
  24. </el-button>
  25. <el-button
  26. type="text"
  27. size="small"
  28. icon="el-icon-delete"
  29. v-if="
  30. scope.row.reportStatus == '1' || scope.row.reportStatus == '4'
  31. "
  32. @click="delBtn(scope.row, scope.index)"
  33. >删除
  34. </el-button>
  35. <el-button
  36. type="text"
  37. size="small"
  38. icon="el-icon-view"
  39. @click="lookBtn(scope.row, scope.index)"
  40. >查看
  41. </el-button>
  42. <el-button
  43. type="text"
  44. size="small"
  45. icon="el-icon-folder-checked"
  46. v-if="
  47. scope.row.reportStatus == '3' ||
  48. scope.row.reportStatus == '5' ||
  49. scope.row.reportStatus == '6'
  50. "
  51. @click="exportBtn(scope.row, scope.index)"
  52. >
  53. 导出
  54. </el-button>
  55. </template>
  56. </avue-crud>
  57. <!-- 导出弹窗 -->
  58. <el-dialog
  59. title="导出"
  60. :visible.sync="exportDig"
  61. width="30%"
  62. :close-on-click-modal="false"
  63. center
  64. >
  65. <!-- 第一次导出 -->
  66. <template>
  67. <div class="down-item">
  68. <span>word格式:</span>
  69. <template
  70. v-if="checkRow && checkRow.reportOpt.status === 'NOT_GENERATE'"
  71. >
  72. <el-button
  73. class="first"
  74. @click="taskExport('word')"
  75. :loading="wordLoading"
  76. >生成报告</el-button
  77. >
  78. </template>
  79. <template
  80. v-else-if="checkRow && checkRow.reportOpt.status === 'GENERATING'"
  81. >
  82. <el-button class="first" :loading="true">报告生成中...</el-button>
  83. </template>
  84. <template
  85. v-else-if="
  86. checkRow &&
  87. (checkRow.reportOpt.status === 'GENERATED' ||
  88. checkRow.reportOpt.status === 'ERROR')
  89. "
  90. >
  91. <el-button @click="taskExport('word')">重新导出</el-button>
  92. <el-button
  93. @click="downloadTask('word')"
  94. v-if="checkRow.reportOpt.status === 'GENERATED'"
  95. >下载报告</el-button
  96. >
  97. <el-button
  98. disabled
  99. :title="checkRow.reportOpt.errorMsg"
  100. v-else-if="checkRow.reportOpt.status === 'ERROR'"
  101. >导出失败</el-button
  102. >
  103. </template>
  104. <div class="title-msg">
  105. <p v-if="checkRow && checkRow.reportOpt.status === 'GENERATED'">
  106. 下载截止日期:{{ checkRow.reportOpt.ttl }}
  107. </p>
  108. <p v-if="checkRow && checkRow.reportOpt.status === 'ERROR'">
  109. 本次导出失败:{{ checkRow.reportOpt.errorMsg }}
  110. </p>
  111. </div>
  112. </div>
  113. <div class="down-item">
  114. <span>excel格式:</span>
  115. <template
  116. v-if="
  117. checkRow && checkRow.excelReportOpt.status === 'NOT_GENERATE'
  118. "
  119. >
  120. <el-button
  121. class="first"
  122. @click="taskExport('excel')"
  123. :loading="excelLoading"
  124. >生成报告</el-button
  125. >
  126. </template>
  127. <template
  128. v-if="checkRow && checkRow.excelReportOpt.status === 'GENERATING'"
  129. >
  130. <el-button class="first" :loading="true">报告生成中...</el-button>
  131. </template>
  132. <template
  133. v-else-if="
  134. checkRow &&
  135. (checkRow.excelReportOpt.status === 'GENERATED' ||
  136. checkRow.excelReportOpt.status === 'ERROR')
  137. "
  138. >
  139. <el-button @click="taskExport('excel')">重新导出</el-button>
  140. <el-button
  141. @click="downloadTask('excel')"
  142. v-if="checkRow.excelReportOpt.status === 'GENERATED'"
  143. >下载报告</el-button
  144. >
  145. <el-button
  146. disabled
  147. :title="checkRow.excelReportOpt.errorMsg"
  148. v-else-if="checkRow.excelReportOpt.status === 'ERROR'"
  149. >导出失败</el-button
  150. >
  151. </template>
  152. <div class="title-msg">
  153. <p
  154. v-if="
  155. checkRow && checkRow.excelReportOpt.status === 'GENERATED'
  156. "
  157. >
  158. 下载截止日期:{{ checkRow.excelReportOpt.ttl }}
  159. </p>
  160. <p v-if="checkRow && checkRow.excelReportOpt.status === 'ERROR'">
  161. 本次导出失败:{{ checkRow.excelReportOpt.errorMsg }}
  162. </p>
  163. </div>
  164. </div>
  165. </template>
  166. <span slot="footer" class="dialog-footer">
  167. 注意: 1.报告将于24小时之内生成完毕,请注意下载。<br />
  168. <i style="margin-left:62px"></i
  169. >2.报告汇总为封面+任务数据汇总+任务列表明细。
  170. <br />
  171. <i style="margin-left:10px"></i>3.报告详情为每条任务的任务详情+图片。
  172. </span>
  173. </el-dialog>
  174. </div>
  175. </basic-container>
  176. </template>
  177. <script>
  178. import { reportRuledata } from "@/const/crud/reportRule";
  179. import {
  180. reportPage,
  181. updateReportStatus,
  182. delObj,
  183. exportNbReport,
  184. exportExcelNbReport
  185. } from "@/api/taskManagement/reportRule";
  186. export default {
  187. name: "points",
  188. data() {
  189. return {
  190. checkRow: null,
  191. reportForm: {
  192. jfbID: "",
  193. bgID: "",
  194. rwhjjfz: "",
  195. hjrws: "",
  196. jsqy: ""
  197. },
  198. tableData: [],
  199. wordLoading: false,
  200. excelLoading: false,
  201. option: reportRuledata,
  202. page: {
  203. total: 0, // 总页数
  204. currentPage: 1, // 当前页数
  205. pageSize: 20 // 每页显示多少条
  206. },
  207. tableLoading: false,
  208. searchForm: {},
  209. taskExportLoading: false,
  210. taskExportInfoLoading: false,
  211. exportDig: false
  212. };
  213. },
  214. components: {},
  215. mounted() {},
  216. computed: {},
  217. methods: {
  218. // 初始化页面
  219. getList(page, params) {
  220. this.tableLoading = true;
  221. reportPage(
  222. Object.assign(
  223. {
  224. type: 1,
  225. current: page.currentPage,
  226. size: page.pageSize
  227. // queryScoreId: "",
  228. // queryName: ""
  229. },
  230. params,
  231. this.searchForm
  232. )
  233. )
  234. .then(response => {
  235. this.tableData = response.data.data.records;
  236. this.page.total = response.data.data.total;
  237. this.tableLoading = false;
  238. })
  239. .catch(() => {
  240. this.tableLoading = false;
  241. });
  242. },
  243. // 搜索按钮
  244. searchVal(form, done) {
  245. this.searchForm = form;
  246. this.page.currentPage = 1;
  247. this.getList(this.page, form);
  248. done();
  249. },
  250. // 提交按钮
  251. submitBtn(row) {
  252. let args = {
  253. id: row.id,
  254. reportStatus: 2
  255. };
  256. this.$confirm('是否提交报告id为"' + row.reportNo + '"的数据?', "提示", {
  257. confirmButtonText: "确定",
  258. cancelButtonText: "取消",
  259. type: "warning"
  260. })
  261. .then(function() {
  262. return updateReportStatus(args);
  263. })
  264. .then(() => {
  265. this.getList(this.page);
  266. this.$message.success("提交成功");
  267. })
  268. .catch(function() {});
  269. },
  270. // 删除按钮
  271. delBtn(row, index) {
  272. // let args = {
  273. // id: row.id
  274. // }
  275. this.$confirm('是否删除报告id为"' + row.reportNo + '"的数据?', "删除", {
  276. confirmButtonText: "确定",
  277. cancelButtonText: "取消",
  278. type: "warning"
  279. })
  280. .then(() => {
  281. delObj(row.id)
  282. .then(() => {
  283. this.getList(this.page);
  284. this.$notify.success("删除成功");
  285. })
  286. .catch(() => {
  287. this.$notify.error("删除失败");
  288. });
  289. })
  290. .catch(function() {});
  291. },
  292. // 查看按钮
  293. lookBtn(row) {
  294. this.$router.push({
  295. path: "/admin/taskManagement/reportRulelook?id=" + row.id
  296. });
  297. },
  298. // 分页查询
  299. sizeChange(pageSize) {
  300. this.page.pageSize = pageSize;
  301. },
  302. currentChange(current) {
  303. this.page.currentPage = current;
  304. },
  305. // 导出按钮
  306. exportBtn(row) {
  307. this.exportDig = true;
  308. this.checkRow = row;
  309. },
  310. async taskExport(type) {
  311. this.taskExportLoading = true;
  312. let row = this.checkRow;
  313. var obj = {
  314. id: row.id,
  315. exportType: 1,
  316. scoreId: row.scoreId
  317. };
  318. let res;
  319. if (type === "word") {
  320. this.wordLoading = true;
  321. res = await exportNbReport(obj);
  322. } else if (type === "excel") {
  323. this.excelLoading = true;
  324. res = await exportExcelNbReport(obj);
  325. }
  326. if (res.data) {
  327. this.$message.success(res.data.data);
  328. this.exportDig = false;
  329. this.getList(this.page);
  330. this.wordLoading = false;
  331. this.excelLoading = false;
  332. } else {
  333. this.$message.error("导出失败");
  334. }
  335. },
  336. downloadTask(type) {
  337. let latestUrl;
  338. if (type === "word") {
  339. latestUrl = this.checkRow.reportOpt.latestUrl;
  340. } else if (type === "excel") {
  341. latestUrl = this.checkRow.excelReportOpt.latestUrl;
  342. }
  343. let a = document.createElement("a");
  344. a.href = latestUrl;
  345. a.click();
  346. this.$message.success("导出汇总报告成功");
  347. this.exportDig = false;
  348. },
  349. taskExportInfo() {
  350. this.taskExportInfoLoading = true;
  351. let row = this.checkRow;
  352. var obj = {
  353. id: row.id,
  354. exportType: 2,
  355. scoreId: row.scoreId
  356. };
  357. exportNbReport(obj)
  358. .then(response => {
  359. if (undefined == response.data || undefined == response.data.data) {
  360. this.$message.error("导出失败");
  361. return false;
  362. }
  363. let obj = response.data.data;
  364. let a = document.createElement("a");
  365. a.href = obj.url; // 这里的请求方式为get,如果需要认证,接口上需要带上token
  366. a.click();
  367. this.$message.success("导出报告详情成功");
  368. this.taskExportInfoLoading = false;
  369. })
  370. .catch(() => {
  371. this.taskExportInfoLoading = false;
  372. });
  373. }
  374. }
  375. };
  376. </script>
  377. <style lang="scss" scoped>
  378. .down-item {
  379. margin-left: 20px;
  380. margin-bottom: 15px;
  381. span {
  382. width: 80px;
  383. display: inline-block;
  384. text-align: right;
  385. }
  386. .first {
  387. width: 240px;
  388. }
  389. }
  390. </style>
  391. <style>
  392. .tabStyle {
  393. width: 100%;
  394. margin-top: 10px;
  395. }
  396. .el-input__inner {
  397. border: 1px solid #dcdfe6 !important;
  398. }
  399. .generating {
  400. color: #1e90ff;
  401. text-align: center;
  402. display: block;
  403. }
  404. .btns {
  405. display: flex;
  406. justify-content: center;
  407. }
  408. .title-msg {
  409. text-align: center;
  410. margin-top: 10px;
  411. }
  412. </style>