index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 退团申请
  6. <filter-search
  7. @reload="reloadSearch"
  8. :keys="['visitFlag']"
  9. :moreKeys="['organId']"
  10. />
  11. </h2>
  12. <div class="m-core">
  13. <save-form
  14. :inline="true"
  15. @submit="submit"
  16. @reset="onReSet"
  17. ref="searchForm"
  18. :model.sync="searchForm"
  19. >
  20. <el-form-item>
  21. <el-input
  22. v-model.trim="searchForm.search"
  23. clearable
  24. placeholder="学员(乐团)编号"
  25. ></el-input>
  26. </el-form-item>
  27. <el-form-item prop="organId">
  28. <el-select
  29. class="multiple"
  30. style="width: 180px !important"
  31. v-model.trim="searchForm.organId"
  32. filterable
  33. clearable
  34. placeholder="请选择分部"
  35. >
  36. <el-option
  37. v-for="(item, index) in selects.branchs"
  38. :key="index"
  39. :label="item.name"
  40. :value="item.id"
  41. ></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item>
  45. <el-select
  46. v-model="searchForm.status"
  47. clearable
  48. placeholder="请选择状态"
  49. >
  50. <el-option
  51. v-for="(item, key) in withdrawalStatus"
  52. :key="key"
  53. :label="item"
  54. :value="key"
  55. ></el-option>
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item>
  59. <el-select
  60. v-model="searchForm.currentApproveRole"
  61. clearable
  62. placeholder="请选择角色"
  63. >
  64. <el-option label="分部经理" value="3"></el-option>
  65. <el-option label="乐团主管" value="4"></el-option>
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item>
  69. <el-button native-type="submit" type="danger">搜索</el-button>
  70. <el-button native-type="reset" type="primary">重置</el-button>
  71. <el-button
  72. @click="onExport"
  73. type="primary"
  74. v-permission="'export/musicGroupQuit'"
  75. >导出</el-button
  76. >
  77. </el-form-item>
  78. </save-form>
  79. <el-table
  80. :data="list"
  81. style="width: 100%"
  82. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  83. >
  84. <el-table-column prop="userId" label="学员编号">
  85. <copy-text slot-scope="scope">{{ scope.row.userId }}</copy-text>
  86. </el-table-column>
  87. <el-table-column prop="userId" label="学员姓名">
  88. <copy-text slot-scope="scope">{{
  89. scope.row.user.username
  90. }}</copy-text>
  91. </el-table-column>
  92. <el-table-column prop="organName" label="所属分部">
  93. <div slot-scope="scope">{{
  94. scope.row.musicGroup.organName
  95. }}</div>
  96. </el-table-column>
  97. <el-table-column prop="musicGroupId" label="所属乐团">
  98. <copy-text slot-scope="scope">{{
  99. scope.row.musicGroup.name
  100. }}</copy-text>
  101. </el-table-column>
  102. <el-table-column prop="createTime" label="申请时间">
  103. <template slot-scope="scope">
  104. <div>
  105. {{ scope.row.createTime | dateForMinFormat }}
  106. </div>
  107. </template>
  108. </el-table-column>
  109. <el-table-column prop="applyUserName" label="申请人"></el-table-column>
  110. <el-table-column prop="createTime" label="退费金额">
  111. <template slot-scope="scope">
  112. <div>
  113. <p v-if="!scope.row.returnTotalFee">--</p>
  114. <p v-else>
  115. {{ scope.row.returnTotalFee | moneyFormat }}
  116. </p>
  117. </div>
  118. </template>
  119. </el-table-column>
  120. <el-table-column prop="userComment" label="退团原因">
  121. <overflow-text
  122. width="100%"
  123. slot-scope="scope"
  124. :text="scope.row.userComment"
  125. ></overflow-text>
  126. </el-table-column>
  127. <el-table-column label="状态">
  128. <template slot-scope="scope">
  129. <div>
  130. {{ scope.row.status | withdrawalStatus }}
  131. <span v-if="scope.row.status == 'PROCESSING'"
  132. >({{
  133. scope.row.currentApproveRole == 3 ? "分部经理" : "乐团主管"
  134. }})</span
  135. >
  136. </div>
  137. </template>
  138. </el-table-column>
  139. <el-table-column
  140. align="center"
  141. fixed="right"
  142. width="200px;"
  143. label="操作"
  144. v-if="
  145. permission('musicGroupQuit/quitMusicGroup/quit') ||
  146. permission('musicGroupQuit/quitMusicGroup/quit-only') ||
  147. permission('visit/add/tuituanliebiao')
  148. "
  149. >
  150. <template slot-scope="scope">
  151. <div>
  152. <el-button
  153. type="text"
  154. v-if="permission('musicGroupQuit/quitMusicGroup/quit')"
  155. :disabled="
  156. scope.row.status != 'PROCESSING' ||
  157. scope.row.status == 'DENIED' ||
  158. scope.row.status == 'CANCELED' ||
  159. (scope.row.status == 'PROCESSING' &&
  160. isManage == 'manage' &&
  161. scope.row.currentApproveRole == '4') ||
  162. (scope.row.status == 'PROCESSING' &&
  163. !isManage &&
  164. scope.row.currentApproveRole == '3')
  165. "
  166. @click="quieTeamMask(scope.row)"
  167. >立即处理</el-button
  168. >
  169. <el-button
  170. type="text"
  171. v-if="permission('musicGroupQuit/quitMusicGroup/quit')"
  172. :disabled="
  173. !(
  174. scope.row.status != 'PROCESSING' ||
  175. scope.row.status == 'DENIED' ||
  176. scope.row.status == 'CANCELED' ||
  177. (scope.row.status == 'PROCESSING' &&
  178. isManage == 'manage' &&
  179. scope.row.currentApproveRole == '4') ||
  180. (scope.row.status == 'PROCESSING' &&
  181. !isManage &&
  182. scope.row.currentApproveRole == '3')
  183. )
  184. "
  185. @click="quieTeamMask(scope.row, 'look')"
  186. >查看</el-button
  187. >
  188. <!-- <el-button
  189. type="text"
  190. v-if="permission('musicGroupQuit/quitMusicGroup/quit-only')"
  191. :disabled="scope.row.status != 'PROCESSING'"
  192. @click="quieTeam(scope.row)"
  193. >退团</el-button> -->
  194. <el-button
  195. type="text"
  196. v-if="permission('visit/add/tuituanliebiao')"
  197. @click="addVisit(scope.row)"
  198. >新增回访</el-button
  199. >
  200. </div>
  201. </template>
  202. </el-table-column>
  203. </el-table>
  204. <pagination
  205. sync
  206. :total.sync="rules.total"
  207. :page.sync="rules.page"
  208. :limit.sync="rules.limit"
  209. :page-sizes="rules.page_size"
  210. @pagination="FetchList"
  211. />
  212. </div>
  213. <el-dialog
  214. :title="isDisabled ? '查看' : '立即处理'"
  215. width="700px"
  216. :visible.sync="quitVisible"
  217. >
  218. <quitModal
  219. v-if="quitVisible"
  220. :quitForm="quitForm"
  221. @close="quitVisible = false"
  222. @submited="FetchList"
  223. :isDisabled="isDisabled"
  224. ref="musicForm"
  225. />
  226. <p style="color:red;paddingLeft:150px">退费金额暂不进入账户余额</p>
  227. <span slot="footer" class="dialog-footer question">
  228. <div>
  229. <el-popover placement="right" width="500" trigger="click">
  230. <div class="popoverWrap">
  231. <p>乐团退团退费规则:</p>
  232. <p>退还乐器练习云教练费用:报名缴费时缴费的乐器练习云教练费用</p>
  233. <p>退还课程费用:缴费总额-已结束课时单价之和</p>
  234. <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
  235. <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
  236. <p>退还乐保费用:报名缴费时缴费的乐保费用</p>
  237. </div>
  238. <el-button
  239. type="text"
  240. icon="el-icon-question"
  241. slot="reference"
  242. style="color: red"
  243. >退团退费说明</el-button
  244. >
  245. </el-popover>
  246. </div>
  247. <div v-if="!isDisabled">
  248. <el-button
  249. type="primary"
  250. v-permission="'musicGroupQuit/quitMusicGroup'"
  251. v-if="!isManage"
  252. @click="submitInfo('PROCESSING')"
  253. >提交审核</el-button
  254. >
  255. <el-button
  256. v-else
  257. type="primary"
  258. v-permission="'musicGroupQuit/quitMusicGroup'"
  259. @click="submitInfo('APPROVED')"
  260. >同意</el-button
  261. >
  262. <el-button
  263. type="danger"
  264. v-permission="'musicGroupQuit/quitMusicGroup'"
  265. @click="submitInfo('DENIED')"
  266. >拒绝</el-button
  267. >
  268. </div>
  269. </span>
  270. </el-dialog>
  271. <!-- <el-dialog title="退团" width="500px" :visible.sync="quitOnlyVisible">
  272. <quitOnlyModal
  273. v-if="quitOnlyVisible && detail"
  274. :detail="detail"
  275. @close="quitOnlyVisible = false"
  276. @submited="FetchList"
  277. />
  278. </el-dialog> -->
  279. <el-dialog title="新增回访" width="500px" :visible.sync="visitVisible">
  280. <visit
  281. v-if="visitVisible && detail"
  282. :detail="detail"
  283. @close="visitVisible = false"
  284. @submited="FetchList"
  285. />
  286. </el-dialog>
  287. </div>
  288. </template>
  289. <script>
  290. import pagination from "@/components/Pagination/index";
  291. import { permission } from "@/utils/directivePage";
  292. import quitModal from "@/views/teamDetail/components/modals/quite-team";
  293. import quitOnlyModal from "./modals/quitOnly";
  294. import visit from "./modals/visit";
  295. import { Export } from "@/utils/downLoadFile";
  296. import { quitMusicGroup } from "@/api/journal";
  297. import qs from "qs";
  298. import { musicGroupQuitQeryPage } from "./api";
  299. import cleanDeep from "clean-deep";
  300. import { musicGroupQuit } from "@/api/journal";
  301. import { withdrawalStatus } from "@/constant";
  302. const initSearch = {
  303. search: "",
  304. status: null,
  305. organId:''
  306. };
  307. export default {
  308. components: { pagination, quitModal, quitOnlyModal, visit },
  309. data() {
  310. return {
  311. withdrawalStatus,
  312. quitVisible: false,
  313. quitOnlyVisible: false,
  314. visitVisible: false,
  315. detail: null,
  316. list: [],
  317. searchForm: {
  318. ...initSearch,
  319. },
  320. rules: {
  321. // 分页规则
  322. limit: 10, // 限制显示条数
  323. page: 1, // 当前页
  324. total: 0, // 总条数
  325. page_size: [10, 20, 40, 50], // 选择限制显示条数
  326. },
  327. quitForm: {
  328. // 退团信息确认
  329. isRefundCourseFee: null,
  330. isRefundInstrumentFee: null,
  331. isRefundTeachingAssistantsFee: null,
  332. reason: "",
  333. courseViewType: null,
  334. hasMaintenance: null,
  335. studentName: null,
  336. musicGroupName: null,
  337. isVisit: false,
  338. userComment: null,
  339. },
  340. isManage: false,
  341. isDisabled: false,
  342. };
  343. },
  344. async mounted() {
  345. let isSuperAdmin = this.$store.getters.isSuperAdmin;
  346. let roles = this.$store.getters.roles;
  347. await this.$store.dispatch("setBranchs");
  348. if (isSuperAdmin) {
  349. this.isManage = "super";
  350. } else {
  351. if (roles.indexOf(3) != -1) {
  352. this.isManage = "manage";
  353. } else {
  354. this.isManage = false;
  355. }
  356. }
  357. if(roles.indexOf(3) != -1&&roles.indexOf(4) != -1){
  358. this.isManage = "super";
  359. }
  360. this.FetchList();
  361. },
  362. methods: {
  363. permission,
  364. reloadSearch() {
  365. this.rules.page = 1;
  366. this.FetchList();
  367. },
  368. submit() {
  369. this.rules.page = 1;
  370. this.FetchList();
  371. },
  372. onReSet() {
  373. this.searchForm = { ...initSearch };
  374. this.submit();
  375. },
  376. async quieTeamMask(row, look) {
  377. await musicGroupQuit({ id: row.id }).then((res) => {
  378. if (res.code == 200) {
  379. if (look == "look") {
  380. this.isDisabled = true;
  381. } else {
  382. this.isDisabled = false;
  383. }
  384. this.musicForm = res.data;
  385. this.activeRow = { ...row, ...res.data.returnFeeDto };
  386. this.quitForm.courseViewType = res.data.musicGroup.courseViewType;
  387. this.quitForm.userComment = res.data.userComment;
  388. this.quitForm.isVisit = res.data.isVisit;
  389. this.quitForm.visitTime = res.data.visitTime;
  390. this.quitForm.studentName = res.data.user?.username;
  391. this.quitForm.musicGroupName = res.data.musicGroup?.name;
  392. this.quitForm.hasMaintenance = res.data.hasMaintenance;
  393. this.quitForm.reason = res.data.reason;
  394. this.quitForm.id = res.data.id;
  395. this.quitForm = { ...this.quitForm, ...res.data.returnFeeDto };
  396. this.quitVisible = true;
  397. } else {
  398. this.$message.error(res.msg);
  399. }
  400. });
  401. // this.detail = row;
  402. },
  403. quieTeam(row) {
  404. this.quitOnlyVisible = true;
  405. this.detail = row;
  406. },
  407. addVisit(row) {
  408. this.visitVisible = true;
  409. this.detail = row;
  410. },
  411. async FetchList() {
  412. try {
  413. const res = await musicGroupQuitQeryPage({
  414. page: this.rules.page,
  415. rows: this.rules.limit,
  416. visitFlag: this.$route.query.visitFlag,
  417. ...this.searchForm,
  418. });
  419. this.rules.total = res.data.total;
  420. this.list = res.data.rows;
  421. } catch (error) {}
  422. },
  423. onExport() {
  424. const { ...rest } = this.searchForm;
  425. Export(
  426. this,
  427. {
  428. url: "/api-web/export/musicGroupQuit",
  429. fileName: "退团申请.xls",
  430. method: "post",
  431. params: qs.stringify({
  432. visitFlag: this.$route.query.visitFlag,
  433. ...rest,
  434. }),
  435. },
  436. "您确定导出退团申请列表?"
  437. );
  438. },
  439. submitInfo(status) {
  440. this.$confirm("确定此操作吗?", "提示", {
  441. confirmButtonText: "确定",
  442. cancelButtonText: "取消",
  443. type: "warning",
  444. })
  445. .then(async () => {
  446. let query = this.quitForm;
  447. query.status = status;
  448. query.returnFeeDto = {
  449. accessoriesFee: query.accessoriesFee,
  450. courseFee: query.courseFee,
  451. isReturnAccessoriesFee: query.isReturnAccessoriesFee,
  452. isReturnCourseFee: query.isReturnCourseFee,
  453. isReturnMaintenanceFee: query.isReturnMaintenanceFee,
  454. isReturnMemberFee: query.isReturnMemberFee,
  455. isReturnMusicalFee: query.isReturnMusicalFee,
  456. maintenanceFee: query.maintenanceFee,
  457. memberFee: query.memberFee,
  458. musicalFee: query.musicalFee,
  459. };
  460. await quitMusicGroup(cleanDeep(query)).then((res) => {
  461. this.$message.success("处理成功");
  462. this.activeRow = null;
  463. if (this.$refs["musicForm"].$refs.quitForm) {
  464. this.$refs["musicForm"].$refs.quitForm.resetFields();
  465. }
  466. this.quitVisible = false;
  467. this.FetchList();
  468. });
  469. })
  470. .catch((e) => {
  471. console.log(e);
  472. });
  473. // 乐团主管这里
  474. },
  475. },
  476. };
  477. </script>
  478. <style lang="scss" scoped>
  479. .dialog-footer.question {
  480. display: flex;
  481. flex-direction: row;
  482. justify-content: space-between;
  483. }
  484. </style>