studentGroupPractice.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 待激活学练宝
  6. </h2>
  7. <div class="m-core">
  8. <el-form :inline="true" :model="searchForm">
  9. <el-form-item>
  10. <el-input
  11. v-model.trim="searchForm.queryCondition"
  12. @keyup.enter.native="queryCondition"
  13. clearable
  14. placeholder="学生姓名/编号/电话"
  15. ></el-input>
  16. </el-form-item>
  17. <el-form-item>
  18. <el-select
  19. v-model.trim="searchForm.status"
  20. clearable
  21. filterable
  22. placeholder="状态"
  23. >
  24. <el-option label="待激活" value="1"></el-option>
  25. <el-option label="已取消" value="4"></el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item prop="memberRankId">
  29. <el-cascader
  30. v-model.trim="searchForm.memberRankId"
  31. :options="memberRankList"
  32. :props="{ value: 'id', label: 'name', }"
  33. :show-all-levels="false"
  34. collapse-tags
  35. clearable
  36. placeholder="请选择学练宝版本"
  37. ></el-cascader>
  38. </el-form-item>
  39. <el-form-item>
  40. <el-date-picker
  41. v-model="searchForm.operationDate"
  42. style="width: 410px"
  43. type="daterange"
  44. value-format="yyyy-MM-dd"
  45. range-separator="至"
  46. :picker-options="{
  47. firstDayOfWeek: 1
  48. }"
  49. start-placeholder="操作开始日期"
  50. end-placeholder="操作结束日期"
  51. ></el-date-picker>
  52. </el-form-item>
  53. <el-form-item>
  54. <el-button @click="search" type="danger">搜索</el-button>
  55. <el-button @click="onReSet" type="primary">重置</el-button>
  56. </el-form-item>
  57. </el-form>
  58. <!-- <div class="newBand"
  59. @click="resetPays"
  60. v-permission="'musicGroupStudentFee/batchUpdateCourseFee'">修改缴费金额</div> -->
  61. <el-button
  62. @click="addMember"
  63. v-if="$helpers.permission('cloudTeacherOrder/pay/student')"
  64. type="primary"
  65. style="margin-bottom: 20px"
  66. >激活学练宝</el-button
  67. >
  68. <el-button
  69. type="primary"
  70. style="margin-bottom: 20px;margin-left: 12px;"
  71. v-permission="'cloudTeacherOrder/cancelInactive'"
  72. @click="resetPay"
  73. >取消资格</el-button
  74. >
  75. <el-button
  76. type="primary"
  77. style="margin-bottom: 20px;margin-left: 12px;"
  78. @click="exportList"
  79. v-permission="'export/now'"
  80. >导出</el-button
  81. >
  82. <div class="tableWrap">
  83. <el-table
  84. style="width: 100%"
  85. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  86. :data="tableList"
  87. ref="multipleTable"
  88. @selection-change="handleSelectionChange"
  89. >
  90. <el-table-column
  91. type="selection"
  92. :selectable="isDisabled"
  93. width="55"
  94. ></el-table-column>
  95. <el-table-column
  96. align="center"
  97. prop="studentId"
  98. label="学员编号"
  99. ></el-table-column>
  100. <el-table-column align="center" prop="name" label="学员姓名">
  101. </el-table-column>
  102. <el-table-column align="center" prop="phone" label="手机号">
  103. </el-table-column>
  104. <el-table-column
  105. align="center"
  106. prop="subjectName"
  107. label="学员声部"
  108. ></el-table-column>
  109. <el-table-column align="center" prop="memberName" label="学练宝版本">
  110. </el-table-column>
  111. <el-table-column align="center" prop="name" label="周期">
  112. <template slot-scope="scope">
  113. {{ scope.row.type | memberEnumType }}
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. align="center"
  118. prop="time"
  119. label="数量"
  120. ></el-table-column>
  121. <el-table-column align="center" label="缴费金额(元)">
  122. <template slot-scope="scope">
  123. {{ scope.row.amount | hasMoneyFormat }}
  124. </template>
  125. </el-table-column>
  126. <el-table-column align="center" label="状态">
  127. <template slot-scope="scope">
  128. {{ scope.row.status | statusEnum }}
  129. </template>
  130. </el-table-column>
  131. <el-table-column align="center" label="取消原因">
  132. <template slot-scope="scope">
  133. <!-- {{ scope.row.cancelReason }} -->
  134. <tooltip :content="scope.row.cancelReason" />
  135. </template>
  136. </el-table-column>
  137. <el-table-column align="center" label="操作人">
  138. <template slot-scope="scope">
  139. {{ scope.row.operatorName }}
  140. </template>
  141. </el-table-column>
  142. <el-table-column align="center" label="操作时间">
  143. <template slot-scope="scope">
  144. {{ scope.row.operateTime }}
  145. </template>
  146. </el-table-column>
  147. <!-- <el-table-column align="center" label="操作">
  148. <template slot-scope="scope">
  149. <div>
  150. <el-button
  151. type="text"
  152. v-if="scope.row.status == 1"
  153. v-permission="'cloudTeacherOrder/cancelInactive'"
  154. @click="resetPay(scope.row)"
  155. >取消资格</el-button
  156. >
  157. </div>
  158. </template>
  159. </el-table-column> -->
  160. </el-table>
  161. <pagination
  162. sync
  163. :total.sync="rules.total"
  164. :page.sync="rules.page"
  165. :limit.sync="rules.limit"
  166. :page-sizes="rules.page_size"
  167. @pagination="getList"
  168. />
  169. </div>
  170. </div>
  171. <el-dialog
  172. title="激活学练宝"
  173. :visible.sync="giveMemberVisible"
  174. width="1000px"
  175. v-if="giveMemberVisible"
  176. append-to-body
  177. >
  178. <giveMemberModel
  179. :tableList="selectStudentList"
  180. @getList="getList"
  181. @close="giveMemberVisible = false"
  182. />
  183. </el-dialog>
  184. <el-dialog
  185. title="取消资格"
  186. :visible.sync="cancelCloudStatus"
  187. width="600px"
  188. v-if="cancelCloudStatus"
  189. append-to-body
  190. >
  191. <el-form ref="cancelCloudForm" :model="reson" label-width="100px">
  192. <el-form-item
  193. prop="cancelReason"
  194. label="取消原因"
  195. :rules="[
  196. { required: true, message: '请输入取消原因', trigger: 'blur' }
  197. ]"
  198. >
  199. <el-form-item>
  200. <el-input
  201. type="textarea"
  202. v-model="reson.cancelReason"
  203. placeholder="请输入取消原因"
  204. :rows="3"
  205. maxlength="200"
  206. show-word-limit
  207. ></el-input>
  208. </el-form-item>
  209. </el-form-item>
  210. </el-form>
  211. <div slot="footer" class="dialog-footer">
  212. <el-button @click="cancelCloudStatus = false">取 消</el-button>
  213. <el-button type="primary" @click="submitDateReset">确 定</el-button>
  214. </div>
  215. </el-dialog>
  216. </div>
  217. </template>
  218. <script>
  219. import pagination from "@/components/Pagination/index";
  220. import { queryInactive, cancelInactive } from "@/views/resetTeaming/api";
  221. import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
  222. import giveMemberModel from "@/views/resetTeaming/modals/giveMemberModel";
  223. import Tooltip from "@/components/Tooltip";
  224. import { getTimeFormat } from "@/utils";
  225. import { Export } from "@/utils/downLoadFile";
  226. export default {
  227. components: { pagination, giveMemberModel, Tooltip },
  228. data() {
  229. let musicGroupId = this.$route.query.id;
  230. return {
  231. musicGroupId,
  232. giveMemberVisible: false,
  233. searchForm: {
  234. memberRankId: [],
  235. queryCondition: "",
  236. subjectId: "",
  237. operationDate: [],
  238. status: ""
  239. },
  240. soundList: [],
  241. tableList: [],
  242. memberRankList: [],
  243. rules: {
  244. // 分页规则
  245. limit: 10, // 限制显示条数
  246. page: 1, // 当前页
  247. total: 0, // 总条数
  248. page_size: [10, 20, 40, 50] // 选择限制显示条数
  249. },
  250. cancelCloudStatus: false,
  251. reson: {
  252. cancelReason: "",
  253. ids: ""
  254. },
  255. selectStudentList: [] // 选中的学生列表
  256. };
  257. },
  258. mounted() {
  259. this.getMemberList()
  260. this.getList();
  261. },
  262. methods: {
  263. async getMemberList() {
  264. try {
  265. const { data } = await getmemberRankList()
  266. this.memberRankList = data || [];
  267. } catch (e) {
  268. console.log(e);
  269. }
  270. },
  271. async getList() {
  272. try {
  273. let { operationDate, memberRankId, ...rest } = this.searchForm;
  274. let rankId = null
  275. if(memberRankId && memberRankId.length > 0) {
  276. rankId = memberRankId[memberRankId.length - 1]
  277. }
  278. let params = {
  279. ...rest,
  280. memberRankId: rankId,
  281. ...getTimeFormat(
  282. operationDate,
  283. ["operateStartTime", "operateEndTime"],
  284. "YYYY-MM-DD"
  285. ),
  286. page: this.rules.page,
  287. rows: this.rules.limit
  288. };
  289. const res = await queryInactive(params);
  290. this.rules.total = res.data.total;
  291. this.tableList = res.data.rows;
  292. } catch (e) {
  293. console.log(e, "e");
  294. }
  295. queryInactive;
  296. },
  297. // 是否允许批量调整
  298. isDisabled(row, index) {
  299. // || !row.isCallNames
  300. if (row.status !== 1) {
  301. return false;
  302. } else {
  303. return true;
  304. }
  305. },
  306. handleSelectionChange(val) {
  307. this.selectStudentList = val || [];
  308. },
  309. search() {
  310. this.rules.page = 1;
  311. this.getList();
  312. },
  313. onReSet() {
  314. this.searchForm = { search: "", subjectId: "" };
  315. this.search();
  316. },
  317. addMember() {
  318. if (this.selectStudentList.length <= 0) {
  319. this.$message.error("至少选择一名学生");
  320. return;
  321. }
  322. this.giveMemberVisible = true;
  323. },
  324. resetPay() {
  325. if (this.selectStudentList.length <= 0) {
  326. this.$message.error("至少选择一名学生");
  327. return;
  328. }
  329. this.cancelCloudStatus = true;
  330. const ids = [];
  331. this.selectStudentList.forEach(item => {
  332. ids.push(item.cloudTeacherOrderId);
  333. });
  334. this.reson.ids = ids.join(",");
  335. },
  336. exportList() {
  337. let { operationDate, memberRankId, ...rest } = this.searchForm;
  338. let rankId = null
  339. if(memberRankId && memberRankId.length > 0) {
  340. rankId = memberRankId[memberRankId.length - 1]
  341. }
  342. let params = {
  343. ...rest,
  344. memberRankId: rankId,
  345. ...getTimeFormat(
  346. operationDate,
  347. ["operateStartTime", "operateEndTime"],
  348. "YYYY-MM-DD"
  349. )
  350. };
  351. Export(
  352. this,
  353. {
  354. url: "/api-web/export/now",
  355. fileName: "待激活学练宝.xls",
  356. method: "post",
  357. params: {
  358. exportEnum: "EXPORT_CLOUD_TEACHER_ORDER_INACTIVE",
  359. queryInfo: params
  360. }
  361. },
  362. "您确定导出待激活学练宝?"
  363. );
  364. },
  365. async submitDateReset() {
  366. this.$refs["cancelCloudForm"].validate(async flag => {
  367. if (flag) {
  368. try {
  369. await cancelInactive(this.reson);
  370. this.$message.success("取消资格成功");
  371. this.cancelCloudStatus = false;
  372. this.reson.cancelReason = "";
  373. this.getList();
  374. } catch (e) {
  375. //
  376. console.log(e, "e");
  377. }
  378. }
  379. });
  380. }
  381. },
  382. filters: {
  383. statusEnum(val) {
  384. let template = {
  385. 1: "待激活",
  386. 2: "已生效",
  387. 3: "已退 ",
  388. 4: "已取消"
  389. };
  390. return template[val];
  391. }
  392. }
  393. };
  394. </script>