ModifyPrintPlan.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. <template>
  2. <el-dialog
  3. class="modify-print-plan"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10px"
  7. width="700px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @open="visibleChange"
  12. >
  13. <el-form
  14. ref="modalFormComp"
  15. label-width="130px"
  16. :rules="rules"
  17. :model="modalForm"
  18. >
  19. <div class="part-box">
  20. <h4 class="part-box-tips">基本信息:</h4>
  21. <el-form-item prop="name" label="印刷计划名称:">
  22. <el-input
  23. v-model.trim="modalForm.name"
  24. clearable
  25. placeholder="请输入"
  26. :disabled="!editable"
  27. ></el-input>
  28. </el-form-item>
  29. <el-form-item prop="examStartTime" label="考试时间:">
  30. <el-date-picker
  31. v-model="createTime"
  32. type="datetimerange"
  33. range-separator="至"
  34. start-placeholder="开始时间"
  35. end-placeholder="结束时间"
  36. value-format="timestamp"
  37. align="right"
  38. unlink-panels
  39. :disabled="!editable"
  40. @change="dateChange"
  41. >
  42. </el-date-picker>
  43. </el-form-item>
  44. <el-form-item prop="semesterId" label="使用学期:">
  45. <semester-select
  46. v-model="modalForm.semesterId"
  47. class="width-full"
  48. :disabled="!editable"
  49. ></semester-select>
  50. </el-form-item>
  51. <el-form-item prop="examId" label="考试:">
  52. <exam-select
  53. v-model="modalForm.examId"
  54. :semester-id="modalForm.semesterId"
  55. :category="modalForm.category"
  56. class="width-full"
  57. @change="examChange"
  58. ></exam-select>
  59. </el-form-item>
  60. </div>
  61. <div class="part-box">
  62. <h4 class="part-box-tips">
  63. 试卷&题卡印品:
  64. <el-checkbox
  65. v-model="allSelected"
  66. label="全选"
  67. disabled
  68. @change="selectAll"
  69. ></el-checkbox>
  70. </h4>
  71. <el-form-item prop="printContent" label="试卷、题卡:">
  72. <el-checkbox-group
  73. v-model="modalForm.printContent"
  74. disabled
  75. @change="() => checkSelectAll()"
  76. >
  77. <el-checkbox
  78. v-for="(val, key) in PRINT_CONTENT_TYPE"
  79. :key="key"
  80. :label="key"
  81. >{{ val }}</el-checkbox
  82. >
  83. </el-checkbox-group>
  84. </el-form-item>
  85. <el-form-item
  86. v-if="modalForm.printContent.length"
  87. prop="backupMethod"
  88. label="备用数量:"
  89. >
  90. <el-select
  91. v-model="modalForm.backupMethod"
  92. class="mr-2"
  93. size="small"
  94. placeholder="请选择"
  95. disabled
  96. >
  97. <el-option
  98. v-for="(val, key) in PAPER_BACKUP_TYPE"
  99. :key="key"
  100. :value="key"
  101. :label="val"
  102. ></el-option>
  103. </el-select>
  104. <exam-backup-edit
  105. v-model="modalForm.backupCount"
  106. disabled
  107. ></exam-backup-edit>
  108. </el-form-item>
  109. <el-form-item
  110. v-if="contentIncludesPaper"
  111. prop="drawRule"
  112. label="抽卷规则:"
  113. >
  114. <el-radio-group v-model="modalForm.drawRule" disabled>
  115. <el-radio
  116. v-for="(val, key) in DRAW_RULE_TYPE"
  117. :label="key"
  118. :key="key"
  119. >{{ val }}</el-radio
  120. >
  121. </el-radio-group>
  122. <p class="tips-info">
  123. 1.只抽取一次:不同印刷计划下,同一试卷编号下的卷型只能被抽取一次;
  124. </p>
  125. <p class="tips-info">
  126. 2.可反复抽取:不同印刷计划下,同一试卷编号下的卷型可重复抽取,系统默认优先抽取未曝光卷型。
  127. </p>
  128. </el-form-item>
  129. </div>
  130. <div class="part-box">
  131. <h4 class="part-box-tips">其他印品:</h4>
  132. <el-form-item
  133. v-for="(item, index) in modalForm.variableContent"
  134. :key="item.type"
  135. :label="`${TEMPLATE_CLASSIFY[item.type]}:`"
  136. :prop="`variableContent.${index}.templateId`"
  137. :rules="{
  138. required: false,
  139. validator: templateValidator,
  140. trigger: 'change',
  141. }"
  142. :required="!!item.templateId.length"
  143. >
  144. <el-checkbox-group
  145. v-model="item.templateId"
  146. disabled
  147. @change="(vals) => tempChange(vals, `variableContent.${index}`)"
  148. >
  149. <el-checkbox
  150. v-for="temp in templateSources[item.type]"
  151. :label="temp.id"
  152. :key="temp.id"
  153. >{{ temp.name }}</el-checkbox
  154. >
  155. </el-checkbox-group>
  156. <div v-if="item.templateId.length">
  157. <el-select
  158. v-model="item.backupMethod"
  159. class="mr-2"
  160. size="small"
  161. placeholder="请选择"
  162. disabled
  163. >
  164. <el-option
  165. v-for="(val, key) in PRINT_BACKUP_TYPE"
  166. :key="key"
  167. :value="key"
  168. :label="val"
  169. ></el-option>
  170. </el-select>
  171. <el-input-number
  172. class="mr-1"
  173. v-model="item.backupCount"
  174. size="small"
  175. :min="0"
  176. :max="200"
  177. :step="1"
  178. step-strictly
  179. :controls="false"
  180. disabled
  181. style="width: 60px"
  182. ></el-input-number>
  183. <span>份</span>
  184. </div>
  185. </el-form-item>
  186. </div>
  187. <div class="part-box">
  188. <!-- <h4 class="part-box-tips">普通印品:</h4> -->
  189. <el-form-item
  190. v-for="(item, index) in modalForm.ordinaryContent"
  191. :key="item.type"
  192. :label="`${TEMPLATE_CLASSIFY[item.type]}:`"
  193. :prop="`ordinaryContent.${index}.templateId`"
  194. :rules="{
  195. required: false,
  196. validator: templateValidator,
  197. trigger: 'change',
  198. }"
  199. :required="!!item.templateId.length"
  200. >
  201. <el-checkbox-group
  202. v-model="item.templateId"
  203. disabled
  204. @change="(vals) => tempChange(vals, `ordinaryContent.${index}`)"
  205. >
  206. <el-checkbox
  207. v-for="temp in templateSources[item.type]"
  208. :label="temp.id"
  209. :key="temp.id"
  210. >{{ temp.name }}</el-checkbox
  211. >
  212. </el-checkbox-group>
  213. <div v-if="item.templateId.length">
  214. <el-select
  215. v-model="item.backupMethod"
  216. class="mr-2"
  217. size="small"
  218. placeholder="请选择"
  219. disabled
  220. >
  221. <el-option
  222. v-for="(val, key) in PRINT_BACKUP_TYPE"
  223. :key="key"
  224. :value="key"
  225. :label="val"
  226. ></el-option>
  227. </el-select>
  228. <el-input-number
  229. class="mr-1"
  230. v-model="item.backupCount"
  231. size="small"
  232. :min="0"
  233. :max="200"
  234. :step="1"
  235. step-strictly
  236. :controls="false"
  237. disabled
  238. style="width: 60px"
  239. ></el-input-number>
  240. <span>份</span>
  241. </div>
  242. </el-form-item>
  243. </div>
  244. <el-form-item prop="selectedPrint"></el-form-item>
  245. </el-form>
  246. <div slot="footer">
  247. <el-button
  248. v-if="editable"
  249. type="primary"
  250. :disabled="isSubmit"
  251. @click="submit"
  252. >确认</el-button
  253. >
  254. <el-button @click="cancel">取消</el-button>
  255. </div>
  256. </el-dialog>
  257. </template>
  258. <script>
  259. import {
  260. PRINT_CONTENT_TYPE,
  261. DRAW_RULE_TYPE,
  262. PRINT_BACKUP_TYPE,
  263. PAPER_BACKUP_TYPE,
  264. TEMPLATE_CLASSIFY,
  265. EXAM_TYPE,
  266. } from "@/constants/enumerate";
  267. import { deepCopy } from "@/plugins/utils";
  268. import { updatePrintPlan, printPlanTemplateList } from "../api";
  269. import { examConfigQuery } from "../../base/api";
  270. import ExamBackupEdit from "../../base/components/ExamBackupEdit.vue";
  271. const initModalForm = {
  272. id: null,
  273. name: "",
  274. examStartTime: "",
  275. examEndTime: "",
  276. semesterId: "",
  277. examId: "",
  278. category: "FORMAL",
  279. printContent: [],
  280. backupMethod: "ROOM",
  281. backupCount: 1,
  282. drawRule: "ONE",
  283. variableContent: [
  284. {
  285. type: "SIGN",
  286. templateId: [],
  287. oldTemplateId: [],
  288. backupMethod: "ROOM",
  289. backupCount: 1,
  290. },
  291. {
  292. type: "PACKAGE",
  293. templateId: [],
  294. oldTemplateId: [],
  295. backupMethod: "ROOM",
  296. backupCount: 1,
  297. },
  298. ],
  299. ordinaryContent: [
  300. {
  301. type: "CHECK_IN",
  302. templateId: [],
  303. oldTemplateId: [],
  304. backupMethod: "ROOM",
  305. backupCount: 1,
  306. },
  307. ],
  308. };
  309. export default {
  310. name: "modify-print-plan",
  311. components: { ExamBackupEdit },
  312. props: {
  313. instance: {
  314. type: Object,
  315. default() {
  316. return {};
  317. },
  318. },
  319. editType: {
  320. type: String,
  321. default: "ADD",
  322. validator: (val) => ["ADD", "PREVIEW", "EDIT"].includes(val),
  323. },
  324. },
  325. computed: {
  326. isEdit() {
  327. return !!this.instance.id;
  328. },
  329. title() {
  330. const names = {
  331. ADD: "新增印刷计划",
  332. PREVIEW: "印刷计划详情",
  333. EDIT: "编辑印刷计划",
  334. };
  335. const infos = [names[this.editType], EXAM_TYPE[this.modalForm.category]];
  336. return infos.filter((item) => Boolean(item)).join("-");
  337. },
  338. editable() {
  339. return this.editType !== "PREVIEW";
  340. },
  341. contentIncludesPaper() {
  342. return this.modalForm.printContent.includes("PAPER");
  343. },
  344. },
  345. data() {
  346. // const printContentValidator = (rule, value, callback) => {
  347. // if (value.includes("PAPER") && !value.includes("CARD")) {
  348. // callback(new Error("选择了试卷,同时必须选择题卡"));
  349. // } else {
  350. // callback();
  351. // }
  352. // };
  353. const backupMethodValidator = (rule, value, callback) => {
  354. if (!this.modalForm.printContent.length) {
  355. return callback();
  356. }
  357. if (!value) {
  358. return callback(new Error("请选择备份方式"));
  359. }
  360. if (!this.modalForm.backupCount) {
  361. return callback(new Error("请输入备份数量"));
  362. }
  363. callback();
  364. };
  365. const selectedPrintValidator = (rule, value, callback) => {
  366. const printInfo = [
  367. ...this.modalForm.variableContent,
  368. ...this.modalForm.ordinaryContent,
  369. ];
  370. const hasPrintInfo = printInfo.some((item) => item.templateId.length);
  371. if (hasPrintInfo || this.modalForm.printContent.length) {
  372. callback();
  373. } else {
  374. callback(new Error("必须选择一项印品"));
  375. }
  376. };
  377. return {
  378. modalIsShow: false,
  379. isSubmit: false,
  380. modalForm: deepCopy(initModalForm),
  381. createTime: [],
  382. PRINT_CONTENT_TYPE,
  383. DRAW_RULE_TYPE,
  384. PRINT_BACKUP_TYPE,
  385. PAPER_BACKUP_TYPE,
  386. TEMPLATE_CLASSIFY,
  387. variableContent: [],
  388. ordinaryContent: [],
  389. templateSources: {},
  390. oldPrintContent: [],
  391. allSelected: false,
  392. rules: {
  393. name: [
  394. {
  395. required: true,
  396. message: "请输入印刷计划名称,长度不要超过50个字符",
  397. max: 50,
  398. trigger: "change",
  399. },
  400. ],
  401. examStartTime: [
  402. {
  403. required: true,
  404. message: "请设置考试时间",
  405. trigger: "change",
  406. },
  407. ],
  408. semesterId: [
  409. {
  410. required: true,
  411. message: "请选择使用学期",
  412. trigger: "change",
  413. },
  414. ],
  415. examId: [
  416. {
  417. required: true,
  418. message: "请选择使用考试",
  419. trigger: "change",
  420. },
  421. ],
  422. printContent: [
  423. {
  424. required: false,
  425. // validator: printContentValidator,
  426. trigger: "change",
  427. },
  428. ],
  429. backupMethod: [
  430. {
  431. required: true,
  432. validator: backupMethodValidator,
  433. trigger: "change",
  434. },
  435. ],
  436. drawRule: [
  437. {
  438. required: true,
  439. message: "请选择抽卷规则",
  440. trigger: "change",
  441. },
  442. ],
  443. selectedPrint: [
  444. {
  445. required: false,
  446. validator: selectedPrintValidator,
  447. trigger: "change",
  448. },
  449. ],
  450. },
  451. };
  452. },
  453. mounted() {
  454. this.getTemplates();
  455. },
  456. methods: {
  457. async getTemplates() {
  458. const data = await printPlanTemplateList();
  459. const templateSources = {};
  460. const templates = [...data.variable, ...data.ordinary];
  461. templates.forEach((item) => {
  462. templateSources[item.type] = item.template;
  463. });
  464. this.templateSources = templateSources;
  465. },
  466. selectAll(selected) {
  467. if (selected) {
  468. this.modalForm.printContent = ["PAPER", "CARD"];
  469. this.modalForm.variableContent.forEach((item) => {
  470. if (item.templateId && item.templateId.length) return;
  471. const source = this.templateSources[item.type][0];
  472. item.templateId = source && [source.id];
  473. item.oldTemplateId = source && [source.id];
  474. });
  475. this.modalForm.ordinaryContent.forEach((item) => {
  476. if (item.templateId && item.templateId.length) return;
  477. const source = this.templateSources[item.type][0];
  478. item.templateId = source && [source.id];
  479. item.oldTemplateId = source && [source.id];
  480. });
  481. } else {
  482. this.modalForm.printContent = [];
  483. this.modalForm.variableContent.forEach((item) => {
  484. item.templateId = [];
  485. item.oldTemplateId = [];
  486. });
  487. this.modalForm.ordinaryContent.forEach((item) => {
  488. item.templateId = [];
  489. item.oldTemplateId = [];
  490. });
  491. }
  492. },
  493. checkSelectAll() {
  494. const vNotSelected = this.modalForm.variableContent.some(
  495. (item) => !item.templateId.length
  496. );
  497. const oNotSelected = this.modalForm.ordinaryContent.some(
  498. (item) => !item.templateId.length
  499. );
  500. const pNotSelected = this.modalForm.printContent.length < 2;
  501. const selecteds = [vNotSelected, oNotSelected, pNotSelected];
  502. this.allSelected = !selecteds.some((item) => item);
  503. },
  504. templateValidator(rule, value, callback) {
  505. const [field, index] = rule.field.split(".");
  506. const val = this.modalForm[field][index];
  507. if (val.templateId.length) {
  508. if (!val.backupMethod) {
  509. return callback(new Error("请选择备份方式"));
  510. }
  511. if (!val.backupCount) {
  512. return callback(new Error("请输入备份数量"));
  513. }
  514. callback();
  515. } else {
  516. callback();
  517. }
  518. },
  519. tempChange(vals, name) {
  520. const [field, index] = name.split(".");
  521. const info = this.modalForm[field][index];
  522. const newVals = vals.filter((item) => !info.oldTemplateId.includes(item));
  523. info.templateId = newVals;
  524. info.oldTemplateId = newVals;
  525. this.checkSelectAll();
  526. this.$refs.modalFormComp.validateField("selectedPrint");
  527. },
  528. printContentChange(val) {
  529. const isSelectPaper =
  530. !this.oldPrintContent.includes("PAPER") && val.includes("PAPER");
  531. if (isSelectPaper && !val.includes("CARD")) {
  532. val.push("CARD");
  533. }
  534. this.oldPrintContent = val;
  535. },
  536. initData(val) {
  537. if (val.id) {
  538. this.createTime = [val.examStartTime, val.examEndTime];
  539. this.modalForm = this.$objAssign(deepCopy(initModalForm), val);
  540. const transformInfo = (item) => {
  541. const templateIds = item.templateId ? [item.templateId] : [];
  542. return {
  543. type: item.type,
  544. templateId: templateIds,
  545. oldTemplateId: templateIds,
  546. backupMethod: item.backupMethod,
  547. backupCount: item.backupCount,
  548. };
  549. };
  550. const initModalFormContent = deepCopy(initModalForm);
  551. const variableContent = val.variableContent;
  552. const variableContentTypes = variableContent.map((item) => item.type);
  553. this.modalForm.variableContent = [];
  554. initModalFormContent.variableContent.forEach((item) => {
  555. if (variableContentTypes.includes(item.type)) {
  556. const vitem = variableContent.find(
  557. (cont) => cont.type === item.type
  558. );
  559. this.modalForm.variableContent.push(transformInfo(vitem));
  560. return;
  561. }
  562. if (this.templateSources[item.type]) {
  563. this.modalForm.variableContent.push(item);
  564. return;
  565. }
  566. });
  567. const ordinaryContent = val.ordinaryContent;
  568. const ordinaryContentTypes = ordinaryContent.map((item) => item.type);
  569. this.modalForm.ordinaryContent = [];
  570. initModalFormContent.ordinaryContent.forEach((item) => {
  571. if (ordinaryContentTypes.includes(item.type)) {
  572. const vitem = ordinaryContent.find(
  573. (cont) => cont.type === item.type
  574. );
  575. this.modalForm.ordinaryContent.push(transformInfo(vitem));
  576. return;
  577. }
  578. if (this.templateSources[item.type]) {
  579. this.modalForm.ordinaryContent.push(item);
  580. return;
  581. }
  582. });
  583. this.modalForm.printContent = val.printContent
  584. ? val.printContent.split(",")
  585. : [];
  586. this.checkSelectAll();
  587. } else {
  588. this.allSelected = false;
  589. let modalForm = this.$objAssign(deepCopy(initModalForm), val);
  590. modalForm.variableContent = modalForm.variableContent.filter(
  591. (item) => this.templateSources[item.type]
  592. );
  593. modalForm.ordinaryContent = modalForm.ordinaryContent.filter(
  594. (item) => this.templateSources[item.type]
  595. );
  596. this.modalForm = modalForm;
  597. this.createTime = [];
  598. }
  599. },
  600. visibleChange() {
  601. this.initData(this.instance);
  602. this.$nextTick(() => {
  603. this.$refs.modalFormComp.clearValidate();
  604. });
  605. },
  606. cancel() {
  607. this.modalIsShow = false;
  608. },
  609. open() {
  610. this.modalIsShow = true;
  611. },
  612. async examChange() {
  613. if (!this.modalForm.examId) return;
  614. const data = await examConfigQuery({
  615. examId: this.modalForm.examId,
  616. pageNumber: 1,
  617. pageSize: 10,
  618. });
  619. this.initExamConfig(data.records[0]);
  620. },
  621. initExamConfig(val) {
  622. // console.log(val);
  623. if (!val) return;
  624. const data = this.$objAssign(
  625. {
  626. backupMethod: "ROOM",
  627. backupCount: 1,
  628. drawRule: "ONE",
  629. },
  630. val
  631. );
  632. Object.assign(this.modalForm, data);
  633. const transformInfo = (item) => {
  634. const templateIds = item.templateId ? [item.templateId] : [];
  635. return {
  636. type: item.type,
  637. templateId: templateIds,
  638. oldTemplateId: templateIds,
  639. backupMethod: item.backupMethod,
  640. backupCount: item.backupCount,
  641. };
  642. };
  643. const initModalFormContent = deepCopy(initModalForm);
  644. const variableContent = JSON.parse(val.variableContent);
  645. const variableContentTypes = variableContent.map((item) => item.type);
  646. this.modalForm.variableContent = [];
  647. initModalFormContent.variableContent.forEach((item) => {
  648. if (variableContentTypes.includes(item.type)) {
  649. const vitem = variableContent.find((cont) => cont.type === item.type);
  650. this.modalForm.variableContent.push(transformInfo(vitem));
  651. return;
  652. }
  653. if (this.templateSources[item.type]) {
  654. this.modalForm.variableContent.push(item);
  655. return;
  656. }
  657. });
  658. const ordinaryContent = JSON.parse(val.ordinaryContent);
  659. const ordinaryContentTypes = ordinaryContent.map((item) => item.type);
  660. this.modalForm.ordinaryContent = [];
  661. initModalFormContent.ordinaryContent.forEach((item) => {
  662. if (ordinaryContentTypes.includes(item.type)) {
  663. const vitem = ordinaryContent.find((cont) => cont.type === item.type);
  664. this.modalForm.ordinaryContent.push(transformInfo(vitem));
  665. return;
  666. }
  667. if (this.templateSources[item.type]) {
  668. this.modalForm.ordinaryContent.push(item);
  669. return;
  670. }
  671. });
  672. this.modalForm.printContent = JSON.parse(val.printContent);
  673. this.checkSelectAll();
  674. },
  675. dateChange() {
  676. if (this.createTime) {
  677. this.modalForm.examStartTime = this.createTime[0];
  678. this.modalForm.examEndTime = this.createTime[1];
  679. } else {
  680. this.modalForm.examStartTime = "";
  681. this.modalForm.examEndTime = "";
  682. }
  683. },
  684. async submit() {
  685. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  686. if (!valid) return;
  687. if (this.isSubmit) return;
  688. this.isSubmit = true;
  689. const datas = { ...this.modalForm };
  690. const transformInfo = (item) => {
  691. const templateId = item.templateId.join();
  692. const template = this.templateSources[item.type].find(
  693. (temp) => temp.id === templateId
  694. );
  695. return {
  696. type: item.type,
  697. templateId,
  698. attachmentId: template && template.attachmentId,
  699. backupMethod: item.backupMethod,
  700. backupCount: item.backupCount,
  701. };
  702. };
  703. datas.variableContent = JSON.stringify(
  704. this.modalForm.variableContent.map(transformInfo)
  705. );
  706. datas.ordinaryContent = JSON.stringify(
  707. this.modalForm.ordinaryContent.map(transformInfo)
  708. );
  709. const data = await updatePrintPlan(datas).catch(() => {});
  710. this.isSubmit = false;
  711. if (!data) return;
  712. this.$message.success("保存成功!");
  713. this.$emit("modified");
  714. this.cancel();
  715. },
  716. },
  717. };
  718. </script>