index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. <template>
  2. <template-page v-if="showTable" ref="pageRef" :get-list="[getList1, getList2][pageLevel]"
  3. :exportList="[exportList1, exportList2][pageLevel]"
  4. :options-evens-group="[optionsEvensGroup1, optionsEvensGroup2][pageLevel]"
  5. :operation="([operation1, operation2][pageLevel])()" :expCode="['exp', 'detailExp'][pageLevel]"
  6. :table-attributes="tableAttributes" :table-events="tableEvents" :moreParameters="moreParameters"
  7. :column-parsing="columnParsing">
  8. <div slot="moreSearch" v-if="pageLevel==0">
  9. <el-radio-group v-model="tagStatus" size="mini" @change="changeType">
  10. <el-radio-button label="">全部</el-radio-button>
  11. <el-radio-button label="NO">未汇总</el-radio-button>
  12. <el-radio-button label="YES">已汇总</el-radio-button>
  13. </el-radio-group>
  14. <br><br>
  15. </div>
  16. <div class="cartographer_big">
  17. <el-dialog title="费用明细" width="100%" :modal="false" :visible.sync="formBool" :before-close="handleClose">
  18. <zj-page-container v-if="formBool">
  19. <zj-page-fill class="neibuview">
  20. <zj-form-container ref="formRef" :form-data="formData" :form-attributes="{ size: 'mini' }">
  21. <zj-form-module title="基本信息" label-width="130px" :form-data="formData" :form-items="formItems" />
  22. </zj-form-container>
  23. </zj-page-fill>
  24. <div>
  25. <div style="box-sizing: border-box; padding: 10px;text-align: right;">
  26. <el-button size="mini" @click="handleClose">取 消</el-button>
  27. <el-button v-if="!formEdit" size="mini" @click="formConfirm" type="primary">确 定</el-button>
  28. </div>
  29. </div>
  30. </zj-page-container>
  31. </el-dialog>
  32. </div>
  33. </template-page>
  34. </template>
  35. <script>
  36. import TemplatePage from '@/components/template/template-page-1.vue'
  37. import import_mixin from '@/components/template/import_mixin.js'
  38. import operation_mixin from '@/components/template/operation_mixin.js'
  39. import ImageUpload from '@/components/file-upload'
  40. import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
  41. import { settleExpenseGatherList, settleExpenseGatherListExport, settleExpenseImport, settleExpenseMonthGather, settleExpenseList, settleExpenseListExport, settleExpenseGatherBatchDel, settleExpenseBatchDel, settleExpenseSave } from "@/api/costPerDimension";
  42. import { commonTemplateDownload } from '@/api/common.js'
  43. import { memberListPageV2 } from "@/api/masterManagement";
  44. export default {
  45. components: { TemplatePage, ImageUpload },
  46. mixins: [import_mixin, operation_mixin],
  47. data() {
  48. return {
  49. // 表格属性
  50. tableAttributes: {
  51. // 启用勾选列
  52. selectColumn: true,
  53. selectable: this.selectable
  54. },
  55. // 表格事件
  56. tableEvents: {
  57. 'selection-change': this.selectionChange
  58. },
  59. // 勾选选中行
  60. recordSelected: [],
  61. pageLevel: 0,
  62. showTable: true,
  63. collectItem: {},
  64. formData: {
  65. companyWechatName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
  66. },
  67. formBool: false,
  68. formEdit: false,
  69. workerList: [],
  70. tagStatus: this?.pageCode || ""
  71. }
  72. },
  73. computed: {
  74. optionsEvensGroup1() {
  75. return [
  76. [
  77. [
  78. this.optionsEvensAuth("batchSummary", {
  79. click: () => {
  80. if (this.recordSelected.length === 0) {
  81. this.$message.warning('请勾选工单')
  82. return
  83. }
  84. this.$prompt('汇总名称', '汇总', {
  85. confirmButtonText: '确定',
  86. cancelButtonText: '取消',
  87. inputPattern: /\S/,
  88. inputErrorMessage: '名称不能为空'
  89. }).then(({ value }) => {
  90. settleExpenseMonthGather({
  91. ids: this.recordSelected.map(item => item.id),
  92. name: value
  93. }).then(res => {
  94. this.$message({
  95. type: 'success',
  96. message: '操作成功!'
  97. })
  98. this.$refs?.pageRef?.refreshList()
  99. })
  100. }).catch(() => {
  101. });
  102. }
  103. })
  104. ],
  105. [
  106. this.optionsEvensAuth(["import", "download1", "download2", "download3", "download4"], {
  107. name: '导入费用',
  108. click: () => { }
  109. }),
  110. this.optionsEvensAuth("import", ({ moduleName }) => {
  111. return {
  112. name: moduleName,
  113. render: () => {
  114. return this.importButton(settleExpenseImport, moduleName)
  115. }
  116. }
  117. }),
  118. this.optionsEvensAuth("download1", {
  119. click: () => {
  120. commonTemplateDownload({ name: '师傅费用结算导入模板(其它).xlsx' }, `师傅费用结算导入模板(其它)`)
  121. .then(res => {
  122. this.$message({
  123. message: '下载成功',
  124. type: 'success'
  125. })
  126. })
  127. .catch(err => {
  128. this.$message.error('下载失败')
  129. })
  130. }
  131. }),
  132. this.optionsEvensAuth("download2", {
  133. click: () => {
  134. commonTemplateDownload({ name: '师傅费用结算导入模板(安装其它).xlsx' }, `师傅费用结算导入模板(安装其它)`)
  135. .then(res => {
  136. this.$message({
  137. message: '下载成功',
  138. type: 'success'
  139. })
  140. })
  141. .catch(err => {
  142. this.$message.error('下载失败')
  143. })
  144. }
  145. }),
  146. this.optionsEvensAuth("download3", {
  147. click: () => {
  148. commonTemplateDownload({ name: '师傅费用结算导入模板(安装家用空调).xlsx' }, `师傅费用结算导入模板(安装家用空调)`)
  149. .then(res => {
  150. this.$message({
  151. message: '下载成功',
  152. type: 'success'
  153. })
  154. })
  155. .catch(err => {
  156. this.$message.error('下载失败')
  157. })
  158. }
  159. }),
  160. this.optionsEvensAuth("download4", {
  161. click: () => {
  162. commonTemplateDownload({ name: '师傅费用结算导入模板(维修).xlsx' }, `师傅费用结算导入模板(维修)`)
  163. .then(res => {
  164. this.$message({
  165. message: '下载成功',
  166. type: 'success'
  167. })
  168. })
  169. .catch(err => {
  170. this.$message.error('下载失败')
  171. })
  172. }
  173. }),
  174. ],
  175. ]
  176. ]
  177. },
  178. optionsEvensGroup2() {
  179. return [
  180. [
  181. [
  182. {
  183. name: "返回汇总页面",
  184. click: () => {
  185. this.pageLevel = 0
  186. }
  187. }
  188. ],
  189. ],
  190. ...(() => {
  191. if (this.collectItem.status != "YES") {
  192. return [
  193. [
  194. [
  195. this.optionsEvensAuth("detailAdd", {
  196. click: () => {
  197. this.formBool = true
  198. this.getWorkers()
  199. }
  200. })
  201. ],
  202. [
  203. this.optionsEvensAuth("detailBatchDel", {
  204. click: () => {
  205. if (this.recordSelected.length === 0) {
  206. this.$message.warning('请勾选工单')
  207. return
  208. }
  209. this.$confirm('此操作将永久删除数据, 是否继续?', '提示', {
  210. confirmButtonText: '确定',
  211. cancelButtonText: '取消',
  212. type: 'warning'
  213. }).then(() => {
  214. settleExpenseBatchDel(this.recordSelected.map(item => item.id)).then(res => {
  215. this.$message({
  216. type: 'success',
  217. message: '删除成功!'
  218. })
  219. this.$refs?.pageRef?.refreshList()
  220. })
  221. }).catch(() => {
  222. });
  223. }
  224. })
  225. ],
  226. ]
  227. ]
  228. }
  229. return []
  230. })()
  231. ]
  232. },
  233. // 更多参数
  234. moreParameters() {
  235. return []
  236. },
  237. formItems() {
  238. return [
  239. {
  240. name: 'el-input',
  241. md: 12,
  242. attributes: {
  243. disabled: true,
  244. },
  245. formItemAttributes: {
  246. label: '所属商户',
  247. prop: 'companyWechatName',
  248. rules: []
  249. }
  250. }, {
  251. name: 'el-input',
  252. md: 12,
  253. attributes: {
  254. disabled: this.formEdit,
  255. },
  256. formItemAttributes: {
  257. label: '网点名称',
  258. prop: 'importWebsitName',
  259. rules: []
  260. }
  261. }, {
  262. name: 'el-date-picker',
  263. md: 6,
  264. attributes: {
  265. type: "month",
  266. disabled: this.formEdit,
  267. 'value-format': 'yyyy-MM',
  268. },
  269. formItemAttributes: {
  270. label: '发放月份',
  271. prop: 'sendMonth',
  272. rules: [...required]
  273. }
  274. }, {
  275. name: 'el-input',
  276. md: 6,
  277. attributes: {
  278. disabled: this.formEdit,
  279. },
  280. formItemAttributes: {
  281. label: '费用类型',
  282. prop: 'typeName',
  283. rules: [...required]
  284. }
  285. }, {
  286. name: 'el-input',
  287. md: 6,
  288. attributes: {
  289. disabled: this.formEdit,
  290. },
  291. formItemAttributes: {
  292. label: '安装/维修品类',
  293. prop: 'category',
  294. rules: []
  295. }
  296. }, {
  297. name: 'el-input',
  298. md: 6,
  299. attributes: {
  300. disabled: this.formEdit,
  301. },
  302. formItemAttributes: {
  303. label: '维修自编号',
  304. prop: 'repairCustomCode',
  305. rules: []
  306. }
  307. }, {
  308. name: 'el-input',
  309. md: 6,
  310. attributes: {
  311. disabled: this.formEdit,
  312. },
  313. formItemAttributes: {
  314. label: '内机条码',
  315. prop: 'insideCode',
  316. rules: []
  317. }
  318. }, {
  319. name: 'el-input',
  320. md: 6,
  321. attributes: {
  322. disabled: this.formEdit,
  323. },
  324. formItemAttributes: {
  325. label: '内机名称',
  326. prop: 'insideName',
  327. rules: []
  328. }
  329. }, {
  330. name: 'el-input',
  331. md: 6,
  332. attributes: {
  333. disabled: this.formEdit,
  334. },
  335. formItemAttributes: {
  336. label: '基础安装/维修费用',
  337. prop: 'baseAmount',
  338. rules: []
  339. }
  340. }, {
  341. name: 'el-input',
  342. md: 6,
  343. attributes: {
  344. disabled: this.formEdit,
  345. },
  346. formItemAttributes: {
  347. label: '辅材达标',
  348. prop: 'materialAmount',
  349. rules: []
  350. }
  351. }, {
  352. name: 'el-input',
  353. md: 6,
  354. attributes: {
  355. disabled: this.formEdit,
  356. },
  357. formItemAttributes: {
  358. label: '评价数据达标',
  359. prop: 'appraiseAmount',
  360. rules: []
  361. }
  362. },
  363. {
  364. md: 6,
  365. name: 'slot-component',
  366. formItemAttributes: {
  367. label: '合计金额',
  368. prop: 'totalAmount',
  369. rules: []
  370. },
  371. attributes: {},
  372. render: (h, { props, onInput }) => {
  373. return (
  374. <el-input
  375. value={Number(this.formData.baseAmount) + Number(this.formData.materialAmount) + Number(this.formData.appraiseAmount)}
  376. disabled={true}
  377. size="mini"
  378. placeholder="请输入"
  379. ></el-input>
  380. )
  381. }
  382. },
  383. {
  384. name: 'el-input',
  385. md: 6,
  386. attributes: {
  387. disabled: this.formEdit,
  388. },
  389. formItemAttributes: {
  390. label: '工单编号',
  391. prop: 'orderNo',
  392. rules: []
  393. }
  394. }, {
  395. name: 'el-input',
  396. md: 6,
  397. attributes: {
  398. disabled: this.formEdit,
  399. },
  400. formItemAttributes: {
  401. label: '销售单号',
  402. prop: 'salesOrderNo',
  403. rules: []
  404. }
  405. }, {
  406. name: 'el-date-picker',
  407. md: 6,
  408. attributes: {
  409. type: "date",
  410. disabled: this.formEdit,
  411. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  412. },
  413. formItemAttributes: {
  414. label: '安装/维修日期',
  415. prop: 'workDate',
  416. rules: []
  417. }
  418. }, {
  419. name: 'el-input',
  420. md: 6,
  421. attributes: {
  422. disabled: this.formEdit,
  423. },
  424. formItemAttributes: {
  425. label: '销售类型',
  426. prop: 'salesType',
  427. rules: []
  428. }
  429. }, {
  430. name: 'el-input',
  431. md: 12,
  432. attributes: {
  433. disabled: this.formEdit,
  434. },
  435. formItemAttributes: {
  436. label: '维修内容',
  437. prop: 'repairContent',
  438. rules: []
  439. }
  440. }, {
  441. name: 'el-input',
  442. md: 6,
  443. attributes: {
  444. disabled: this.formEdit,
  445. },
  446. formItemAttributes: {
  447. label: '客户名称',
  448. prop: 'userName',
  449. rules: []
  450. }
  451. }, {
  452. name: 'el-input',
  453. md: 6,
  454. attributes: {
  455. disabled: this.formEdit,
  456. },
  457. formItemAttributes: {
  458. label: '客户电话',
  459. prop: 'userMobile',
  460. rules: []
  461. }
  462. }, {
  463. name: 'el-input',
  464. md: 24,
  465. attributes: {
  466. disabled: this.formEdit,
  467. },
  468. formItemAttributes: {
  469. label: '客户地址',
  470. prop: 'userAddress',
  471. rules: []
  472. }
  473. }, {
  474. name: 'el-select',
  475. options: this.workerList,
  476. md: 6,
  477. attributes: {
  478. disabled: this.formEdit,
  479. placeholder: '请选择',
  480. clearable: true,
  481. filterable: true
  482. },
  483. formItemAttributes: {
  484. label: '工程师1名称',
  485. prop: 'workerId1',
  486. rules: [...required]
  487. },
  488. events: {
  489. change: (val) => {
  490. var data = this.workerList.find(item => item.value == val).data
  491. this.formData.workerName1 = data?.workerName || ""
  492. this.formData.workerMobile1 = data?.workerMobile || ""
  493. }
  494. },
  495. }, {
  496. name: 'el-input',
  497. md: 6,
  498. attributes: {
  499. disabled: true,
  500. },
  501. formItemAttributes: {
  502. label: '工程师1电话',
  503. prop: 'workerMobile1',
  504. rules: []
  505. }
  506. }, {
  507. name: 'el-input',
  508. md: 6,
  509. attributes: {
  510. disabled: this.formEdit,
  511. },
  512. formItemAttributes: {
  513. label: '工程师1结算比例',
  514. prop: 'workerSettleRate1',
  515. rules: []
  516. }
  517. }, {
  518. name: 'el-input',
  519. md: 6,
  520. attributes: {
  521. disabled: this.formEdit,
  522. },
  523. formItemAttributes: {
  524. label: '工程师1结算金额',
  525. prop: 'workerSettleAmount1',
  526. rules: []
  527. }
  528. }, {
  529. name: 'el-select',
  530. options: this.workerList,
  531. md: 6,
  532. attributes: {
  533. disabled: this.formEdit,
  534. placeholder: '请选择',
  535. clearable: true,
  536. filterable: true
  537. },
  538. formItemAttributes: {
  539. label: '工程师2名称',
  540. prop: 'workerId2',
  541. rules: []
  542. },
  543. events: {
  544. change: (val) => {
  545. var data = this.workerList.find(item => item.value == val).data
  546. this.formData.workerName2 = data?.workerName || ""
  547. this.formData.workerMobile2 = data?.workerMobile || ""
  548. }
  549. },
  550. }, {
  551. name: 'el-input',
  552. md: 6,
  553. attributes: {
  554. disabled: true,
  555. },
  556. formItemAttributes: {
  557. label: '工程师2电话',
  558. prop: 'workerMobile2',
  559. rules: []
  560. }
  561. }, {
  562. name: 'el-input',
  563. md: 6,
  564. attributes: {
  565. disabled: this.formEdit,
  566. },
  567. formItemAttributes: {
  568. label: '工程师2结算比例',
  569. prop: 'workerSettleRate2',
  570. rules: []
  571. }
  572. }, {
  573. name: 'el-input',
  574. md: 6,
  575. attributes: {
  576. disabled: this.formEdit,
  577. },
  578. formItemAttributes: {
  579. label: '工程师2结算金额',
  580. prop: 'workerSettleAmount2',
  581. rules: []
  582. }
  583. }, {
  584. name: 'el-input',
  585. md: 24,
  586. attributes: {
  587. disabled: this.formEdit,
  588. },
  589. formItemAttributes: {
  590. label: '备注',
  591. prop: 'remark',
  592. rules: []
  593. }
  594. },
  595. ]
  596. }
  597. },
  598. watch: {
  599. pageLevel() {
  600. this.showTable = false
  601. this.$nextTick(() => {
  602. this.showTable = true
  603. })
  604. }
  605. },
  606. created(){
  607. if(this.pageCode){
  608. this.tagStatus = this?.pageCode
  609. }
  610. },
  611. methods: {
  612. changeType(val) {
  613. this.$refs.pageRef.refreshList()
  614. },
  615. getList1(p, cb) {
  616. var pam = JSON.parse(JSON.stringify(p))
  617. try {
  618. if(this.tagStatus){
  619. pam.params.push({"param":"a.status","compare":"=","value": this.tagStatus})
  620. }
  621. cb && cb(pam)
  622. return settleExpenseGatherList(pam)
  623. } catch (err) {
  624. }
  625. },
  626. exportList1: settleExpenseGatherListExport,
  627. getList2(p, cb) {
  628. var pam = JSON.parse(JSON.stringify(p))
  629. try {
  630. pam.params.push({ "param": "a.settle_expense_id", "compare": "=", "value": this.collectItem.id })
  631. cb && cb(pam)
  632. return settleExpenseList(pam)
  633. } catch (err) {
  634. }
  635. },
  636. exportList2: settleExpenseListExport,
  637. selectable(row, index) {
  638. if (this.pageLevel) {
  639. return this?.collectItem?.status != "YES"
  640. }
  641. return !["YES"].includes(Object.entries(row.selectMapData.status).find(([key, val]) => val == row.status)?.[0])
  642. },
  643. operation1() {
  644. return this.operationBtn({
  645. detail: {
  646. click: ({ row, index, column }) => {
  647. this.collectItem = { ...row }
  648. this.pageLevel = 1
  649. }
  650. },
  651. summary: {
  652. conditions: ({ row, index, column }) => {
  653. return row.status != "YES"
  654. },
  655. click: ({ row, index, column }) => {
  656. this.$prompt('汇总名称', '汇总', {
  657. confirmButtonText: '确定',
  658. cancelButtonText: '取消',
  659. inputPattern: /\S/,
  660. inputErrorMessage: '名称不能为空'
  661. }).then(({ value }) => {
  662. settleExpenseMonthGather({
  663. ids: [row.id],
  664. name: value
  665. }).then(res => {
  666. this.$message({
  667. type: 'success',
  668. message: '操作成功!'
  669. })
  670. this.$refs?.pageRef?.refreshList()
  671. })
  672. }).catch(() => {
  673. });
  674. }
  675. },
  676. del: {
  677. prompt: "此操作将永久删除数据, 是否继续?",
  678. conditions: ({ row, index, column }) => {
  679. return row.status != "YES"
  680. },
  681. click: ({ row, index, column }) => {
  682. settleExpenseGatherBatchDel([row.id]).then(res => {
  683. this.$message({
  684. type: 'success',
  685. message: '删除成功!'
  686. })
  687. this.$refs?.pageRef?.refreshList()
  688. })
  689. }
  690. }
  691. })
  692. },
  693. operation2() {
  694. return this.operationBtn({
  695. detailEdit: {
  696. conditions: ({ row, index, column }) => {
  697. return row.status != "YES"
  698. },
  699. click: ({ row, index, column }) => {
  700. this.formData = { ...row }
  701. this.formEdit = false
  702. this.formBool = true
  703. this.getWorkers()
  704. }
  705. },
  706. detailDel: {
  707. prompt: "此操作将永久删除数据, 是否继续?",
  708. conditions: ({ row, index, column }) => {
  709. return row.status != "YES"
  710. },
  711. click: ({ row, index, column }) => {
  712. settleExpenseBatchDel([row.id]).then(res => {
  713. this.$message({
  714. type: 'success',
  715. message: '删除成功!'
  716. })
  717. this.$refs?.pageRef?.refreshList()
  718. })
  719. }
  720. },
  721. details_mx: {
  722. click: ({ row, index, column }) => {
  723. this.formData = { ...row }
  724. this.formEdit = true
  725. this.formBool = true
  726. this.getWorkers()
  727. }
  728. }
  729. })
  730. },
  731. // 表格列解析渲染数据更改
  732. columnParsing(item, defaultData) {
  733. return defaultData
  734. },
  735. // 监听勾选变化
  736. selectionChange(data) {
  737. this.recordSelected = data
  738. },
  739. handleClose() {
  740. this.$data.formData = this.$options.data().formData
  741. this.formBool = false
  742. },
  743. formConfirm() {
  744. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  745. if (valid) {
  746. settleExpenseSave({ ...this.formData, settleExpenseId: this.collectItem.id }).then(res => {
  747. this.$message({
  748. type: 'success',
  749. message: '保存成功!'
  750. })
  751. this.$refs.pageRef.refreshList()
  752. this.handleClose()
  753. })
  754. }
  755. })
  756. },
  757. getWorkers() {
  758. memberListPageV2({ "pageNum": 1, "pageSize": -1, "params": [{ "param": "b.examine_status", "compare": "=", "value": "OK" }] }).then(res => {
  759. this.workerList = res.data.records.map(item => {
  760. var { id, userId, ...data } = item
  761. return {
  762. value: userId,
  763. label: data.nickName,
  764. data: {
  765. workerId: userId,
  766. workerName: data.nickName,
  767. workerIdcard: data.idCard,
  768. workerMobile: data.mobile,
  769. ...data
  770. }
  771. }
  772. })
  773. })
  774. }
  775. }
  776. }
  777. </script>
  778. <style lang="scss" scoped>
  779. .neibuview {
  780. box-sizing: border-box;
  781. padding-left: 16px;
  782. ::v-deep &>.zj-page-fill-scroll {
  783. box-sizing: border-box;
  784. padding-right: 16px;
  785. &>div:nth-child(1) {
  786. margin-top: 20px;
  787. }
  788. }
  789. }
  790. </style>