musicGroup.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <template>
  2. <div>
  3. <el-alert
  4. title="已拒绝"
  5. show-icon
  6. center
  7. v-if="musicForm.status == 'DENIED'"
  8. :closable="false"
  9. class="alert"
  10. type="error"
  11. ></el-alert>
  12. <el-alert
  13. title="已处理"
  14. show-icon
  15. center
  16. v-if="musicForm.status == 'APPROVED'"
  17. :closable="false"
  18. class="alert"
  19. type="success"
  20. ></el-alert>
  21. <el-alert
  22. title="已取消"
  23. show-icon
  24. center
  25. v-if="musicForm.status == 'CANCELED'"
  26. :closable="false"
  27. class="alert"
  28. type="info"
  29. ></el-alert>
  30. <!-- <el-form
  31. ref="musicForm"
  32. :model="quitForm"
  33. :rules="quitRules"
  34. status-icon
  35. class="musicForm"
  36. label-width="120px"
  37. > -->
  38. <!-- <el-form-item label="学员姓名">
  39. <el-input disabled v-model.trim="musicForm.user.username"></el-input>
  40. </el-form-item>
  41. <el-form-item label="乐团名称">
  42. <el-input disabled v-model.trim="musicForm.musicGroup.name"></el-input>
  43. </el-form-item>
  44. <el-form-item label="用户备注">
  45. <el-input
  46. type="textarea"
  47. disabled
  48. v-model.trim="musicForm.userComment"
  49. ></el-input>
  50. </el-form-item>
  51. <el-form-item
  52. label="退还学练宝费用"
  53. prop="isRefundMemberFee"
  54. v-if="musicForm.status == 'PROCESSING' && musicForm.courseViewType == 2"
  55. >
  56. <el-radio v-model.trim="quitForm.isRefundMemberFee" label="true"
  57. >是</el-radio
  58. >
  59. <el-radio v-model.trim="quitForm.isRefundMemberFee" label="false"
  60. >否</el-radio
  61. >
  62. </el-form-item> -->
  63. <!-- <el-form-item
  64. label="退还学练宝金额"
  65. prop="cloudTeacherAmount"
  66. v-if="
  67. quitForm.isRefundMemberFee &&
  68. quitForm.isRefundMemberFee != 'false' &&
  69. musicForm.status == 'PROCESSING'
  70. "
  71. >
  72. <el-input
  73. type="number"
  74. v-model.trim="quitForm.cloudTeacherAmount"
  75. style="width: 180px"
  76. >
  77. <template slot="append">元</template>
  78. </el-input>
  79. </el-form-item>
  80. <el-form-item
  81. label="退还课程费用"
  82. v-if="musicForm.status == 'PROCESSING'"
  83. prop="isRefundCourseFee"
  84. >
  85. <el-radio v-model.trim="quitForm.isRefundCourseFee" :label="true"
  86. >是</el-radio
  87. >
  88. <el-radio v-model.trim="quitForm.isRefundCourseFee" :label="false"
  89. >否</el-radio
  90. >
  91. </el-form-item>
  92. <el-form-item
  93. label="退还乐器费用"
  94. v-if="musicForm.status == 'PROCESSING'"
  95. prop="isRefundInstrumentFee"
  96. >
  97. <el-radio v-model.trim="quitForm.isRefundInstrumentFee" :label="true"
  98. >是</el-radio
  99. >
  100. <el-radio v-model.trim="quitForm.isRefundInstrumentFee" :label="false"
  101. >否</el-radio
  102. >
  103. </el-form-item>
  104. <el-form-item
  105. label="退还教辅费用"
  106. v-if="musicForm.status == 'PROCESSING'"
  107. prop="isRefundTeachingAssistantsFee"
  108. >
  109. <el-radio
  110. v-model.trim="quitForm.isRefundTeachingAssistantsFee"
  111. :label="true"
  112. >是</el-radio
  113. >
  114. <el-radio
  115. v-model.trim="quitForm.isRefundTeachingAssistantsFee"
  116. :label="false"
  117. >否</el-radio
  118. >
  119. </el-form-item>
  120. <el-form-item
  121. label="退还乐保费用"
  122. prop="isMaintenanceFee"
  123. v-if="dialogDetail.hasMaintenance"
  124. >
  125. <el-radio v-model.trim="quitForm.isMaintenanceFee" :label="true"
  126. >是</el-radio
  127. >
  128. <el-radio v-model.trim="quitForm.isMaintenanceFee" :label="false"
  129. >否</el-radio
  130. >
  131. </el-form-item>
  132. <el-form-item
  133. label="退还乐保金额"
  134. prop="maintenanceFee"
  135. v-if="quitForm.isMaintenanceFee"
  136. >
  137. <el-input
  138. type="number"
  139. v-model.trim="quitForm.maintenanceFee"
  140. style="width: 180px"
  141. >
  142. <template slot="append">元</template>
  143. </el-input>
  144. </el-form-item>
  145. <el-form-item label="退团原因" prop="reason">
  146. <el-input
  147. type="textarea"
  148. :disabled="musicForm.status != 'PROCESSING'"
  149. v-model.trim="quitForm.reason"
  150. ></el-input>
  151. </el-form-item> -->
  152. <!-- </el-form> -->
  153. <quiteTeam
  154. :quitForm="quitForm"
  155. ref="musicForm"
  156. :isDisabled="
  157. musicForm.status != 'PROCESSING' ||
  158. (isManage == 'manage' && musicForm.currentApproveRole == '2') ||
  159. (!isManage && musicForm.currentApproveRole == '1')
  160. "
  161. />
  162. <p style="color:red;paddingLeft:150px">退费金额暂不进入账户余额</p>
  163. <span
  164. slot="footer"
  165. class="dialog-footer question"
  166. v-if="musicForm.status == 'PROCESSING'"
  167. >
  168. <div>
  169. <el-popover placement="right" width="500" trigger="click">
  170. <div class="popoverWrap">
  171. <p>乐团退团退费规则:</p>
  172. <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
  173. <p>退还课程费用:缴费总额-已结束课时单价之和</p>
  174. <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
  175. <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
  176. <p v-if="$helpers.tenantId == 1">
  177. 退还乐保费用:报名缴费时缴费的乐保费用
  178. </p>
  179. </div>
  180. <el-button
  181. type="text"
  182. icon="el-icon-question"
  183. slot="reference"
  184. style="color: red"
  185. >退团退费说明</el-button
  186. >
  187. </el-popover>
  188. </div>
  189. <div>
  190. <el-button
  191. type="primary"
  192. v-permission="'musicGroupQuit/quitMusicGroup/conform'"
  193. v-if="isManage == 'staff'"
  194. :disabled="musicForm.currentApproveRole == '1'"
  195. @click="onSubmitGroup(musicForm, 'PROCESSING')"
  196. >提交审核</el-button
  197. >
  198. <el-button
  199. v-else
  200. type="primary"
  201. :disabled="
  202. isManage == 'manage' && musicForm.currentApproveRole == '2'
  203. "
  204. v-permission="'musicGroupQuit/quitMusicGroup/conform'"
  205. @click="onSubmitGroup(musicForm, 'APPROVED')"
  206. >同意</el-button
  207. >
  208. <el-button
  209. :disabled="
  210. (isManage == 'manage' && musicForm.currentApproveRole == '2') ||
  211. (isManage == 'staff' && musicForm.currentApproveRole == '1')
  212. "
  213. type="danger"
  214. v-permission="'musicGroupQuit/quitMusicGroup'"
  215. @click="onSubmitGroup(musicForm, 'DENIED')"
  216. >拒绝</el-button
  217. >
  218. </div>
  219. </span>
  220. <!-- <div
  221. slot="footer"
  222. class="dialog-footer"
  223. v-if="musicForm.status == 'PROCESSING'"
  224. >
  225. <el-button
  226. type="primary"
  227. v-permission="'musicGroupQuit/quitMusicGroup/conform'"
  228. @click="onSubmitGroup(musicForm, 'APPROVED')"
  229. >确认</el-button
  230. >
  231. <el-button
  232. type="danger"
  233. v-permission="'musicGroupQuit/quitMusicGroup'"
  234. @click="onSubmitGroup(musicForm, 'DENIED')"
  235. >拒绝</el-button
  236. >
  237. </div> -->
  238. </div>
  239. </template>
  240. <script>
  241. import {
  242. queryApplyRefundDetail,
  243. musicGroupQuit,
  244. quitMusicGroup
  245. } from "@/api/journal";
  246. import Tooltip from "@/components/Tooltip";
  247. import cleanDeep from "clean-deep";
  248. import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
  249. import dayjs from "dayjs";
  250. export default {
  251. props: ["dialogDetail"],
  252. components: { Tooltip, quiteTeam },
  253. data() {
  254. var validateReason = (rule, value, callback) => {
  255. if (value === "") {
  256. callback(new Error("请填写退团退费原因"));
  257. } else {
  258. callback();
  259. }
  260. };
  261. var validateFee1 = (rule, value, callback) => {
  262. if (value === "" || value == null) {
  263. callback(new Error("请选择退还课程费用"));
  264. } else {
  265. callback();
  266. }
  267. };
  268. var validateFee2 = (rule, value, callback) => {
  269. if (value === "" || value == null) {
  270. callback(new Error("请选择退还乐器费用"));
  271. } else {
  272. callback();
  273. }
  274. };
  275. var validateFee3 = (rule, value, callback) => {
  276. if (value === "" || value == null) {
  277. callback(new Error("请选择退还教辅费用"));
  278. } else {
  279. callback();
  280. }
  281. };
  282. return {
  283. musicForm: {
  284. user: {},
  285. musicGroup: {}
  286. },
  287. musicGroupCourse: [],
  288. vipCourse: [],
  289. quitForm: {
  290. // 退团信息确认
  291. isRefundCourseFee: null,
  292. isRefundInstrumentFee: null,
  293. isRefundTeachingAssistantsFee: null,
  294. reason: "",
  295. courseViewType: null,
  296. hasMaintenance: null,
  297. studentName: null,
  298. musicGroupName: null,
  299. isVisit: false,
  300. reason: "",
  301. userComment: null
  302. },
  303. quitRules: {
  304. isRefundCourseFee: [
  305. { required: true, message: "请选择是否退还课程费用" }
  306. ],
  307. isRefundInstrumentFee: [
  308. { required: true, message: "请选择是否退还乐器费用" }
  309. ],
  310. isRefundTeachingAssistantsFee: [
  311. { required: true, message: "请选择是否退还教辅费用" }
  312. ],
  313. isReturnMemberFee: [
  314. { required: true, message: "请选择是否退还会员费用" }
  315. ],
  316. isMaintenanceFee: [{ required: true, message: "选择是否退还乐保费用" }],
  317. maintenanceFee: [{ required: true, message: "请输入退还乐保金额" }],
  318. memberFee: [{ required: true, message: "请输入退还会员金额" }],
  319. reason: [{ validator: validateReason, trigger: "blur" }],
  320. userComment: [{ required: true, message: "请输入申请理由" }]
  321. },
  322. isManage: false
  323. };
  324. },
  325. mounted() {
  326. this.__init();
  327. },
  328. watch: {
  329. // "quitForm.isMaintenanceFee"(val) {
  330. // if (val) {
  331. // this.quitForm.maintenanceFee = 300;
  332. // } else {
  333. // this.quitForm.maintenanceFee = 0;
  334. // }
  335. // },
  336. },
  337. methods: {
  338. async __init() {
  339. // 获取权限
  340. let isSuperAdmin = this.$store.getters.isSuperAdmin;
  341. let roles = this.$store.getters.roles;
  342. if (isSuperAdmin) {
  343. this.isManage = "super";
  344. } else {
  345. if (roles.indexOf("1") != -1) {
  346. this.isManage = "manage";
  347. }
  348. if (roles.indexOf("2") != -1) {
  349. this.isManage = "staff";
  350. }
  351. }
  352. if (roles.indexOf("1") != -1 && roles.indexOf("2") != -1) {
  353. this.isManage = "super";
  354. }
  355. // isSuperAdmin:state=>state.user.isSuperAdmin,
  356. // roles:state=>state.user.roles,
  357. let { memo } = this.dialogDetail;
  358. memo = memo ? JSON.parse(memo) : null;
  359. if (!memo) {
  360. // 判断是否有参数
  361. this.$message.error("参数有误");
  362. return;
  363. }
  364. if (memo.type == "VIPGROUP") {
  365. // await queryApplyRefundDetail({ id: memo.Id }).then(res => {
  366. // if (res.code == 200) {
  367. // this.showRight = true
  368. // this.showMessage = res.data
  369. // this.showMessage.type = memo.type
  370. // this.remark = res.data.studentApplyRefunds.remark
  371. // this.actualAmount = res.data.studentApplyRefunds.actualAmount
  372. // //
  373. // } else {
  374. // this.$message.error(res.msg)
  375. // }
  376. // })
  377. } else if (memo.type == "MUSICGROUP") {
  378. await musicGroupQuit({ id: memo.Id }).then(res => {
  379. if (res.code == 200) {
  380. this.musicForm = res.data;
  381. if (this.$refs["musicForm"].$refs.quitForm) {
  382. this.$refs["musicForm"].$refs.quitForm.resetFields();
  383. }
  384. this.activeRow = { ...res.data.returnFeeDto };
  385. this.quitForm.courseViewType = res.data.musicGroup.courseViewType;
  386. this.quitForm.reason = res.data.reason;
  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 = { ...this.quitForm, ...res.data.returnFeeDto };
  394. } else {
  395. this.$message.error(res.msg);
  396. }
  397. });
  398. }
  399. },
  400. onSubmitGroup(params, status) {
  401. if (status == "DENIED") {
  402. this.$refs["musicForm"].$refs.quitForm.clearValidate();
  403. this.$refs["musicForm"].$refs.quitForm.validateField("reason", res => {
  404. if (!res) {
  405. this.onSubmitGroups(params, status);
  406. }
  407. });
  408. } else {
  409. // console.log(this.$refs.musicForm)
  410. this.$refs["musicForm"].$refs.quitForm.validate(res => {
  411. if (res) {
  412. this.onSubmitGroups(params, status);
  413. }
  414. });
  415. }
  416. },
  417. onSubmitGroups(params, status) {
  418. this.$confirm("确定此操作吗?", "提示", {
  419. confirmButtonText: "确定",
  420. cancelButtonText: "取消",
  421. type: "warning"
  422. })
  423. .then(async () => {
  424. let query = this.quitForm;
  425. (query.id = params.id), (query.status = status);
  426. query.returnFeeDto = {
  427. accessoriesFee: query.accessoriesFee,
  428. courseFee: query.courseFee,
  429. isReturnAccessoriesFee: query.isReturnAccessoriesFee,
  430. isReturnCourseFee: query.isReturnCourseFee,
  431. isReturnMaintenanceFee: query.isReturnMaintenanceFee,
  432. isReturnMemberFee: query.isReturnMemberFee,
  433. isReturnMusicalFee: query.isReturnMusicalFee,
  434. maintenanceFee: query.maintenanceFee,
  435. memberFee: query.memberFee,
  436. musicalFee: query.musicalFee
  437. };
  438. await quitMusicGroup(cleanDeep(query)).then(res => {
  439. this.$message.success("处理成功");
  440. this.$listeners.close();
  441. this.$listeners.getList();
  442. });
  443. })
  444. .catch(() => {});
  445. }
  446. }
  447. };
  448. </script>
  449. <style lang="less" scoped>
  450. .dialog-footer {
  451. margin-top: 20px;
  452. display: block;
  453. text-align: right;
  454. }
  455. .alert {
  456. margin-bottom: 10px;
  457. }
  458. .dialog-footer.question {
  459. display: flex;
  460. flex-direction: row;
  461. justify-content: space-between;
  462. }
  463. </style>