levelManager.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>考级报名列表
  5. </h2>
  6. <div class="m-core">
  7. <!-- 搜索标题 -->
  8. <el-form :inline="true"
  9. class="searchForm"
  10. v-model.trim="searchForm">
  11. <el-form-item>
  12. <el-input v-model.trim="searchForm.orderNo"
  13. placeholder="请输入订单编号"></el-input>
  14. </el-form-item>
  15. <el-form-item>
  16. <el-input v-model.trim="searchForm.transNo"
  17. placeholder="请输入交易流水号"></el-input>
  18. </el-form-item>
  19. <!-- <el-form-item>
  20. <el-input v-model.trim="searchForm.city"
  21. @keyup.enter.native="city"
  22. placeholder="请输入城市名"></el-input>
  23. </el-form-item> -->
  24. <el-form-item>
  25. <el-select v-model.trim="searchForm.organId"
  26. filterable
  27. clearable
  28. placeholder="请选择分部">
  29. <el-option v-for="item in branchList"
  30. :key="item.id"
  31. :label="item.label"
  32. :value="item.value"></el-option>
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item>
  36. <el-select class="multiple"
  37. v-model.trim="searchForm.status"
  38. filterable
  39. clearable
  40. placeholder="请选择缴费状态">
  41. <el-option value="reg"
  42. label="未缴费"></el-option>
  43. <el-option value="pay"
  44. label="已缴费"></el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item>
  48. <el-date-picker v-model.trim="orderDate"
  49. style="width:410px;"
  50. type="daterange"
  51. value-format="yyyy-MM-dd"
  52. @change="searchOrderDate"
  53. range-separator="至"
  54. start-placeholder="开始日期"
  55. end-placeholder="结束日期"
  56. :picker-options="{
  57. firstDayOfWeek: 1
  58. }"></el-date-picker>
  59. </el-form-item>
  60. <el-form-item>
  61. <el-button @click="onSearch"
  62. type="danger">搜索</el-button>
  63. <!-- <el-button @click="onReSet" type="primary">重置</el-button> -->
  64. <el-button @click="onExport"
  65. v-permission="'export/degreeRegistration/825'"
  66. type="primary">导出</el-button>
  67. </el-form-item>
  68. </el-form>
  69. <div style="font-size: 14px; color: #F85043; padding-bottom: 10px;">
  70. 报考总人数:{{ totalNumber }}人
  71. <i style="width: 10px; display: inline-block"></i>
  72. 实收总金额:{{ totalAmount }}元
  73. </div>
  74. <div class="tableWrap">
  75. <el-table :data="tableList"
  76. :header-cell-style="{background:'#EDEEF0',color:'#444'}">
  77. >
  78. <el-table-column width="90px"
  79. align="center"
  80. prop="id"
  81. label="编号"></el-table-column>
  82. <el-table-column align="center"
  83. prop="name"
  84. label="姓名"></el-table-column>
  85. <el-table-column align="center"
  86. prop="orderNo"
  87. label="订单编号"></el-table-column>
  88. <el-table-column align="center"
  89. prop="transNo"
  90. label="交易流水号">
  91. <template slot-scope="scope">
  92. <el-tooltip placement="top-start">
  93. <div slot="content">{{ scope.row.transNo }}</div>
  94. <span>{{ scope.row.transNo }}</span>
  95. </el-tooltip>
  96. </template>
  97. </el-table-column>
  98. <el-table-column align="center"
  99. prop="gender"
  100. label="性别">
  101. <template slot-scope="scope">{{ scope.row.gender == 1 ? '男' : '女' }}</template>
  102. </el-table-column>
  103. <el-table-column align="center"
  104. prop="idcard"
  105. label="身份证号"></el-table-column>
  106. <el-table-column align="center"
  107. prop="mobile"
  108. label="联系电话"></el-table-column>
  109. <el-table-column align="center"
  110. prop="city"
  111. label="城市"></el-table-column>
  112. <el-table-column align="center"
  113. prop="subject"
  114. label="报考乐器"></el-table-column>
  115. <el-table-column align="center"
  116. prop="level"
  117. label="报考级别"></el-table-column>
  118. <el-table-column align="center"
  119. prop="theoryLevel"
  120. label="乐理级别"></el-table-column>
  121. <el-table-column align="center"
  122. label="缴费状态">
  123. <template slot-scope="scope">{{ scope.row.status == 2 ? '已缴费' : '未缴费' }}</template>
  124. </el-table-column>
  125. <el-table-column align="center"
  126. prop="money"
  127. label="报考级别费用">
  128. <template slot-scope="scope">{{ scope.row.money }}元</template>
  129. </el-table-column>
  130. <el-table-column align="center"
  131. prop="theoryMoney"
  132. label="乐理级别费用">
  133. <template slot-scope="scope">{{ scope.row.theoryMoney }}元</template>
  134. </el-table-column>
  135. <el-table-column align="center"
  136. label="证书">
  137. <template slot-scope="scope">
  138. <div v-if="scope.row.theoryCert">
  139. <el-image fit="cover"
  140. style="width: 100px; height: 100px"
  141. :src="scope.row.theoryCert"
  142. :preview-src-list="[scope.row.theoryCert]"></el-image>
  143. </div>
  144. <div v-else>--</div>
  145. </template>
  146. </el-table-column>
  147. <el-table-column align="center"
  148. prop="createTime"
  149. label="报名时间"></el-table-column>
  150. <el-table-column align="center"
  151. prop="memo"
  152. label="备注"></el-table-column>
  153. <!-- <el-table-column align="center" label="操作">
  154. <template slot-scope="scope">
  155. <el-button @click="onTypeDelOpeation(scope.row)"
  156. v-permission="'helpCenterContent/delete'" type="text">删除</el-button>
  157. </template>
  158. </el-table-column>-->
  159. </el-table>
  160. <pagination :total="pageInfo.total"
  161. :page.sync="pageInfo.page"
  162. :limit.sync="pageInfo.limit"
  163. :page-sizes="pageInfo.page_size"
  164. @pagination="getList" />
  165. </div>
  166. </div>
  167. </div>
  168. </template>
  169. <script>
  170. import pagination from "@/components/Pagination/index";
  171. import axios from "axios";
  172. import cleandeep from 'clean-deep'
  173. // import store from '@/store'
  174. import { degreeQueryPage } from "./levelManageApi";
  175. import { getToken } from "@/utils/auth";
  176. import { getEmployeeOrgan } from "@/api/buildTeam";
  177. import load from "@/utils/loading";
  178. export default {
  179. components: { pagination },
  180. name: "helpCategory",
  181. data () {
  182. return {
  183. orderDate: null,
  184. searchForm: {
  185. orderNo: null,
  186. transNo: null,
  187. city: null,
  188. status: null,
  189. startTime: null,
  190. organId: null,
  191. endTime: null,
  192. },
  193. totalNumber: 0,
  194. totalAmount: 0,
  195. tableList: [],
  196. branchList: [], // 分部列表
  197. pageInfo: {
  198. // 分页规则
  199. limit: 10, // 限制显示条数
  200. page: 1, // 当前页
  201. total: 0, // 总条数
  202. page_size: [10, 20, 40, 50], // 选择限制显示条数
  203. },
  204. tempTreeList: [],
  205. };
  206. },
  207. activated () {
  208. this.getList();
  209. this.__init();
  210. },
  211. mounted () {
  212. this.getList();
  213. this.__init();
  214. },
  215. methods: {
  216. __init () {
  217. getEmployeeOrgan().then((res) => {
  218. if (res.code == 200) {
  219. this.branchList = [];
  220. res.data.forEach((item) => {
  221. this.branchList.push({
  222. label: item.name,
  223. value: item.id,
  224. });
  225. });
  226. }
  227. });
  228. },
  229. onSearch () {
  230. let pageInfo = this.pageInfo;
  231. pageInfo.page = 1;
  232. this.getList();
  233. },
  234. onReSet () {
  235. // 重置搜索
  236. this.orderDate = null;
  237. this.searchForm = {
  238. orderNo: null,
  239. transNo: null,
  240. city: null,
  241. status: null,
  242. startTime: null,
  243. organId: null,
  244. endTime: null,
  245. };
  246. this.getList();
  247. },
  248. getList () {
  249. let searchForm = this.searchForm;
  250. let params = cleandeep(searchForm)
  251. // {
  252. // orderNo: searchForm.orderNo ? searchForm.orderNo : null,
  253. // transNo: searchForm.transNo ? searchForm.transNo : null,
  254. // city: searchForm.city ? searchForm.city : null,
  255. // status: searchForm.status ? searchForm.status : null,
  256. // startTime: searchForm.startTime ? searchForm.startTime : null,
  257. // endTime: searchForm.endTime ? searchForm.endTime : null,
  258. // organId: searchForm.organId ? searchForm.organId : null,
  259. // page: this.pageInfo.page,
  260. // rows: this.pageInfo.limit,
  261. // };
  262. degreeQueryPage(params).then((res) => {
  263. let result = res.data;
  264. if (res.code == 200) {
  265. this.totalNumber = result.total;
  266. this.totalAmount = result.totalAmount;
  267. this.tableList = result.rows;
  268. this.pageInfo.total = result.total;
  269. }
  270. });
  271. },
  272. searchOrderDate (value) {
  273. if (value) {
  274. this.searchForm.startTime = value[0];
  275. this.searchForm.endTime = value[1];
  276. } else {
  277. this.searchForm.startTime = null;
  278. this.searchForm.endTime = null;
  279. }
  280. },
  281. // 导出
  282. onExport () {
  283. let url = "/api-web/export/degreeRegistration";
  284. let searchForm = this.searchForm;
  285. let params = cleandeep(searchForm)
  286. // {
  287. // orderNo: searchForm.orderNo ? searchForm.orderNo : null,
  288. // transNo: searchForm.transNo ? searchForm.transNo : null,
  289. // city: searchForm.city ? searchForm.city : null,
  290. // status: searchForm.status ? searchForm.status : null,
  291. // startTime: searchForm.startTime ? searchForm.startTime : null,
  292. // endTime: searchForm.endTime ? searchForm.endTime : null,
  293. // };
  294. const options = {
  295. method: "get",
  296. headers: {
  297. Authorization: getToken(),
  298. },
  299. url,
  300. params: params,
  301. responseType: "blob",
  302. };
  303. this.$confirm("您确定导出列表?", "提示", {
  304. confirmButtonText: "确定",
  305. cancelButtonText: "取消",
  306. type: "warning",
  307. })
  308. .then(() => {
  309. load.startLoading();
  310. axios(options)
  311. .then((res) => {
  312. let blob = new Blob([res.data], {
  313. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  314. type: "application/vnd.ms-excel;charset=utf-8",
  315. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  316. });
  317. let text = new Response(blob).text();
  318. text.then((res) => {
  319. // 判断是否报错
  320. if (res.indexOf("code") != -1) {
  321. let json = JSON.parse(res);
  322. this.$message.error(json.msg);
  323. } else {
  324. let objectUrl = URL.createObjectURL(blob);
  325. let link = document.createElement("a");
  326. let nowTime = new Date();
  327. let ymd =
  328. nowTime.getFullYear() +
  329. "" +
  330. (nowTime.getMonth() + 1) +
  331. "" +
  332. nowTime.getDate() +
  333. "" +
  334. nowTime.getHours() +
  335. "" +
  336. nowTime.getMinutes();
  337. let fname = ymd + "考级报名列表";
  338. link.href = objectUrl;
  339. link.setAttribute("download", fname);
  340. document.body.appendChild(link);
  341. link.click();
  342. }
  343. });
  344. load.endLoading();
  345. })
  346. .catch((error) => {
  347. this.$message.error("导出数据失败,请联系管理员");
  348. load.endLoading();
  349. });
  350. })
  351. .catch(() => { });
  352. },
  353. },
  354. };
  355. </script>
  356. <style lang="scss" scoped>
  357. .el-button--primary {
  358. background: #14928a;
  359. border-color: #14928a;
  360. color: #fff;
  361. &:hover,
  362. &:active,
  363. &:focus {
  364. background: #14928a;
  365. border-color: #14928a;
  366. color: #fff;
  367. }
  368. }
  369. /deep/.el-image-viewer__close {
  370. color: #fff;
  371. opacity: 1;
  372. }
  373. /deep/.el-date-editor.el-input {
  374. width: 100% !important;
  375. }
  376. /deep/.el-select {
  377. width: 100% !important;
  378. }
  379. /deep/.el-table .cell {
  380. display: -webkit-box;
  381. overflow: hidden;
  382. text-overflow: ellipsis;
  383. -webkit-line-clamp: 3;
  384. -webkit-box-orient: vertical;
  385. }
  386. </style>