review-detail.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. <template>
  2. <div>
  3. <el-alert
  4. title="学员信息"
  5. :closable="false"
  6. class="alert"
  7. type="info"
  8. v-if="calender && calender.paymentType === 'ADD_STUDENT'"
  9. >
  10. </el-alert>
  11. <descriptions
  12. :column="2"
  13. v-if="calender && calender.paymentType === 'ADD_STUDENT'"
  14. >
  15. <descriptions-item label="学员姓名:">{{ username }}</descriptions-item>
  16. <descriptions-item label="手机号码:">{{ phone }}</descriptions-item>
  17. </descriptions>
  18. <el-alert title="申请信息" :closable="false" class="alert" type="info">
  19. </el-alert>
  20. <descriptions :column="2">
  21. <descriptions-item label="分部名称:">{{
  22. calender.organName
  23. }}</descriptions-item>
  24. <descriptions-item label="乐团名称:">
  25. <overflow-text
  26. :text="calender.musicGroupName"
  27. width="100%"
  28. ></overflow-text>
  29. </descriptions-item>
  30. <descriptions-item label="乐团编号:">
  31. <copy-text>{{ calender.musicGroupId }}</copy-text>
  32. </descriptions-item>
  33. <descriptions-item label="申请时间:">{{
  34. calender.createTime
  35. }}</descriptions-item>
  36. <descriptions-item label="申请类型:">{{
  37. calender.paymentType | userPaymentTypeFormat
  38. }}</descriptions-item>
  39. <descriptions-item label="订单类型:">{{
  40. calender.payUserType | payUserTypeFormat
  41. }}</descriptions-item>
  42. <descriptions-item
  43. label="学生人数:"
  44. v-if="
  45. calenderFeeJson &&
  46. calenderFeeJson.sutdentNumber &&
  47. calender.calenderFeeType == 'STUDENT'
  48. "
  49. >{{ calenderFeeJson.sutdentNumber }}</descriptions-item
  50. >
  51. <descriptions-item
  52. label="缴费总金额:"
  53. v-if="calenderFeeJson && calenderFeeJson.allTotal"
  54. >{{
  55. numeral(calenderFeeJson.allTotal).format("0,0")
  56. }}</descriptions-item
  57. >
  58. <descriptions-item
  59. label="优惠金额:"
  60. v-if="calenderFeeJson && calenderFeeJson.discountTotal"
  61. >{{
  62. numeral(calenderFeeJson.discountTotal).format("0,0")
  63. }}</descriptions-item
  64. >
  65. <descriptions-item label="实缴金额">{{
  66. numeral(calender.currentTotalAmount).format("0,0")
  67. }}</descriptions-item>
  68. <descriptions-item
  69. label="缴费单号:"
  70. v-if="calender.payUserType == 'SCHOOL'"
  71. >{{ calender.id }}</descriptions-item
  72. >
  73. <descriptions-item
  74. :span="3"
  75. v-if="calender.payUserType !== 'SCHOOL'"
  76. label="缴费日期:"
  77. >{{ calender.startPaymentDate | dayjsFormat }} -
  78. {{ calender.deadlinePaymentDate | dayjsFormat }}</descriptions-item
  79. >
  80. <descriptions-item
  81. :span="3"
  82. label="备注:"
  83. style="border-bottom: none !important"
  84. >
  85. <span style="display: inline-block; max-width: 100%">
  86. <overflow-text
  87. :text="calender ? calender.memo : null"
  88. ></overflow-text>
  89. </span>
  90. </descriptions-item>
  91. </descriptions>
  92. <el-alert
  93. title="乐团课"
  94. :closable="false"
  95. class="alert"
  96. type="info"
  97. v-if="course && course.length > 0"
  98. >
  99. </el-alert>
  100. <descriptions
  101. :column="3"
  102. v-if="course && course.length > 0 && course[0].name"
  103. >
  104. <descriptions-item :span="2" label="收费标准:" v-if="course[0].name">{{
  105. course[0].name
  106. }}</descriptions-item>
  107. </descriptions>
  108. <el-table
  109. :data="course"
  110. stripe
  111. v-if="course && course.length"
  112. style="width: 100%; margin-top: 10px"
  113. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  114. >
  115. <el-table-column prop="courseType" label="课程信息" width="120">
  116. <template slot-scope="scope">
  117. {{ scope.row.courseType | courseTypeFormat }}
  118. </template>
  119. </el-table-column>
  120. <el-table-column prop="isStudentOptional" label="是否必选" width="100px">
  121. <template slot-scope="scope">{{
  122. scope.row.isStudentOptional ? "是" : "否"
  123. }}</template>
  124. </el-table-column>
  125. <el-table-column
  126. prop="courseTotalMinuties"
  127. label="课程总时长(分钟)"
  128. width="150px"
  129. >
  130. </el-table-column>
  131. <el-table-column prop="courseCurrentPrice" label="售价(元)" width="100px">
  132. <template slot="header">
  133. <p style="position: relative">
  134. 售价(元)
  135. <el-tooltip placement="top" popper-class="mTooltip">
  136. <div slot="content">学生实际缴费金额</div>
  137. <i
  138. class="el-icon-question"
  139. style="font-size: 18px; color: #f56c6c"
  140. ></i>
  141. </el-tooltip>
  142. </p>
  143. </template>
  144. </el-table-column>
  145. <el-table-column
  146. prop="courseOriginalPrice"
  147. label="原价(元)"
  148. width="100px"
  149. ></el-table-column>
  150. <el-table-column> </el-table-column>
  151. </el-table>
  152. <el-table
  153. :data="musicMerger"
  154. stripe
  155. v-if="musicMerger.length"
  156. style="width: 100%; margin-top: 10px"
  157. >
  158. <el-table-column prop="username" label="学员姓名"> </el-table-column>
  159. <el-table-column prop="phone" label="手机号"> </el-table-column>
  160. <el-table-column prop="courseType" label="课程类型" width="120">
  161. <template slot-scope="scope">
  162. {{ scope.row.courseType | courseTypeFormat }}
  163. </template>
  164. </el-table-column>
  165. <el-table-column prop="isStudentOptional" label="是否必选" width="100px">
  166. <template slot-scope="scope">{{
  167. scope.row.isStudentOptional ? "是" : "否"
  168. }}</template>
  169. </el-table-column>
  170. <el-table-column prop="courseTime" label="课程总时长(分钟)">
  171. </el-table-column>
  172. <el-table-column prop="courseCurrentPrice" label="售价(元)">
  173. <template slot="header">
  174. <p style="position: relative">
  175. 售价(元)
  176. <el-tooltip placement="top" popper-class="mTooltip">
  177. <div slot="content">学生实际缴费金额</div>
  178. <i
  179. class="el-icon-question"
  180. style="font-size: 18px; color: #f56c6c"
  181. ></i>
  182. </el-tooltip>
  183. </p>
  184. </template>
  185. <template slot-scope="scope">
  186. <div>
  187. {{ scope.row.courseCurrentPrice | moneyFormat }}
  188. </div>
  189. </template>
  190. </el-table-column>
  191. <el-table-column prop="courseOriginalPrice" label="原价(元)">
  192. <template slot-scope="scope">
  193. <div>
  194. {{ scope.row.courseOriginalPrice | moneyFormat }}
  195. </div>
  196. </template>
  197. </el-table-column>
  198. </el-table>
  199. <el-alert
  200. title="学练宝"
  201. :closable="false"
  202. class="alert"
  203. type="info"
  204. v-if="member.length > 0"
  205. >
  206. </el-alert>
  207. <el-table
  208. :data="member"
  209. stripe
  210. v-if="member.length > 0"
  211. style="width: 100%; margin-top: 10px"
  212. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  213. >
  214. <el-table-column prop="name" label="学练宝版本" width="120">
  215. </el-table-column>
  216. <el-table-column prop="optionalFlag" label="是否必选" width="100px">
  217. <template slot-scope="scope">{{
  218. scope.row.optionalFlag ? "是" : "否"
  219. }}</template>
  220. </el-table-column>
  221. <el-table-column prop="autoActivationFlag" label="自动激活" width="100px">
  222. <template slot-scope="scope">{{
  223. scope.row.autoActivationFlag ? "是" : "否"
  224. }}</template>
  225. </el-table-column>
  226. <el-table-column prop="courseTotalMinuties" label="会员周期" width="150">
  227. <template slot-scope="scope">
  228. <div>
  229. {{ scope.row.period | memberEnumType }}
  230. </div>
  231. </template>
  232. </el-table-column>
  233. <el-table-column prop="num" label="数量" width="120"> </el-table-column>
  234. <el-table-column prop="actualAmount" label="团购价(元)" width="120">
  235. <template slot="header">
  236. <p style="position: relative">
  237. 售价(元)
  238. <el-tooltip placement="top" popper-class="mTooltip">
  239. <div slot="content">学生实际缴费金额</div>
  240. <i
  241. class="el-icon-question"
  242. style="font-size: 18px; color: #f56c6c"
  243. ></i>
  244. </el-tooltip>
  245. </p>
  246. </template>
  247. </el-table-column>
  248. <el-table-column prop="originalAmount" label="原价(元)"></el-table-column>
  249. <el-table-column> </el-table-column>
  250. </el-table>
  251. <el-alert
  252. title="乐保"
  253. :closable="false"
  254. class="alert"
  255. type="info"
  256. v-if="repair && repair.calenderId"
  257. >
  258. </el-alert>
  259. <el-table
  260. :data="[{ ...repair }]"
  261. stripe
  262. v-if="repair && repair.calenderId"
  263. style="width: 100%; margin-top: 10px"
  264. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  265. >
  266. <el-table-column prop="name" label="服务" width="120">
  267. <template slot-scope="scope">
  268. <div>乐器保养</div>
  269. </template>
  270. </el-table-column>
  271. <el-table-column label="年限" width="100px">
  272. <template slot-scope="scope">{{ scope.row.num }}</template>
  273. </el-table-column>
  274. <el-table-column prop="num" label="数量" width="100px"> </el-table-column>
  275. <el-table-column prop="actualAmount" label="售价(元)" width="100px">
  276. <template slot="header">
  277. <p style="position: relative">
  278. 售价(元)
  279. <el-tooltip placement="top" popper-class="mTooltip">
  280. <div slot="content">学生实际缴费金额</div>
  281. <i
  282. class="el-icon-question"
  283. style="font-size: 18px; color: #f56c6c"
  284. ></i>
  285. </el-tooltip>
  286. </p>
  287. </template>
  288. </el-table-column>
  289. <el-table-column prop="originalAmount" label="原价(元)"></el-table-column>
  290. </el-table>
  291. <el-alert
  292. title="乐团活动"
  293. :closable="false"
  294. class="alert"
  295. type="info"
  296. v-if="activity && activity.length > 0"
  297. >
  298. </el-alert>
  299. <el-table
  300. :data="activity"
  301. stripe
  302. v-if="activity && activity.length > 0"
  303. style="width: 100%; margin-top: 10px"
  304. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  305. >
  306. <el-table-column prop="activityName" label="活动方案" width="120">
  307. </el-table-column>
  308. <el-table-column prop="optionalFlag" label="是否必选" width="100px">
  309. <template slot-scope="scope">{{
  310. scope.row.optionalFlag ? "是" : "否"
  311. }}</template>
  312. </el-table-column>
  313. <el-table-column label="活动课程" prop="categoryName" width="100px">
  314. <template slot-scope="scope">{{ scope.row.categoryName }}</template>
  315. </el-table-column>
  316. <el-table-column prop="num" label="数量" width="100px"> </el-table-column>
  317. <el-table-column prop="actualAmount" label="售价(元)" width="100px">
  318. <template slot="header">
  319. <p style="position: relative">
  320. 售价(元)
  321. <el-tooltip placement="top" popper-class="mTooltip">
  322. <div slot="content">学生实际缴费金额</div>
  323. <i
  324. class="el-icon-question"
  325. style="font-size: 18px; color: #f56c6c"
  326. ></i>
  327. </el-tooltip>
  328. </p>
  329. </template>
  330. </el-table-column>
  331. <el-table-column prop="originalAmount" label="原价(元)"></el-table-column>
  332. </el-table>
  333. <el-alert
  334. title="老师及课程配置"
  335. :closable="false"
  336. class="alert"
  337. type="info"
  338. v-if="
  339. calenderFeeJson &&
  340. calenderFeeJson.teacherFeeList &&
  341. calender.calenderFeeType == 'TEACHER'
  342. "
  343. >
  344. </el-alert>
  345. <el-table
  346. :data="calenderFeeJson.teacherFeeList"
  347. stripe
  348. v-if="
  349. calenderFeeJson &&
  350. calenderFeeJson.teacherFeeList &&
  351. calender.calenderFeeType == 'TEACHER'
  352. "
  353. style="width: 100%; margin-top: 10px"
  354. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  355. >
  356. <el-table-column prop="courseType" label="课程类型">
  357. <template slot-scope="scope">
  358. {{ scope.row.courseType | courseTypeFormat }}
  359. </template>
  360. </el-table-column>
  361. <el-table-column prop="teacherNumber" label="老师人数"> </el-table-column>
  362. <el-table-column prop="courseNumber" label="课程数"> </el-table-column>
  363. <el-table-column prop="courseCurrentPrice" label="单课时售价(元)">
  364. </el-table-column>
  365. </el-table>
  366. <el-table
  367. :data="goods"
  368. stripe
  369. v-if="goods && goods.length > 0"
  370. style="width: 100%; margin-top: 10px"
  371. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  372. >
  373. <el-table-column prop="goodsName" label="商品名称">
  374. <template slot-scope="scope">
  375. {{ scope.row.goodsName }}
  376. </template>
  377. </el-table-column>
  378. <el-table-column prop="goodsSn" label="商品货号"> </el-table-column>
  379. <el-table-column prop="singlePrice" label="采购价格"> </el-table-column>
  380. <el-table-column prop="num" label="采购数量"> </el-table-column>
  381. <el-table-column prop="totalPrice" label="总价格"> </el-table-column>
  382. </el-table>
  383. <el-alert
  384. title="收货信息"
  385. :closable="false"
  386. class="alert"
  387. type="info"
  388. v-if="address && address.id"
  389. >
  390. </el-alert>
  391. <descriptions :column="2" v-if="address && address.id">
  392. <descriptions-item label="收货人:">{{ address.name }}</descriptions-item>
  393. <descriptions-item label="手机号:">{{
  394. address.phone
  395. }}</descriptions-item>
  396. <descriptions-item label="详细地址:" :span="2">
  397. {{ address.provinceName }} {{ address.cityName }}
  398. {{ address.regionName }}
  399. {{ address.address }}
  400. </descriptions-item>
  401. </descriptions>
  402. <el-alert
  403. title="缴费周期"
  404. :closable="false"
  405. class="alert"
  406. type="info"
  407. v-if="calenderRefundPeriods && calenderRefundPeriods.length > 0"
  408. >
  409. </el-alert>
  410. <el-table
  411. :data="calenderRefundPeriods"
  412. stripe
  413. v-if="calenderRefundPeriods && calenderRefundPeriods.length > 0"
  414. style="width: 100%; margin-top: 10px"
  415. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  416. >
  417. <el-table-column
  418. v-if="calender && calender.paymentType === 'GOODS_PURCHASE'"
  419. prop="responsiblePersonName"
  420. label="责任人"
  421. >
  422. <template slot-scope="scope">
  423. {{ scope.row.responsiblePersonName }}
  424. ({{ scope.row.responsiblePersonPhone }})
  425. </template>
  426. </el-table-column>
  427. <el-table-column prop="refundAmount" label="回款金额"> </el-table-column>
  428. <el-table-column prop="refundDate" label="回款状态">
  429. <template slot-scope="scope">
  430. <div
  431. v-if="
  432. calender.status == 'NO' ||
  433. calender.status == 'OPEN' ||
  434. calender.status == 'OVER' ||
  435. calender.status == 'PAID'
  436. "
  437. >
  438. {{ scope.row.refundFlag ? "已回款" : "回款中" }}
  439. </div>
  440. <div v-else>
  441. --
  442. </div>
  443. </template>
  444. </el-table-column>
  445. <el-table-column prop="refundDate" label="回款时间"> </el-table-column>
  446. </el-table>
  447. <!-- 会员信息 -->
  448. <!--
  449. <el-dialog
  450. :visible.sync="payVisible"
  451. :close-on-click-modal="false"
  452. append-to-body
  453. width="600px"
  454. title="查看学员"
  455. >
  456. <el-table :data="simpleUserDto">
  457. <el-table-column prop="userId" label="用户ID" width="180">
  458. </el-table-column>
  459. <el-table-column prop="userName" label="姓名" width="180">
  460. </el-table-column>
  461. <el-table-column prop="subjectNames" label="声部" width="180">
  462. </el-table-column>
  463. </el-table>
  464. <span slot="footer" class="dialog-footer">
  465. <el-button type="primary" @click="payVisible = false">关 闭</el-button>
  466. </span>
  467. </el-dialog> -->
  468. </div>
  469. </template>
  470. <script>
  471. import Vue from "vue";
  472. import numeral from "numeral";
  473. import { musicGroupPaymentCalenderView } from "../api";
  474. import descriptions from "@/components/Descriptions";
  475. import Item from "@/layout/components/Sidebar/Item.vue";
  476. Vue.use(descriptions);
  477. const initData = {
  478. calender: {},
  479. activity: [],
  480. musicGroupPaymentCalenderStudentDetails: [],
  481. course: [],
  482. member: [],
  483. goods: [],
  484. address: {},
  485. repair: {},
  486. musicMerger: [],
  487. studentNum: 0,
  488. phone: "",
  489. username: "",
  490. calenderRefundPeriods: []
  491. };
  492. export default {
  493. components: { Item },
  494. props: ["detail"],
  495. data() {
  496. return {
  497. payVisible: false,
  498. ...initData
  499. };
  500. },
  501. computed: {
  502. musicGroupPaymentCalenderCourseSettingName() {
  503. const active = this.musicGroupPaymentCalenderCourseSettings[0];
  504. if (active) {
  505. return active.name;
  506. }
  507. return "";
  508. },
  509. calenderFeeJson() {
  510. const calenderFee = this.calender?.calenderFeeJson;
  511. if (calenderFee) {
  512. return JSON.parse(calenderFee);
  513. }
  514. return null;
  515. }
  516. },
  517. mounted() {
  518. this.init();
  519. },
  520. methods: {
  521. numeral,
  522. async init() {
  523. try {
  524. const res = await musicGroupPaymentCalenderView({
  525. id: this.detail.id,
  526. musicGroupId: this.detail.musicGroupId
  527. });
  528. for (const key in initData) {
  529. if (initData.hasOwnProperty(key)) {
  530. this[key] = res.data[key];
  531. }
  532. }
  533. consoe.log(this);
  534. } catch (error) {}
  535. }
  536. }
  537. };
  538. </script>
  539. <style lang="less" scoped>
  540. .alert {
  541. margin: 10px 0;
  542. }
  543. .description-tr {
  544. &:nth-last-child(1) {
  545. border-bottom: none !important;
  546. }
  547. }
  548. // ::v-deep .description-view{
  549. // border: none;
  550. // .description-tr{
  551. // border-bottom: none;
  552. // }
  553. // .description-label{
  554. // border-right: none;
  555. // background-color: transparent;
  556. // }
  557. // .description-content{
  558. // border-right: none;
  559. // }
  560. // }
  561. </style>