organDate.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. <template>
  2. <div>
  3. <el-card>
  4. <headers title="分部数据" @changeOrgan="changeOrgan" :special="true" />
  5. <div class="btnList">
  6. <el-button
  7. type="primary"
  8. v-permission="'export/organStudentOverView'"
  9. @click="organDateExport"
  10. size="mini"
  11. >导出</el-button
  12. >
  13. <el-button
  14. type="text"
  15. v-permission="'/organRankDetail'"
  16. @click="gotoAll"
  17. class="lookOrgan"
  18. >全部分部 ></el-button
  19. >
  20. </div>
  21. <div class="tableWrap">
  22. <el-table
  23. style="width: 100%"
  24. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  25. :data="tableList"
  26. @sort-change="sortChang"
  27. :default-sort="{
  28. prop: 'cloudStudyUseStudentDuty',
  29. order: 'descending',
  30. }"
  31. sortable="custom"
  32. >
  33. <el-table-column
  34. align="center"
  35. prop="index"
  36. label="排名"
  37. ></el-table-column>
  38. <el-table-column
  39. align="center"
  40. prop="organName"
  41. label="分部"
  42. ></el-table-column>
  43. <el-table-column
  44. align="center"
  45. prop="totalStudentNum"
  46. label="学员总数"
  47. >
  48. <template slot="header" slot-scope="slot">
  49. <div class="titleCell">
  50. <span>学员总数</span>
  51. <el-tooltip placement="top" popper-class="mTooltip">
  52. <div slot="content">
  53. 乐团在读学员+有剩余VIP课或网管课学员去重之和
  54. </div>
  55. <i
  56. class="el-icon-question micon el-tooltip"
  57. style="
  58. font-size: 18px;
  59. color: #f56c6c;
  60. top: 2px;
  61. position: relative;
  62. "
  63. ></i>
  64. </el-tooltip>
  65. </div>
  66. </template>
  67. </el-table-column>
  68. <el-table-column
  69. align="center"
  70. prop="cloudStudyLivelyStudentNum"
  71. label="活跃人数"
  72. >
  73. <template slot="header" slot-scope="slot">
  74. <div class="titleCell">
  75. <span>活跃人数</span>
  76. <el-tooltip placement="top" popper-class="mTooltip">
  77. <div slot="content">近15天内使用达到5天及以上的用户数</div>
  78. <i
  79. class="el-icon-question micon el-tooltip"
  80. style="
  81. font-size: 18px;
  82. color: #f56c6c;
  83. top: 2px;
  84. position: relative;
  85. "
  86. ></i>
  87. </el-tooltip>
  88. </div>
  89. </template>
  90. </el-table-column>
  91. <el-table-column
  92. align="center"
  93. prop="cloudStudyUseStudentNum"
  94. label="使用人数"
  95. >
  96. <template slot="header" slot-scope="slot">
  97. <div class="titleCell">
  98. <span>使用人数</span>
  99. <el-tooltip placement="top" popper-class="mTooltip">
  100. <div slot="content">截止目前使用云教练的总人数</div>
  101. <i
  102. class="el-icon-question micon el-tooltip"
  103. style="
  104. font-size: 18px;
  105. color: #f56c6c;
  106. top: 2px;
  107. position: relative;
  108. "
  109. ></i>
  110. </el-tooltip>
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column
  115. align="center"
  116. prop="newStudentNum"
  117. label="新用户人数"
  118. >
  119. <template slot="header">
  120. <div class="titleCell">
  121. <span>新用户人数</span>
  122. <el-tooltip placement="top" popper-class="mTooltip">
  123. <div slot="content">
  124. 乐团在读学员已上课程≤4节
  125. </div>
  126. <i
  127. class="el-icon-question micon el-tooltip"
  128. style="
  129. font-size: 18px;
  130. color: #f56c6c;
  131. top: 2px;
  132. position: relative;
  133. "
  134. ></i>
  135. </el-tooltip>
  136. </div>
  137. </template>
  138. </el-table-column>
  139. <el-table-column
  140. sortable="custom"
  141. align="center"
  142. prop="newStudentDuty"
  143. label="新用户占比"
  144. >
  145. <template slot-scope="scope">
  146. {{ scope.row.newStudentDuty }}%
  147. </template>
  148. </el-table-column>
  149. <el-table-column
  150. align="center"
  151. prop="newCloudStudyStudentNum"
  152. label="新增使用人数"
  153. width="130px"
  154. >
  155. <template slot="header" slot-scope="slot">
  156. <div class="titleCell">
  157. <span>新增使用人数</span>
  158. <el-tooltip placement="top" popper-class="mTooltip">
  159. <div slot="content">当日第一次使用云教练的人数</div>
  160. <i
  161. class="el-icon-question micon el-tooltip"
  162. style="
  163. font-size: 18px;
  164. color: #f56c6c;
  165. top: 2px;
  166. position: relative;
  167. "
  168. ></i>
  169. </el-tooltip>
  170. </div>
  171. </template>
  172. </el-table-column>
  173. <el-table-column
  174. align="center"
  175. prop="cloudStudyUseStudentDuty"
  176. label="使用比例"
  177. sortable="custom"
  178. width="140px"
  179. >
  180. <template slot="header" slot-scope="slot">
  181. <div class="titleCell">
  182. <span>使用比例</span>
  183. <el-tooltip placement="top" popper-class="mTooltip">
  184. <div slot="content">使用人数 / 学员总数</div>
  185. <i
  186. class="el-icon-question micon el-tooltip"
  187. style="
  188. font-size: 18px;
  189. color: #f56c6c;
  190. top: 2px;
  191. position: relative;
  192. "
  193. ></i>
  194. </el-tooltip>
  195. </div>
  196. </template>
  197. <template slot-scope="scope">
  198. <div>{{ scope.row.cloudStudyUseStudentDuty }}%</div>
  199. </template>
  200. </el-table-column>
  201. <el-table-column
  202. align="center"
  203. prop="vipStudentNum"
  204. label="付费会员数"
  205. >
  206. <template slot="header" slot-scope="slot">
  207. <div class="titleCell">
  208. <span>付费会员数</span>
  209. <el-tooltip placement="top" popper-class="mTooltip">
  210. <div slot="content">该分部生效中、待生效付费会员总数</div>
  211. <i
  212. class="el-icon-question micon el-tooltip"
  213. style="
  214. font-size: 18px;
  215. color: #f56c6c;
  216. top: 2px;
  217. position: relative;
  218. "
  219. ></i>
  220. </el-tooltip>
  221. </div>
  222. </template>
  223. </el-table-column>
  224. <el-table-column
  225. sortable="custom"
  226. align="center"
  227. prop="vipStudentDuty"
  228. label="付费会员占比"
  229. width="150px"
  230. >
  231. <template slot="header" slot-scope="slot">
  232. <div class="titleCell">
  233. <span>付费会员占比</span>
  234. <el-tooltip placement="top" popper-class="mTooltip">
  235. <div slot="content">付费会员数 / 学员总数</div>
  236. <i
  237. class="el-icon-question micon el-tooltip"
  238. style="
  239. font-size: 18px;
  240. color: #f56c6c;
  241. top: 2px;
  242. position: relative;
  243. "
  244. ></i>
  245. </el-tooltip>
  246. </div>
  247. </template>
  248. <template slot-scope="scope">
  249. <div>{{ scope.row.vipStudentDuty }}%</div>
  250. </template>
  251. </el-table-column>
  252. <!-- <el-table-column
  253. sortable="custom"
  254. align="center"
  255. prop="eVipStudentNum"
  256. label="试用会员"
  257. >
  258. <template slot="header" slot-scope="slot">
  259. <div class="titleCell">
  260. <span>试用会员</span>
  261. <el-tooltip placement="top" popper-class="mTooltip">
  262. <div slot="content">
  263. 有生效中或待生效的付费会员,不统计在内
  264. </div>
  265. <i
  266. class="el-icon-question micon el-tooltip"
  267. style="
  268. font-size: 18px;
  269. color: #f56c6c;
  270. top: 2px;
  271. position: relative;
  272. "
  273. ></i>
  274. </el-tooltip>
  275. </div>
  276. </template>
  277. </el-table-column> -->
  278. <el-table-column align="center" prop="studentId" label="操作">
  279. <template slot-scope="scope">
  280. <div>
  281. <auth auths="/organDateDetail">
  282. <el-button type="text" @click="gotoDetail(scope.row)"
  283. >详情</el-button
  284. >
  285. </auth>
  286. </div>
  287. </template>
  288. </el-table-column>
  289. </el-table>
  290. <!-- <pagination
  291. :autoScroll="false"
  292. :total.sync="rules.total"
  293. :page.sync="rules.page"
  294. :limit.sync="rules.limit"
  295. :page-sizes="rules.page_size"
  296. @pagination="getList"
  297. /> -->
  298. </div>
  299. </el-card>
  300. </div>
  301. </template>
  302. <script>
  303. import headers from "./modals/headers.vue";
  304. import pagination from "@/components/Pagination/index";
  305. import { organStudentOverView } from "../api";
  306. import { Export } from "@/utils/downLoadFile";
  307. import qs from "qs";
  308. export default {
  309. components: {
  310. headers,
  311. pagination,
  312. },
  313. data() {
  314. return {
  315. tableList: [],
  316. organId: "",
  317. rules: {
  318. // 分页规则
  319. limit: 10, // 限制显示条数
  320. page: 1, // 当前页
  321. total: 0, // 总条数
  322. page_size: [10, 20, 40, 50], // 选择限制显示条数
  323. },
  324. searchList: {
  325. cloudStudyUseStudentDuty: "DESC",
  326. },
  327. };
  328. },
  329. mounted() {
  330. this.getList();
  331. },
  332. methods: {
  333. async getList() {
  334. try {
  335. // const arr = [36,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56]
  336. const res = await organStudentOverView({
  337. page: 1,
  338. rows: 10,
  339. ...this.searchList,
  340. organIds: this.organId,
  341. });
  342. this.tableList = res.data.rows;
  343. this.rules.total = res.data.total;
  344. // console.log(this.tableList)
  345. } catch (e) {
  346. console.log(e);
  347. }
  348. },
  349. sortChang(val) {
  350. const dates = {
  351. ascending: "ASC",
  352. descending: "DESC",
  353. };
  354. this.searchList = {};
  355. if (val.prop && val.order) {
  356. this.searchList[val.prop] = dates[val.order];
  357. }
  358. this.rules.page = 1;
  359. this.getList();
  360. },
  361. gotoDetail(row) {
  362. // 跳转到分部数据详情 row.organId
  363. this.$router.push({
  364. name: "organDateDetail",
  365. params: { organId: row.organId },
  366. });
  367. },
  368. changeOrgan(val) {
  369. this.organId = val;
  370. this.rules.page = 1;
  371. this.getList();
  372. },
  373. organDateExport() {
  374. let params = { ...this.searchList, organIds: this.organId };
  375. Export(
  376. this,
  377. {
  378. url: "/api-web/export/organStudentOverView",
  379. fileName: "分部云教练数据.xls",
  380. method: "post",
  381. params: qs.stringify(params),
  382. },
  383. "您确定导出分部云教练数据列表?"
  384. );
  385. },
  386. gotoAll(){
  387. this.$router.push({
  388. name: "organRankDetail",
  389. });
  390. }
  391. },
  392. };
  393. </script>
  394. <style lang="scss" scoped>
  395. /deep/.el-card__body {
  396. padding-top: 0 !important;
  397. }
  398. .titleCell {
  399. display: inline-block;
  400. }
  401. .tableWrap {
  402. margin-top: 20px;
  403. }
  404. .btnList {
  405. display: flex;
  406. flex-direction: row;
  407. justify-content: space-between;
  408. }
  409. </style>