studentOrder.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. <template>
  2. <div class="studentOrder">
  3. <statistic>
  4. <statistic-item>
  5. <span>账户余额</span>
  6. <span>
  7. {{ dataInfo.balance | moneyFormat }}
  8. <i
  9. class="el-icon-edit"
  10. v-permission="'userCashAccount/updateBalance'"
  11. @click="onMoneyOperation('recharge')"
  12. ></i>
  13. </span>
  14. </statistic-item>
  15. <statistic-item>
  16. <span>课程余额</span>
  17. <span>
  18. {{ dataInfo.courseBalance | moneyFormat }}
  19. <i
  20. class="el-icon-edit"
  21. v-permission="'userCashAccount/updateCourseBalance'"
  22. @click="onMoneyOperation('account')"
  23. ></i>
  24. </span>
  25. </statistic-item>
  26. <statistic-item>
  27. <span>银行卡</span>
  28. <span>{{ dataInfo.cardNo || "--" }}</span>
  29. </statistic-item>
  30. <statistic-item>
  31. <el-button
  32. @click="onCashAccount"
  33. v-permission="'studentDetail/userCashAccountDetail'"
  34. type="primary"
  35. >交易明细</el-button
  36. >
  37. </statistic-item>
  38. </statistic>
  39. <!-- 搜索类型 -->
  40. <save-form
  41. :inline="true"
  42. class="searchForm"
  43. :model="searchForm"
  44. save-key="studentDetail-studentOrder"
  45. @submit="search"
  46. @reset="onReSet"
  47. >
  48. <el-form-item>
  49. <el-date-picker
  50. style="width: 400px"
  51. v-model.trim="searchForm.orderDate"
  52. type="daterange"
  53. value-format="yyyy-MM-dd"
  54. range-separator="至"
  55. start-placeholder="订单开始日期"
  56. end-placeholder="订单结束日期"
  57. :picker-options="{
  58. firstDayOfWeek: 1,
  59. }"
  60. ></el-date-picker>
  61. </el-form-item>
  62. <el-form-item>
  63. <el-select
  64. v-model.trim="searchForm.paymentType"
  65. filterable
  66. clearable
  67. @clear="onClear('paymentType')"
  68. placeholder="交易类型"
  69. >
  70. <el-option
  71. v-for="(item, index) in orderStatus"
  72. :key="index"
  73. :label="item.label"
  74. :value="item.value"
  75. ></el-option>
  76. </el-select>
  77. </el-form-item>
  78. <el-form-item>
  79. <el-input
  80. type="text"
  81. @keyup.enter.native="search"
  82. v-model.trim="searchForm.remark"
  83. placeholder="订单说明"
  84. ></el-input>
  85. </el-form-item>
  86. <el-form-item>
  87. <el-button native-type="submit" type="danger">搜索</el-button>
  88. <el-button native-type="reset" type="primary">重置</el-button>
  89. </el-form-item>
  90. <el-form-item>
  91. <el-button
  92. type="primary"
  93. @click="userCoursesAccountExport"
  94. v-if="$helpers.permission('export/userCoursesAccount')"
  95. >课程余额明细导出</el-button
  96. >
  97. <el-button
  98. type="primary"
  99. @click="userCashAccountDetailExport"
  100. v-if="$helpers.permission('export/userCashAccountDetail')"
  101. >账户余额明细导出</el-button
  102. >
  103. </el-form-item>
  104. </save-form>
  105. <div class="tableWrap">
  106. <el-table
  107. :data="tableList"
  108. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  109. >
  110. <el-table-column
  111. label="订单日期"
  112. prop="createTime"
  113. align="center"
  114. width="150px"
  115. >
  116. <template slot-scope="scope">{{
  117. scope.row.createTime | dateForMinFormat
  118. }}</template>
  119. </el-table-column>
  120. <el-table-column label="交易类型" align="center" width="180px">
  121. <template slot-scope="scope">{{
  122. scope.row.type | orderType
  123. }}</template>
  124. </el-table-column>
  125. <el-table-column
  126. width="180px"
  127. align="center"
  128. label="应付金额"
  129. prop="expectAmount"
  130. >
  131. <template slot-scope="scope">
  132. <div>
  133. {{ scope.row.expectAmount | moneyFormat }}
  134. </div>
  135. </template>
  136. </el-table-column>
  137. <el-table-column
  138. width="180px"
  139. align="center"
  140. label="余额支付"
  141. prop="balancePaymentAmount"
  142. >
  143. <template slot-scope="scope">
  144. <div>
  145. {{ scope.row.balancePaymentAmount | moneyFormat }}
  146. </div>
  147. </template>
  148. </el-table-column>
  149. <el-table-column
  150. width="180px"
  151. align="center"
  152. label="实际金额"
  153. prop="actualAmount"
  154. >
  155. <template slot-scope="scope">
  156. <div>
  157. {{ scope.row.actualAmount | moneyFormat }}
  158. </div>
  159. </template>
  160. </el-table-column>
  161. <el-table-column
  162. width="180px"
  163. align="center"
  164. label="订单状态"
  165. prop="status"
  166. >
  167. <template slot-scope="scope">
  168. <div>{{ scope.row.status | payStatus }}</div>
  169. </template>
  170. </el-table-column>
  171. <el-table-column
  172. label="订单说明"
  173. align="center"
  174. prop="memo"
  175. width="220px"
  176. >
  177. <template slot-scope="scope">
  178. <overflow-text width="200px" :text="scope.row.memo" />
  179. </template>
  180. </el-table-column>
  181. <el-table-column> </el-table-column>
  182. </el-table>
  183. <pagination
  184. sync
  185. :total.sync="pageInfo.total"
  186. :page.sync="pageInfo.page"
  187. :limit.sync="pageInfo.limit"
  188. :page-sizes="pageInfo.page_size"
  189. @pagination="getList"
  190. />
  191. </div>
  192. <el-dialog title="交易明细" width="850px" :visible.sync="cashStatus">
  193. <el-row>
  194. <el-col :span="24">
  195. <el-tabs v-model="activeName" type="border-card">
  196. <el-tab-pane
  197. label="账户余额明细"
  198. v-if="permission('userCashAccountDetail/queryPage')"
  199. name="first"
  200. >
  201. <el-table :data="cashAccount.gridData">
  202. <!-- 交易金额,账户可用余额,交易状态,交易类型,操作时间,备注 -->
  203. <el-table-column
  204. align="center"
  205. property="amount"
  206. label="交易金额"
  207. ></el-table-column>
  208. <el-table-column
  209. align="center"
  210. property="balance"
  211. label="账户可用余额"
  212. ></el-table-column>
  213. <el-table-column align="center" label="交易状态">
  214. <template slot-scope="scope">{{
  215. scope.row.status | payStatus
  216. }}</template>
  217. </el-table-column>
  218. <el-table-column align="center" label="交易类型">
  219. <template slot-scope="scope">{{
  220. scope.row.type | payType
  221. }}</template>
  222. </el-table-column>
  223. <el-table-column
  224. align="center"
  225. width="160px"
  226. property="createTime"
  227. label="交易时间"
  228. ></el-table-column>
  229. <el-table-column align="center" width="140px" label="备注">
  230. <template slot-scope="scope">
  231. <span :title="scope.row.comment">{{
  232. scope.row.comment
  233. }}</span>
  234. </template>
  235. </el-table-column>
  236. </el-table>
  237. <pagination
  238. :total="cashAccount.total"
  239. :page.sync="cashAccount.page"
  240. :limit.sync="cashAccount.limit"
  241. :page-sizes="cashAccount.page_size"
  242. @pagination="getCashAccount"
  243. />
  244. </el-tab-pane>
  245. <el-tab-pane
  246. label="课程余额明细"
  247. v-if="permission('userCoursesAccount/queryPage')"
  248. name="second"
  249. >
  250. <el-table :data="courseAccount.gridData">
  251. <!-- 交易金额,账户可用余额,交易状态,交易类型,操作时间,备注 -->
  252. <el-table-column
  253. align="center"
  254. property="amount"
  255. label="交易金额"
  256. ></el-table-column>
  257. <el-table-column
  258. align="center"
  259. property="balance"
  260. label="课程可用余额"
  261. ></el-table-column>
  262. <el-table-column align="center" label="交易状态">
  263. <template slot-scope="scope">{{
  264. scope.row.status | payStatus
  265. }}</template>
  266. </el-table-column>
  267. <el-table-column align="center" label="交易类型">
  268. <template slot-scope="scope">{{
  269. scope.row.type | payType
  270. }}</template>
  271. </el-table-column>
  272. <el-table-column
  273. align="center"
  274. width="160px"
  275. property="createTime"
  276. label="交易时间"
  277. ></el-table-column>
  278. <el-table-column align="center" width="140px" label="备注">
  279. <template slot-scope="scope">
  280. <span :title="scope.row.comment">{{
  281. scope.row.comment
  282. }}</span>
  283. </template>
  284. </el-table-column>
  285. </el-table>
  286. <pagination
  287. :total="courseAccount.total"
  288. :page.sync="courseAccount.page"
  289. :limit.sync="courseAccount.limit"
  290. :page-sizes="courseAccount.page_size"
  291. @pagination="getCourseAccount"
  292. />
  293. </el-tab-pane>
  294. </el-tabs>
  295. </el-col>
  296. </el-row>
  297. </el-dialog>
  298. <el-dialog
  299. :title="moneyForm.title"
  300. width="450px"
  301. @close="onFormClose('moneyForm')"
  302. :visible.sync="moneyVisible"
  303. >
  304. <el-form
  305. ref="moneyForm"
  306. :rules="moneyRule"
  307. :model="moneyForm"
  308. label-width="80px"
  309. >
  310. <el-form-item label="操作选择" prop="type">
  311. <el-radio-group v-model="moneyForm.type">
  312. <el-radio :label="1">充值</el-radio>
  313. <el-radio :label="2">扣除</el-radio>
  314. </el-radio-group>
  315. </el-form-item>
  316. <el-form-item
  317. :label="moneyForm.titleType == 'account' ? '课程余额' : '账户余额'"
  318. >
  319. <el-input
  320. type="number"
  321. disabled
  322. :value="
  323. moneyForm.titleType == 'account'
  324. ? dataInfo.courseBalance
  325. : dataInfo.balance
  326. "
  327. ></el-input>
  328. </el-form-item>
  329. <el-form-item label="金额" prop="money">
  330. <el-input
  331. type="number"
  332. @mousewheel.native.prevent
  333. v-model="moneyForm.money"
  334. ></el-input>
  335. </el-form-item>
  336. <el-form-item label="备注" prop="remark">
  337. <el-input type="textarea" v-model="moneyForm.remark"></el-input>
  338. </el-form-item>
  339. </el-form>
  340. <div slot="footer" class="dialog-footer">
  341. <el-button @click="moneyVisible = false">取 消</el-button>
  342. <el-button type="primary" @click="submitMoney('moneyForm')"
  343. >确 定</el-button
  344. >
  345. </div>
  346. </el-dialog>
  347. </div>
  348. </template>
  349. <script>
  350. import pagination from "@/components/Pagination/index";
  351. import { Export } from "@/utils/downLoadFile";
  352. import qs from 'qs'
  353. import {
  354. studentPaymentOrderList,
  355. getUserCashAccountBaseInfo,
  356. updateCourseBalance,
  357. transferCourseBalanceToBalance,
  358. userCashAccountDetail,
  359. userCoursesAccount,
  360. updateBalance,
  361. } from "@/api/studentManager";
  362. import { permission } from "@/utils/directivePage";
  363. import { orderStatus } from "@/utils/searchArray";
  364. import { getTimes } from "@/utils";
  365. import store from "@/store";
  366. let validPrice = (rule, value, callback) => {
  367. if ((value == "" && typeof value == "string") || value == null) {
  368. callback(new Error("请输入金额"));
  369. } else if (value < 0) {
  370. callback(new Error("输入金额必须大于或等于0"));
  371. } else if (value >= 100000) {
  372. callback(new Error("输入金额必须小于100000"));
  373. } else {
  374. callback();
  375. }
  376. };
  377. export default {
  378. name: "studentOrder",
  379. components: { pagination },
  380. data() {
  381. return {
  382. rechargeVisible: false,
  383. organId: null,
  384. searchForm: {
  385. studentId: null,
  386. orderStartDate: null,
  387. orderEndDate: null,
  388. paymentType: null,
  389. remark: null,
  390. orderDate: [],
  391. },
  392. orderStatus: orderStatus,
  393. pageInfo: {
  394. // 分页规则
  395. limit: 10, // 限制显示条数
  396. page: 1, // 当前页
  397. total: 0, // 总条数
  398. page_size: [10, 20, 40, 50], // 选择限制显示条数
  399. },
  400. tableList: [],
  401. dataInfo: {},
  402. amountStatus: true, // 账户余额状态
  403. rechargeForm: {
  404. money: null,
  405. },
  406. moneyVisible: false, //
  407. moneyForm: {
  408. title: "账户余额修改",
  409. titleType: "recharge",
  410. type: 1, //
  411. money: null,
  412. remark: null, //备注
  413. },
  414. moneyRule: {
  415. type: [
  416. { required: true, message: "请选择操作类型", trigger: "change" },
  417. ],
  418. money: [{ required: true, validator: validPrice, trigger: "blur" }],
  419. remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
  420. },
  421. cashStatus: false,
  422. cashAccount: {
  423. // 点名表
  424. status: false,
  425. gridData: [],
  426. limit: 10, // 限制显示条数
  427. page: 1, // 当前页
  428. total: 0, // 总条数
  429. page_size: [10, 20, 40, 50], // 选择限制显示条数
  430. },
  431. activeName: "first",
  432. courseAccount: {
  433. // 点名表
  434. status: false,
  435. gridData: [],
  436. limit: 10, // 限制显示条数
  437. page: 1, // 当前页
  438. total: 0, // 总条数
  439. page_size: [10, 20, 40, 50], // 选择限制显示条数
  440. },
  441. };
  442. },
  443. mounted() {
  444. this.searchForm.studentId = this.$route.query.userId;
  445. this.getList();
  446. this.__init();
  447. },
  448. activated() {
  449. this.searchForm.studentId = this.$route.query.userId;
  450. this.getList();
  451. this.__init();
  452. },
  453. methods: {
  454. permission,
  455. onClear(type) {
  456. if (type == "paymentType") {
  457. this.searchForm.paymentType = null;
  458. }
  459. },
  460. __init() {
  461. getUserCashAccountBaseInfo({ userId: this.$route.query.userId }).then(
  462. (res) => {
  463. if (res.code == 200) {
  464. this.dataInfo = {
  465. balance: res.data.balance,
  466. courseBalance: res.data.courseBalance,
  467. wxBalance: 0,
  468. cardNo: res.data.cardNo,
  469. zfb: null,
  470. };
  471. }
  472. }
  473. );
  474. },
  475. onFormClose(formName) {
  476. // 关闭弹窗重置验证
  477. this.$refs[formName].resetFields();
  478. },
  479. onMoneyOperation(type) {
  480. let moneyForm = this.moneyForm;
  481. if (type == "recharge") {
  482. moneyForm.title = "账户余额修改";
  483. moneyForm.titleType = "recharge";
  484. } else if (type == "account") {
  485. moneyForm.title = "课程余额修改";
  486. moneyForm.titleType = "account";
  487. }
  488. this.moneyVisible = true;
  489. },
  490. onCashAccount(item) {
  491. // 点名表
  492. this.cashAccount.page = 1;
  493. this.getCashAccount();
  494. this.courseAccount.page = 1;
  495. this.getCourseAccount();
  496. this.cashStatus = true;
  497. },
  498. getCashAccount() {
  499. let cashAccount = this.cashAccount;
  500. let params = {
  501. page: cashAccount.page,
  502. rows: cashAccount.limit,
  503. userId: this.searchForm.studentId,
  504. };
  505. userCashAccountDetail(params).then((res) => {
  506. let result = res.data;
  507. cashAccount.status = true;
  508. if (res.code == 200) {
  509. cashAccount.gridData = result.rows;
  510. cashAccount.total = result.total;
  511. }
  512. });
  513. },
  514. getCourseAccount() {
  515. let courseAccount = this.courseAccount;
  516. let params = {
  517. page: courseAccount.page,
  518. rows: courseAccount.limit,
  519. userId: this.searchForm.studentId,
  520. };
  521. userCoursesAccount(params).then((res) => {
  522. let result = res.data;
  523. courseAccount.status = true;
  524. if (res.code == 200) {
  525. courseAccount.gridData = result.rows;
  526. courseAccount.total = result.total;
  527. }
  528. });
  529. },
  530. submitMoney(formName) {
  531. this.$refs[formName].validate((valid) => {
  532. if (valid) {
  533. let moneyForm = this.moneyForm;
  534. let dataInfo = this.dataInfo;
  535. let courseBalance = 0,
  536. balance = 0;
  537. if (moneyForm.titleType == "account") {
  538. // 课程余额
  539. if (moneyForm.type == 1) {
  540. courseBalance = Number(
  541. (
  542. Number(moneyForm.money) + Number(dataInfo.courseBalance)
  543. ).toFixed(2)
  544. );
  545. } else if (moneyForm.type == 2) {
  546. if (dataInfo.courseBalance - moneyForm.money < 0) {
  547. this.$message.error(
  548. "扣除金额不能大于" + dataInfo.courseBalance
  549. );
  550. return;
  551. } else {
  552. courseBalance = Number(
  553. Number(dataInfo.courseBalance) -
  554. Number(moneyForm.money).toFixed(2)
  555. );
  556. }
  557. }
  558. updateCourseBalance({
  559. userId: this.searchForm.studentId,
  560. decimal: courseBalance,
  561. memo: moneyForm.remark,
  562. }).then((res) => {
  563. let result = res.data;
  564. if (res.code == 200) {
  565. this.$message.success("保存成功");
  566. this.__init();
  567. this.moneyVisible = false;
  568. } else {
  569. this.$message.error(res.msg);
  570. }
  571. });
  572. } else if (moneyForm.titleType == "recharge") {
  573. // 账户余额
  574. if (moneyForm.type == 1) {
  575. balance = moneyForm.money;
  576. } else if (moneyForm.type == 2) {
  577. if (dataInfo.balance - moneyForm.money < 0) {
  578. this.$message.error("扣除金额不能大于" + dataInfo.balance);
  579. return;
  580. } else {
  581. balance = -moneyForm.money;
  582. }
  583. }
  584. // (balance)
  585. // return
  586. updateBalance({
  587. userId: this.searchForm.studentId,
  588. decimal: balance,
  589. memo: moneyForm.remark,
  590. }).then((res) => {
  591. let result = res.data;
  592. if (res.code == 200) {
  593. this.$message.success("保存成功");
  594. this.__init();
  595. this.moneyVisible = false;
  596. } else {
  597. this.$message.error(res.msg);
  598. }
  599. });
  600. }
  601. } else {
  602. return false;
  603. }
  604. });
  605. },
  606. onUpdateCourse() {
  607. if (!this.dataInfo.courseBalance) {
  608. this.$message.error("请输入课程余额");
  609. return;
  610. }
  611. this.$confirm(`确定是否修改该学生课程余额?`, "提示", {
  612. confirmButtonText: "确定",
  613. cancelButtonText: "取消",
  614. type: "warning",
  615. })
  616. .then(() => {
  617. updateCourseBalance({
  618. userId: this.searchForm.studentId,
  619. decimal: this.dataInfo.courseBalance,
  620. }).then((res) => {
  621. let result = res.data;
  622. if (res.code == 200) {
  623. this.$message.success("保存成功");
  624. this.amountStatus = true;
  625. this.__init();
  626. } else {
  627. this.$message.error(res.msg);
  628. }
  629. });
  630. })
  631. .catch(() => {
  632. this.amountStatus = true;
  633. });
  634. },
  635. search() {
  636. this.pageInfo.page = 1;
  637. this.getList();
  638. },
  639. getList() {
  640. // let params = this.searchForm;
  641. // params.rows = this.pageInfo.limit;
  642. // params.page = this.pageInfo.page;
  643. // if (params.remark == "" || !params.remark) {
  644. // params.remark = null;
  645. // }
  646. const { orderDate, ...rest } = this.searchForm;
  647. let params = {
  648. ...rest,
  649. ...getTimes(orderDate, ["orderStartDate", "orderEndDate"]),
  650. page: this.pageInfo.page,
  651. rows: this.pageInfo.limit,
  652. };
  653. studentPaymentOrderList(params).then((res) => {
  654. if (res.code == 200) {
  655. this.tableList = res.data.rows;
  656. this.pageInfo.total = res.data.total;
  657. }
  658. });
  659. },
  660. searchCourseDate(value) {
  661. if (value) {
  662. this.searchForm.orderStartDate = value[0];
  663. this.searchForm.orderEndDate = value[1];
  664. } else {
  665. this.searchForm.orderStartDate = null;
  666. this.searchForm.orderEndDate = null;
  667. }
  668. },
  669. onReSet() {
  670. // 重置搜索
  671. this.orderDate = null;
  672. this.searchForm = {
  673. studentId: this.$route.query.userId,
  674. orderStartDate: null,
  675. orderEndDate: null,
  676. paymentType: null,
  677. remark: null,
  678. };
  679. this.getList();
  680. },
  681. userCoursesAccountExport() {
  682. Export(this, {
  683. url: '/api-web/export/userCoursesAccount',
  684. fileName: '学员课程明细.xls',
  685. method: 'post',
  686. params:qs.stringify({ userId: this.$route.query.userId })
  687. }, '您确定导出学员课程明细?')
  688. },
  689. userCashAccountDetailExport() {
  690. Export(this, {
  691. url: '/api-web/export/userCashAccountDetail',
  692. fileName: '学员现金明细.xls',
  693. method: 'post',
  694. params:qs.stringify({ userId: this.$route.query.userId })
  695. }, '您确定导出学员现金明细?')
  696. },
  697. },
  698. };
  699. </script>
  700. <style lang="scss" scoped>
  701. .headWrap .left .headItem {
  702. position: relative;
  703. /deep/.el-button {
  704. position: absolute;
  705. top: -3px;
  706. right: 20px;
  707. }
  708. }
  709. .header-items {
  710. padding: 20px 0;
  711. text-align: center;
  712. /deep/ .el-icon-edit {
  713. cursor: pointer;
  714. color: #14928a;
  715. font-size: 20px;
  716. }
  717. /deep/ .el-col {
  718. display: flex;
  719. align-items: center;
  720. min-height: 60px;
  721. align-items: center;
  722. justify-content: center;
  723. align-items: center;
  724. flex-direction: column;
  725. }
  726. /deep/ .el-col-1 {
  727. font-size: 60px;
  728. }
  729. span {
  730. display: block;
  731. line-height: 1.8;
  732. color: rgba(0, 0, 0, 0.85);
  733. font-size: 24px;
  734. &:first-child {
  735. font-size: 14px;
  736. font-weight: normal;
  737. color: rgba(0, 0, 0, 0.45);
  738. }
  739. }
  740. }
  741. /deep/.el-table .cell {
  742. display: -webkit-box;
  743. overflow: hidden;
  744. text-overflow: ellipsis;
  745. -webkit-line-clamp: 3;
  746. -webkit-box-orient: vertical;
  747. }
  748. // .studentOrder {
  749. // }
  750. </style>