change-voice.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <template>
  2. <div>
  3. <el-form :model="form" :rules="rules" ref="form" label-width="110px">
  4. <el-form-item label="原乐器" prop="name">
  5. <span>{{ originalMusicalGoods || "无" }}</span>
  6. </el-form-item>
  7. <el-form-item label="原教辅" prop="name">
  8. <span>{{ originalAccessoriesGoods || "无" }}</span>
  9. </el-form-item>
  10. <el-form-item
  11. label="更改声部"
  12. prop="subjectId"
  13. :rules="[
  14. { required: true, message: '请选择更改声部', trigger: 'change' },
  15. ]"
  16. >
  17. <el-select
  18. style="width: 100% !important"
  19. v-model="form.subjectId"
  20. clearable
  21. v-if="!changeInfo"
  22. @change="subjectChange"
  23. placeholder="请选择声部"
  24. >
  25. <el-option
  26. v-for="item in filterVoiceList"
  27. :key="item.subjectId"
  28. :label="item.subjectName"
  29. :value="item.subjectId"
  30. >
  31. </el-option>
  32. </el-select>
  33. <span v-else>{{ changeSubjectName }}</span>
  34. </el-form-item>
  35. <el-form-item
  36. label="更改乐器"
  37. prop="musicalGoods"
  38. :rules="[
  39. { required: true, message: '请选择更改乐器', trigger: 'change' },
  40. ]"
  41. >
  42. <el-select
  43. style="width: 100% !important"
  44. v-model="form.musicalGoods"
  45. clearable
  46. v-if="!changeInfo"
  47. @change="musicalGoodsChange"
  48. placeholder="请选择乐器"
  49. >
  50. <el-option label="自备乐器" value="OWNED"> </el-option>
  51. <el-option
  52. v-for="item in musicalGoods"
  53. :key="item.goodsIdList"
  54. :label="item.name"
  55. :value="item.goodsIdList"
  56. >
  57. </el-option>
  58. </el-select>
  59. <span v-else-if="changeInfo && changeInfo.changeMusicalGoods">{{
  60. changeInfo.changeMusicalGoods.name
  61. }}</span>
  62. </el-form-item>
  63. <el-form-item
  64. v-if="
  65. changeInfo ||
  66. (form.musicalGoods &&
  67. musicalGoodsById[form.musicalGoods] &&
  68. musicalGoodsById[form.musicalGoods].kitGroupPurchaseTypeJsonParse)
  69. "
  70. label="乐器提供方式"
  71. prop="type"
  72. :rules="[
  73. { required: true, message: '请选择乐器提供方式', trigger: 'change' },
  74. ]"
  75. >
  76. <el-radio-group v-if="!changeInfo" v-model="form.type">
  77. <el-radio
  78. :label="key"
  79. v-for="(item, key) in musicalGoodsById[form.musicalGoods]
  80. .kitGroupPurchaseTypeJsonParse"
  81. :key="key"
  82. >{{
  83. `${kitGroupPurchaseTypeFormater[key]} ${
  84. (musicalGoodsById[form.musicalGoods][typeAndprice[key]] || 0) >
  85. 0
  86. ? musicalGoodsById[form.musicalGoods][typeAndprice[key]] +
  87. "元"
  88. : "免费"
  89. }`
  90. }}
  91. </el-radio>
  92. </el-radio-group>
  93. <span v-else-if="changeInfo && changeInfo.kitGroupPurchaseType">{{
  94. kitGroupPurchaseTypeFormater[changeInfo.kitGroupPurchaseType]
  95. }}</span>
  96. </el-form-item>
  97. <el-form-item
  98. label="分部分润金额"
  99. prop="musicalGoods"
  100. v-if="
  101. form.musicalGoods &&
  102. musicalGoodsById[form.musicalGoods] &&
  103. form.type == 'GROUP'
  104. "
  105. >
  106. <el-input v-model="changeCourseFee" disabled>
  107. <template slot="append">元</template>
  108. </el-input>
  109. </el-form-item>
  110. <template>
  111. <!-- v-show="
  112. (courseViewType == 2 && form.musicalGoods == 'OWNED') ||
  113. courseViewType != 2
  114. " -->
  115. <el-form-item
  116. v-if="
  117. (activeAccessories.length || groupList.length || changeInfo) &&
  118. form.musicalGoods
  119. "
  120. label="更换教辅"
  121. >
  122. <accessories
  123. ref="accessories"
  124. :list.sync="activeAccessories"
  125. :groupList.sync="groupList"
  126. @change="accessoriesChange"
  127. v-if="!changeInfo"
  128. />
  129. <span v-else-if="changeInfo">{{ changeAccessoriesGoods }}</span>
  130. <!-- <el-select style="width: 100%" v-model="form.accessories" clearable placeholder="请选择教辅">
  131. <el-option
  132. v-for="item in accessories"
  133. :key="item.id"
  134. :label="item.name"
  135. :value="item.id">
  136. </el-option>
  137. </el-select> -->
  138. </el-form-item>
  139. </template>
  140. <el-form-item label="查看链接" prop="name" v-if="changeInfo">
  141. <div class="viewlink">
  142. <el-tooltip
  143. class="item"
  144. effect="dark"
  145. :content="copyLink"
  146. placement="top"
  147. >
  148. <span class="link">{{ copyLink }}</span>
  149. </el-tooltip>
  150. <el-popover placement="top" width="220" trigger="click">
  151. <div class="left-code">
  152. <div id="qrcode" class="qrcode code" ref="qrCodeUrl"></div>
  153. <p class="code-url" v-if="copyLink">
  154. {{ copyLink }}
  155. <el-link
  156. @click="copyUrl(copyLink)"
  157. class="linkbtn"
  158. type="primary"
  159. >复制</el-link
  160. >
  161. </p>
  162. </div>
  163. <el-button
  164. type="primary"
  165. class="btn"
  166. slot="reference"
  167. @click="onCreateQRCode"
  168. >二维码</el-button
  169. >
  170. </el-popover>
  171. </div>
  172. </el-form-item>
  173. <el-form-item label="支付差价" prop="name">
  174. <span style="color: red" v-if="!changeInfo"
  175. >{{ spread | moneyFormat }}元</span
  176. >
  177. <span style="color: red" v-else>{{ editSpread | moneyFormat }}元</span>
  178. </el-form-item>
  179. </el-form>
  180. <div slot="footer" class="dialog-footer" style="text-align: right">
  181. <el-button @click="$listeners.close">取 消</el-button>
  182. <el-button
  183. @click="cancel"
  184. type="danger"
  185. v-permission="'subjectChange/cancel'"
  186. v-if="changeInfo && changeInfo.status !== 1"
  187. >取消订单</el-button
  188. >
  189. <el-button
  190. type="primary"
  191. v-if="!changeInfo"
  192. v-permission="'subjectChange/add'"
  193. @click="submit"
  194. >确 定</el-button
  195. >
  196. </div>
  197. </div>
  198. </template>
  199. <script>
  200. import QRCode from "qrcodejs2";
  201. import copy from "copy-to-clipboard";
  202. import numeral from "numeral";
  203. import {
  204. getStudentOriginal,
  205. getSubjectGoodsAndInfo,
  206. subjectChangeAdd,
  207. subjectChangeCancel,
  208. getChangeInfo,
  209. } from "@/api/buildTeam";
  210. import { vaildStudentUrl } from "@/utils/validate";
  211. import accessories from "./accessories";
  212. import { kitGroupPurchaseType } from "@/constant";
  213. const formatAllGoods = (data, kitGroupPurchaseType) => {
  214. const accessories = [];
  215. const accessoriesById = {};
  216. const musicalGoods = [];
  217. const musicalGoodsById = {};
  218. const groupList = [];
  219. const groupListById = {};
  220. const accessoriesByGoods = {};
  221. if (data) {
  222. const { musicGroupSubjectGoodsGroupList } = data;
  223. // 乐器还是辅件
  224. /**
  225. * {
  226. * ACCESSORIES:[],
  227. * INSTRUMENT:[]
  228. * }
  229. */
  230. const types = {};
  231. for (const item of musicGroupSubjectGoodsGroupList) {
  232. if (!types[item.type]) {
  233. types[item.type] = [];
  234. }
  235. types[item.type].push(item);
  236. }
  237. const typesKeys = Object.keys(types);
  238. for (const key of typesKeys) {
  239. for (const item of types[key]) {
  240. if (key === "INSTRUMENT") {
  241. let json = {};
  242. let courseJson = {};
  243. try {
  244. json = JSON.parse(item.kitGroupPurchaseTypeJson);
  245. } catch (error) {}
  246. try {
  247. courseJson = JSON.parse(item.coursePurchaseTypeJson);
  248. } catch (error) {}
  249. // if (json[kitGroupPurchaseType] !== undefined) {
  250. const _item = {
  251. ...item,
  252. kitGroupPurchaseTypeJsonParse: json,
  253. kitGroupPurchaseTypePrice: json[kitGroupPurchaseType] || 0,
  254. coursePurchaseTypeJsonTypePrice:
  255. courseJson[kitGroupPurchaseType] || 0,
  256. _calculated_price:
  257. kitGroupPurchaseType === "FREE"
  258. ? 0
  259. : kitGroupPurchaseType === "LEASE"
  260. ? item.depositFee
  261. : item.price,
  262. };
  263. musicalGoods.push(_item);
  264. musicalGoodsById[item.goodsIdList] = _item;
  265. if (!types.ACCESSORIES) {
  266. if (!accessoriesByGoods[item.goodsIdList]) {
  267. accessoriesByGoods[item.goodsIdList] = [];
  268. }
  269. const acs = item.goodsList[0].goodsList
  270. ? item.goodsList[0].goodsList
  271. : [];
  272. for (const goods of acs) {
  273. accessoriesByGoods[item.goodsIdList].push(goods);
  274. accessoriesById[goods.id] = goods;
  275. }
  276. }
  277. // }
  278. } else if (item.type === "ACCESSORIES") {
  279. groupList.push(item);
  280. groupListById[item.id] = item;
  281. }
  282. }
  283. }
  284. }
  285. return {
  286. accessories,
  287. accessoriesById,
  288. musicalGoods,
  289. musicalGoodsById,
  290. groupList,
  291. groupListById,
  292. accessoriesByGoods,
  293. };
  294. };
  295. const typeAndprice = {
  296. GROUP: "price",
  297. LEASE: "depositFee",
  298. };
  299. export default {
  300. props: ["detail", "musicGroupId", "voiceList", "courseViewType"],
  301. components: {
  302. accessories,
  303. },
  304. data() {
  305. return {
  306. typeAndprice,
  307. kitGroupPurchaseTypeFormater: kitGroupPurchaseType,
  308. changeInfo: null,
  309. oldAllMoney: 0,
  310. accessories: [],
  311. accessoriesByid: {},
  312. musicalGoods: [],
  313. musicalGoodsById: {},
  314. groupList: [],
  315. groupListById: {},
  316. accessoriesByGoods: {},
  317. selectAccessories: [],
  318. selectAccessoriesMoney: 0,
  319. kitGroupPurchaseTypePrice: 0,
  320. coursePurchaseTypeJsonTypePrice: 0,
  321. form: {
  322. subjectId: "",
  323. accessories: "",
  324. musicalGoods: "",
  325. type: "",
  326. },
  327. rules: {},
  328. item: {},
  329. originalMusicalGoods: "",
  330. originalAccessoriesGoods: "",
  331. originalAccessoriesPrice: 0,
  332. originalMusicalPrice: 0,
  333. originalCourseFee: 0,
  334. musicGroupSubjectPlanFee: 0,
  335. musicalPrice: 0,
  336. changeCourseFee: 0,
  337. };
  338. },
  339. watch: {
  340. detail() {
  341. if (this.detail) {
  342. this.fetchDetail();
  343. }
  344. },
  345. "form.musicalGoods"() {
  346. console.log(this.form, "form");
  347. this.$set(this.form, "type", "");
  348. },
  349. "form.type"() {
  350. this.musicalGoodsChange(this.form.musicalGoods);
  351. },
  352. },
  353. computed: {
  354. copyLink() {
  355. if (this.changeInfo) {
  356. return vaildStudentUrl() + "/#/change-voice?id=" + this.changeInfo.id;
  357. }
  358. return "";
  359. },
  360. filterVoiceList() {
  361. return this.voiceList.filter(
  362. (item) => item.subjectId != this.detail.actualSubjectId
  363. );
  364. },
  365. activeAccessories() {
  366. const { musicalGoods } = this.form || {};
  367. let arr = musicalGoods ? this.accessoriesByGoods[musicalGoods] || [] : [];
  368. return arr;
  369. },
  370. changeSubjectName() {
  371. let name = "";
  372. if (this.item.changeSubjectId) {
  373. for (const item of this.voiceList) {
  374. if (item.subjectId === this.item.changeSubjectId) {
  375. name = item.subjectName;
  376. break;
  377. }
  378. }
  379. }
  380. return name;
  381. },
  382. changeAccessoriesGoods() {
  383. const subjectChange = this.changeInfo || {};
  384. const items = (subjectChange.changeAccessoriesGoods || [])
  385. .map((item) => item.name)
  386. .join(",");
  387. return items || "未选择教辅";
  388. },
  389. editSpread() {
  390. const data = this.changeInfo || {};
  391. const payed =
  392. (data.originalAccessoriesPrice || 0) +
  393. (data.originalCourseFee || 0) +
  394. (data.originalMusicalPrice || 0);
  395. return this.form.type == "GROUP"
  396. ? (data.changeMusicalPrice || 0) +
  397. (data.changeAccessoriesPrice || 0) +
  398. this.changeCourseFee -
  399. (data.originalCourseFee || 0) -
  400. payed
  401. : (data.changeMusicalPrice || 0) +
  402. (data.changeAccessoriesPrice || 0) -
  403. payed;
  404. },
  405. spread() {
  406. console.log( this.changeCourseFee ,' this.changeCourseFee', this.form.type, this.musicalPrice +
  407. this.selectAccessoriesMoney +
  408. this.musicGroupSubjectPlanFee +
  409. this.changeCourseFee)
  410. const money =
  411. this.form.type == "GROUP"
  412. ? this.numFormat(
  413. this.musicalPrice +
  414. this.selectAccessoriesMoney +
  415. this.musicGroupSubjectPlanFee +
  416. this.changeCourseFee -
  417. this.originalCourseFee -
  418. this.originalAccessoriesPrice -
  419. this.originalMusicalPrice -
  420. this.coursePurchaseTypeJsonTypePrice -
  421. this.kitGroupPurchaseTypePrice
  422. )
  423. : this.numFormat(
  424. this.musicalPrice +
  425. this.selectAccessoriesMoney +
  426. this.musicGroupSubjectPlanFee -
  427. this.originalAccessoriesPrice -
  428. this.originalMusicalPrice -
  429. this.coursePurchaseTypeJsonTypePrice -
  430. this.kitGroupPurchaseTypePrice
  431. );
  432. // this.originalCourseFee -
  433. // console.log(
  434. // this.item.kitGroupPurchaseType,
  435. // '乐器价格', this.musicalPrice,
  436. // '已选附件价格', this.selectAccessoriesMoney,
  437. // '选择课程费用', this.musicGroupSubjectPlanFee,
  438. // '原附件价格', this.originalAccessoriesPrice,
  439. // '原乐器价格', this.originalMusicalPrice,
  440. // '原课程费用', this.originalCourseFee,
  441. // '原课程减免费用', this.coursePurchaseTypeJsonTypePrice,
  442. // '乐器减免费用', this.kitGroupPurchaseTypePrice,
  443. // '结果价格', money
  444. // )
  445. return money;
  446. },
  447. },
  448. mounted() {
  449. if (this.detail && this.detail.userId) {
  450. this.fetchDetail();
  451. }
  452. },
  453. methods: {
  454. copyUrl(url) {
  455. copy(url);
  456. this.$message.success("复制成功");
  457. },
  458. async fetchDetail() {
  459. const setRes = (res) => {
  460. const { data } = res;
  461. this.item = data || {};
  462. if (data) {
  463. this.$set(this.form, "type", this.item.kitGroupPurchaseType);
  464. this.originalAccessoriesPrice = data.changeAccessoriesPrice;
  465. this.originalMusicalPrice = data.changeMusicalPrice;
  466. if(this.item.kitGroupPurchaseType == 'GROUP'){
  467. this.originalCourseFee = data.changeCourseFee; // 改为原乐器分润
  468. }
  469. // console.log( this.originalCourseFee,'originalCourseFee')
  470. this.originalMusicalGoods =
  471. data.changeMusicalGoods && data.changeMusicalGoods.name;
  472. this.originalAccessoriesGoods = (data.changeAccessoriesGoods || [])
  473. .map((item) => item.name)
  474. .join();
  475. // this.changeCourseFee = data.changeCourseFee
  476. }
  477. };
  478. if (this.detail.subjectChange) {
  479. await getChangeInfo({
  480. id: this.detail.subjectChange.id,
  481. }).then((res) => {
  482. setRes(res);
  483. this.changeInfo = res.data;
  484. });
  485. } else {
  486. this.changeInfo = this.detail.subjectChange;
  487. await getStudentOriginal({
  488. musicGroupId: this.musicGroupId,
  489. studentId: this.detail.studentId,
  490. }).then(setRes);
  491. }
  492. },
  493. async subjectChange(id) {
  494. this.$set(this.form, "musicalGoods", "");
  495. let data = null;
  496. if (id) {
  497. try {
  498. const res = await getSubjectGoodsAndInfo({
  499. musicGroupId: this.musicGroupId,
  500. subjectId: id,
  501. });
  502. data = res.data;
  503. this.musicGroupSubjectPlanFee = res.data.musicGroupSubjectPlan.fee;
  504. // 更改辅件了列表
  505. } catch (e) {
  506. console.log(e);
  507. }
  508. } else {
  509. this.musicGroupSubjectPlanFee = 0;
  510. }
  511. const items = formatAllGoods(data, this.item.kitGroupPurchaseType);
  512. for (const key in items) {
  513. if (items.hasOwnProperty(key)) {
  514. const item = items[key];
  515. this[key] = item;
  516. }
  517. }
  518. this.musicalGoodsChange();
  519. },
  520. musicalGoodsChange(val) {
  521. this.$refs["form"].clearValidate();
  522. this.accessoriesChange([], 0);
  523. if (this.$refs.accessories) {
  524. this.$set(this.$refs.accessories, "checkeds", []);
  525. this.$set(this.$refs.accessories, "isIndeterminate", false);
  526. this.$set(this.$refs.accessories, "checkAll", false);
  527. }
  528. // if (val != "OWNED") {
  529. // this.selectAccessories = [];
  530. // this.selectAccessoriesMoney = 0;
  531. // }
  532. const item = this.musicalGoodsById[val];
  533. if (item) {
  534. this.musicalPrice = this.numFormat(
  535. item[typeAndprice[this.form.type]] || 0
  536. );
  537. // this.kitGroupPurchaseTypePrice = this.numFormat(item[typeAndprice[this.form.type]] || 0)
  538. this.coursePurchaseTypeJsonTypePrice = this.numFormat(
  539. item.coursePurchaseTypeJsonTypePrice
  540. );
  541. this.changeCourseFee = this.numFormat(item.organShareProfit);
  542. this.types = item.kitGroupPurchaseTypeJsonParse;
  543. } else {
  544. this.musicalPrice = 0;
  545. // this.kitGroupPurchaseTypePrice = 0
  546. this.coursePurchaseTypeJsonTypePrice = 0;
  547. this.$set(this.form, "type", "");
  548. }
  549. this.$forceUpdate();
  550. },
  551. accessoriesChange(ids, money) {
  552. this.selectAccessories = ids;
  553. this.selectAccessoriesMoney = money;
  554. },
  555. numFormat(num) {
  556. let _num = parseFloat(num);
  557. if (isNaN(_num)) {
  558. _num = 0;
  559. }
  560. return parseFloat(_num.toFixed(2));
  561. },
  562. onCreateQRCode() {
  563. setTimeout(() => {
  564. this.$refs.qrCodeUrl.innerHTML = "";
  565. this.qrcode = new QRCode(this.$refs.qrCodeUrl, {
  566. width: 200,
  567. height: 200,
  568. colorDark: "#000000",
  569. colorLight: "#ffffff",
  570. correctLevel: QRCode.CorrectLevel.H,
  571. });
  572. this.qrcode.makeCode(this.copyLink);
  573. this.codeUrl = this.copyLink;
  574. }, 500);
  575. },
  576. submit() {
  577. this.$refs["form"].validate((valid) => {
  578. this.detail.subjectId;
  579. if (valid) {
  580. if (
  581. this.courseViewType == 2 &&
  582. this.form.musicalGoods == "OWNED" &&
  583. this.selectAccessories &&
  584. this.selectAccessories.length <= 0
  585. ) {
  586. this.$message.error("请至少选择一个教辅");
  587. return;
  588. }
  589. subjectChangeAdd({
  590. changeCourseFee: this.numFormat(this.changeCourseFee),
  591. changeAccessories: this.selectAccessories.join(",") || null,
  592. changeAccessoriesPrice: this.numFormat(this.selectAccessoriesMoney),
  593. changeMusicalPrice: this.numFormat(this.musicalPrice),
  594. originalCourseFee: this.originalCourseFee,
  595. originalMusicalPrice: this.originalMusicalPrice,
  596. originalMusical: this.item.originalMusical,
  597. originalAccessories: this.item.originalAccessories,
  598. originalAccessoriesPrice: this.originalAccessoriesPrice,
  599. cooperationOrganId: this.item.cooperationOrganId,
  600. kitGroupPurchaseType:
  601. this.form.musicalGoods === "OWNED"
  602. ? this.form.musicalGoods
  603. : this.form.type,
  604. musicGroupId: this.musicGroupId,
  605. studentId: this.detail.studentId,
  606. changeMusical:
  607. this.form.musicalGoods === "OWNED" ? 0 : this.form.musicalGoods,
  608. originalCost: this.item.originalCost,
  609. organId: this.item.organId,
  610. originalSubjectId: this.detail?.actualSubjectId,
  611. changeSubjectId: this.form.subjectId,
  612. }).then((res) => {
  613. this.$listeners.close();
  614. this.$listeners.submited();
  615. this.$message.success("提交成功!");
  616. });
  617. }
  618. });
  619. },
  620. cancel() {
  621. this.$confirm("是否确认取消订单?", "提示", {
  622. onfirmButtonText: "确定",
  623. cancelButtonText: "取消",
  624. type: "warning",
  625. }).then(() => {
  626. subjectChangeCancel({
  627. id: this.detail.subjectChange.id,
  628. }).then((res) => {
  629. this.$listeners.close();
  630. this.$listeners.submited();
  631. this.$message.success("取消成功!");
  632. });
  633. });
  634. },
  635. },
  636. };
  637. </script>
  638. <style lang="less" scoped>
  639. .viewlink {
  640. display: flex;
  641. .link {
  642. flex: 1;
  643. overflow: hidden;
  644. text-overflow: ellipsis;
  645. display: block;
  646. white-space: nowrap;
  647. }
  648. .btn {
  649. width: 100px;
  650. margin-left: 20px;
  651. }
  652. }
  653. .left-code {
  654. height: 255px;
  655. .code-url {
  656. margin-top: 10px;
  657. .linkbtn {
  658. margin-top: 0;
  659. margin-bottom: 0;
  660. font-size: 12px;
  661. }
  662. }
  663. }
  664. </style>