Lis.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. <template>
  2. <div>
  3. <crumbs :title="title + hospitaiName" linkTo="MedicalTermCDSS">
  4. <el-form :inline="true" class="demo-form-inline">
  5. <el-form-item style="marginBottom: 0px">
  6. <el-button type="text" class="downTemplate" @click="exportModule">导入模板下载</el-button>
  7. <input type="file" name="uploadfile " id="upFile" @change="uploadFile($event)" />
  8. <el-button size="mini" @click="handleMatchData">预匹配</el-button>
  9. <el-button size="mini" @click="importPage" style="margin:0 10px">{{uploadInfo}}</el-button>
  10. <input type="file" name="uploadfile " id="upFileMatch" @change="uploadFileMatch($event)" />
  11. <el-button size="mini" @click="exportData">导出</el-button>
  12. </el-form-item>
  13. </el-form>
  14. </crumbs>
  15. <div class="searchBar">
  16. <div class="searchContent">
  17. <el-form :inline="true" class="demo-form-inline">
  18. <el-form-item class="selectMedicine" label="标准术语状态:">
  19. <el-select size="mini" v-model="filter.status" placeholder="请选择" clearable>
  20. <el-option
  21. v-for="item in statusList"
  22. :label="item.name"
  23. :value="item.id"
  24. :key="item.id"
  25. ></el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item class="selectMedicine" label="匹配状态:">
  29. <el-select size="mini" v-model="filter.match" placeholder="请选择" clearable>
  30. <el-option
  31. v-for="item in matchList"
  32. :label="item.name"
  33. :value="item.id"
  34. :key="item.id"
  35. ></el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="检验套餐:">
  39. <el-input size="mini" v-model="filter.hisName" placeholder="请输入" clearable></el-input>
  40. </el-form-item>
  41. <el-form-item label="检验细项:">
  42. <el-input size="mini" v-model="filter.hisDetailName" placeholder="请输入" clearable></el-input>
  43. </el-form-item>
  44. <el-form-item label="标准检验项:">
  45. <el-input size="mini" v-model="filter.uniqueName" placeholder="请输入" clearable></el-input>
  46. </el-form-item>
  47. <el-form-item class="dododo">
  48. <el-button size="mini" @click="filterDatas">检索</el-button>
  49. <el-button size="mini" type="warning" @click="addRelation">添加关联</el-button>
  50. </el-form-item>
  51. </el-form>
  52. </div>
  53. </div>
  54. <div class="contentsOther">
  55. <el-table :data="list" border style="width: 100%">
  56. <el-table-column :resizable="false" type="index" :index="indexMethod" label="编号" width="80"></el-table-column>
  57. <el-table-column :resizable="false" prop="gmtModified" label="操作时间" width="180"></el-table-column>
  58. <el-table-column :resizable="false" prop="hisName" label="检验套餐" show-overflow-tooltip></el-table-column>
  59. <el-table-column :resizable="false" prop="hisDetailName" label="检验细项" show-overflow-tooltip></el-table-column>
  60. <el-table-column :resizable="false" prop="uniqueName" label="标准检验项" show-overflow-tooltip></el-table-column>
  61. <el-table-column :resizable="false" prop="operate" label="匹配状态">
  62. <template slot-scope="scope">
  63. <span>{{scope.row.isMatch == 0?'未匹配':'已匹配'}}</span>
  64. </template>
  65. </el-table-column>
  66. <el-table-column :resizable="false" prop="operate" label="标准术语状态">
  67. <template slot-scope="scope">
  68. <span>{{scope.row.status == 0?'禁用':'启用'}}</span>
  69. </template>
  70. </el-table-column>
  71. <el-table-column :resizable="false" prop="operate" label="操作">
  72. <template slot-scope="scope">
  73. <el-button @click="modifyRelation(scope.row)" type="text" size="small">修改</el-button>
  74. <span style="margin:0 3px;">|</span>
  75. <el-button
  76. @click="showDelDialog(scope.row.id)"
  77. class="delete"
  78. type="text"
  79. size="small"
  80. >删除</el-button>
  81. </template>
  82. </el-table-column>
  83. </el-table>
  84. <div class="pagination pagepage">
  85. <el-pagination
  86. :current-page.sync="currentPage"
  87. @current-change="currentChange"
  88. background
  89. :page-size="pageSize"
  90. :page-sizes="pageSizeArr"
  91. @size-change="handleSizeChange"
  92. :layout="pageLayout"
  93. :total="total"
  94. ></el-pagination>
  95. </div>
  96. </div>
  97. <LtModal
  98. v-if="modalVisiable"
  99. @func="getMsgFormSon"
  100. :meal="'检验套餐'"
  101. :detail="'检验细项'"
  102. :standard="'检验标准术语'"
  103. :tip="'检验关联'"
  104. :type="1"
  105. :hospitalId="hospitalId"
  106. :data="data"
  107. ></LtModal>
  108. </div>
  109. </template>
  110. <script>
  111. import api from '@api/cdss.js';
  112. import config from '@api/config.js';
  113. import utils from '@api/utils.js';
  114. import LtModal from '@base/LtModal';
  115. export default {
  116. name: 'Lis', //化验大小项和公表维护
  117. data: function() {
  118. return {
  119. list: [],
  120. searched: false,
  121. filter: {
  122. hisName: '', // 检验套餐
  123. hisDetailName: '', //检验细项
  124. uniqueName: '', //标准检验项
  125. match: '',
  126. status:''
  127. },
  128. matchList: [
  129. { id: '', name: '全部' },
  130. { id: 1, name: '已匹配' },
  131. { id: 0, name: '未匹配' },
  132. { id: 2, name: '多项匹配' }
  133. ],
  134. statusList: [
  135. { id: '', name: '全部' },
  136. { id: 1, name: '启用' },
  137. { id: 0, name: '禁用' },
  138. ],
  139. currentPage: 1,
  140. pageSize: config.pageSize,
  141. pageSizeArr: config.pageSizeArr,
  142. pageLayout: config.pageLayout,
  143. total: 0,
  144. uploadInfo: '导入',
  145. title: '检验关联维护 | ',
  146. hospitaiName: '',
  147. hospitalId: '',
  148. modalVisiable: false,
  149. data: {}
  150. };
  151. },
  152. components: {
  153. LtModal
  154. },
  155. created() {
  156. const { data } = this.$route.params;
  157. this.hospitaiName = (data && data.name) || localStorage.getItem('name');
  158. this.hospitalId = (data && data.hospitalId) || localStorage.getItem('hospitalId');
  159. const that = this;
  160. //返回时避免参数未赋值就获取列表
  161. setTimeout(function() {
  162. that.getDataList();
  163. });
  164. // 非首页 编辑页返回 设置 this.currentPage
  165. if (Object.keys(this.$route.params).length !== 0) {
  166. this.currentPage = this.$route.params.currentPage;
  167. }
  168. },
  169. watch: {
  170. filter: {
  171. handler: function() {
  172. this.searched = false;
  173. },
  174. deep: true
  175. }
  176. },
  177. beforeRouteEnter(to, from, next) {
  178. next(vm => {
  179. //const pm = to.param;
  180. Object.assign(vm, to.params);
  181. vm.inCurrentPage = to.params.currentPage;
  182. });
  183. },
  184. methods: {
  185. // 预匹配
  186. handleMatchData() {
  187. let inp = document.getElementById('upFileMatch');
  188. inp.click();
  189. },
  190. // 导入数据
  191. uploadFileMatch(e) {
  192. let fileInfo = e.target.files[0];
  193. let extend = fileInfo.name.substring(fileInfo.name.lastIndexOf('.') + 1);
  194. if (extend != 'xls' && extend != 'xlsx') {
  195. this.$message({ message: '请根据模板进行导入', type: 'error' });
  196. return;
  197. }
  198. e.preventDefault();
  199. let formData = new FormData();
  200. formData.append('file', fileInfo);
  201. formData.append('type', 1);
  202. const header = {
  203. headers: {
  204. 'Content-Type': 'multipart/form-data'
  205. }
  206. };
  207. const loading = this.$loading({
  208. lock: true,
  209. text: '预匹配中...',
  210. spinner: 'el-icon-loading',
  211. background: 'rgba(0, 0, 0, 0.7)'
  212. });
  213. api.dataLisVerify(formData, header).then(res => {
  214. if (res.data.code === '00020007' || res.data.code === '00020004') {
  215. loading.close();
  216. this.$alert(`${res.data.msg}`, '提示', {
  217. confirmButtonText: '确定',
  218. type: 'warning'
  219. })
  220. .then(() => {})
  221. .catch(() => {});
  222. } else {
  223. api.precLisDataMatch(formData, header).then(res => {
  224. setTimeout(() => {
  225. loading.close();
  226. }, 800);
  227. if (res.status === 200) {
  228. utils.downloadExportedData(
  229. res.data,
  230. '检验关联数据(预匹配).xls'
  231. );
  232. }
  233. });
  234. }
  235. });
  236. let inp = document.getElementById('upFileMatch');
  237. inp.value = '';
  238. },
  239. handleSizeChange(val) {
  240. this.pageSize = val;
  241. this.currentPage = utils.getCurrentPage(
  242. this.currentPage,
  243. this.total,
  244. this.pageSize
  245. );
  246. this.getDataList();
  247. },
  248. // 获取列表数据
  249. getDataList(isTurnPage) {
  250. const params = this.getFilterItems(isTurnPage);
  251. this.searched = true;
  252. const loading = this.$loading({
  253. lock: true,
  254. text: 'Loading',
  255. spinner: 'el-icon-loading',
  256. background: 'rgba(0, 0, 0, 0.7)'
  257. });
  258. api.getLisPage(params).then(res => {
  259. loading.close();
  260. if (res.data.code === '0') {
  261. this.list = res.data.data && res.data.data.records;
  262. }
  263. this.total = res.data.data && res.data.data.total;
  264. if (this.inCurrentPage !== undefined) {
  265. this.currentPage = this.inCurrentPage;
  266. this.inCurrentPage = undefined;
  267. }
  268. });
  269. },
  270. // 处理列表请求数据参数
  271. getFilterItems(isTurnPage) {
  272. const { data } = this.$route.params;
  273. //翻页时筛选条件没点确定则清空
  274. if (isTurnPage && !this.searched) {
  275. this.clearFilter();
  276. }
  277. const param = {
  278. current: this.inCurrentPage || this.currentPage,
  279. size: this.pageSize,
  280. hisName: this.filter.hisName.trim(),
  281. uniqueName: this.filter.uniqueName.trim(),
  282. uniqueCode: '',
  283. hisDetailName: this.filter.hisDetailName.trim(),
  284. hospitalId: (data && data.hospitalId) || localStorage.getItem('hospitalId'),
  285. type: 1,
  286. isMatch: this.filter.match,
  287. status: this.filter.status,
  288. };
  289. return param;
  290. },
  291. filterDatas() {
  292. this.currentPage = 1;
  293. this.getDataList();
  294. },
  295. addRelation() {
  296. const pam = this.searched
  297. ? {
  298. currentPage: this.currentPage,
  299. pageSize: this.pageSize,
  300. filter: this.filter
  301. }
  302. : { currentPage: this.currentPage, pageSize: this.pageSize };
  303. this.data = {};
  304. this.showModal();
  305. // this.$router.push({
  306. // name: 'AddLis',
  307. // params: Object.assign(pam, {
  308. // isEdit: false,
  309. // data: { hospitalId: this.hospitalId },
  310. // hospitaiName: this.hospitaiName
  311. // })
  312. // });
  313. },
  314. // 修改诊断关联-跳转至编辑页面
  315. modifyRelation(row) {
  316. const item = Object.assign({}, row);
  317. const pam = this.searched
  318. ? {
  319. currentPage: this.currentPage,
  320. pageSize: this.pageSize,
  321. filter: this.filter
  322. }
  323. : { currentPage: this.currentPage, pageSize: this.pageSize };
  324. // this.$router.push({
  325. // name: 'AddLis',
  326. // params: Object.assign(pam, {
  327. // isEdit: true,
  328. // data: { ...item, hospitalId: this.hospitalId },
  329. // hospitaiName: this.hospitaiName
  330. // })
  331. // });
  332. this.data = item;
  333. this.showModal();
  334. },
  335. currentChange(next) {
  336. this.currentPage = next;
  337. this.getDataList(true);
  338. // if (this.cacheData[next]) { //如果已请求过该页数据,则使用缓存不重复请求
  339. // this.list = this.cacheData[next];
  340. // } else {
  341. // this.getDataList();
  342. // }
  343. },
  344. // 清空搜索参数
  345. clearFilter() {
  346. this.filter = {
  347. hisName: '',
  348. uniqueName: '',
  349. hisDetailName: ''
  350. };
  351. },
  352. indexMethod(index) {
  353. return (this.currentPage - 1) * this.pageSize + index + 1;
  354. },
  355. getTagType(val) {
  356. return val;
  357. },
  358. warning(msg, type) {
  359. this.$message({
  360. showClose: true,
  361. message: msg,
  362. type: type || 'warning'
  363. });
  364. },
  365. showConfirmDialog(msg, resolve) {
  366. this.$alert(msg, '提示', {
  367. confirmButtonText: '删除',
  368. // cancelButtonText: '取消',
  369. // cancelButtonClass: 'cancelBtn',
  370. // confirmButtonClass: 'confirmC',
  371. type: 'warning'
  372. })
  373. .then(() => {
  374. resolve();
  375. })
  376. .catch(() => {});
  377. },
  378. // 删除关联
  379. showDelDialog(id) {
  380. this.showConfirmDialog('是否删除该关联?', () => {
  381. api
  382. .deleteLisRecord({ id: id })
  383. .then(res => {
  384. if (res.data.code == '0') {
  385. if (!this.searched) {
  386. //未点确认时清空搜索条件
  387. this.clearFilter();
  388. }
  389. if (this.list.length == 1) {
  390. //当前在最后一页且只有一条数据时,删除后跳到前一页
  391. this.currentPage =
  392. this.currentPage === 1 ? 1 : this.currentPage - 1;
  393. }
  394. this.getDataList();
  395. this.warning(res.data.msg || '操作成功', 'success');
  396. } else {
  397. this.warning(res.data.msg);
  398. }
  399. })
  400. .catch(error => {
  401. if (error.code === '900010001') {
  402. return false;
  403. }
  404. this.warning(error);
  405. });
  406. });
  407. },
  408. // 导出数据
  409. exportData() {
  410. this.$alert('确定要导出全部检验关联数据吗?', '', {
  411. confirmButtonText: '确定',
  412. // cancelButtonText: '取消',
  413. // cancelButtonClass: 'leftbtn',
  414. // customClass: 'exportBox6',
  415. title: '提示',
  416. type: 'warning'
  417. // beforeClose: (action, instance, done) => {
  418. // if (action === 'confirm') {
  419. // // instance.confirmButtonLoading = true;
  420. // instance.confirmButtonText = '导出中...';
  421. // api.exportLisRecord().then(res => {
  422. // if (res.status === 200) {
  423. // setTimeout(() => {
  424. // utils.downloadExportedData(res.data, '检验数据.xls');
  425. // done();
  426. // }, 1500);
  427. // }
  428. // });
  429. // } else {
  430. // done();
  431. // }
  432. // }
  433. })
  434. .then(() => {
  435. api
  436. .exportLisRecord({
  437. hospitalId: this.hospitalId,
  438. type: 1,
  439. isMatch: this.filter.match
  440. })
  441. .then(res => {
  442. if (res.status === 200) {
  443. this.$message({ message: '导出成功', type: 'success' });
  444. utils.downloadExportedData(res.data, '检验数据.xls');
  445. }
  446. });
  447. })
  448. .catch(() => {
  449. // this.$message({ message: '导出失败', type: 'waring' });
  450. });
  451. },
  452. // 导入模板
  453. exportModule() {
  454. api.exportLisModule({ type: 1 }).then(res => {
  455. if (res.status === 200) {
  456. setTimeout(() => {
  457. utils.downloadExportedData(res.data, '检验导入模板.xls');
  458. }, 1500);
  459. }
  460. });
  461. },
  462. // 点击导入
  463. importPage() {
  464. let inp = document.getElementById('upFile');
  465. inp.click();
  466. },
  467. // 导入数据
  468. uploadFile(e) {
  469. let fileInfo = e.target.files[0];
  470. let extend = fileInfo.name.substring(fileInfo.name.lastIndexOf('.') + 1);
  471. if (extend != 'xls' && extend != 'xlsx') {
  472. this.$message({ message: '请根据模板进行导入', type: 'error' });
  473. return;
  474. }
  475. e.preventDefault();
  476. let formData = new FormData();
  477. formData.append('file', fileInfo);
  478. formData.append('hospitalId', this.hospitalId);
  479. formData.append('type', 1);
  480. formData.append('uesrId', localStorage.getItem('uesrId'));
  481. const header = {
  482. headers: {
  483. 'Content-Type': 'multipart/form-data'
  484. }
  485. };
  486. // this.uploadInfo = '导入中...';
  487. // api.importExcelDataVerify(formData, header).then(res => {
  488. // if (res.data.code === '00020001') {
  489. // this.$confirm(`${res.data.msg}`, '提示', {
  490. // confirmButtonText: '确定',
  491. // cancelButtonText: '取消',
  492. // type: 'warning'
  493. // })
  494. // .then(() => {
  495. // this.importLisRecord(formData, header);
  496. // })
  497. // .catch(() => {
  498. // setTimeout(() => {
  499. // this.uploadInfo = '导入';
  500. // }, 300);
  501. // });
  502. // } else if (res.data.data === true) {
  503. // this.importLisRecord(formData, header);
  504. // } else {
  505. // this.$alert(`${res.data.msg}`, '提示', {
  506. // confirmButtonText: '确定',
  507. // // cancelButtonText: '取消',
  508. // // cancelButtonClass: 'cancelSure',
  509. // // confirmButtonClass: 'sure',
  510. // // customClass: 'exportConfirm',
  511. // type: 'warning'
  512. // })
  513. // .then(() => {})
  514. // .catch(() => {});
  515. // setTimeout(() => {
  516. // this.uploadInfo = '导入';
  517. // }, 300);
  518. // }
  519. // });
  520. this.importLisRecord(formData, header)
  521. //解决上传相同文件不触发change
  522. let inp = document.getElementById('upFile');
  523. inp.value = '';
  524. },
  525. importLisRecord(formData, header) {
  526. api.importLisRecord(formData, header).then(res => {
  527. if (res.headers['content-disposition']) {
  528. this.downloadUrl(res);
  529. } else {
  530. this.$alert(`导入成功`, '提示', {
  531. confirmButtonText: '确定',
  532. // cancelButtonText: '取消',
  533. // cancelButtonClass: 'cancelSure',
  534. // confirmButtonClass: 'sure',
  535. // customClass: 'exportConfirm',
  536. type: 'success'
  537. });
  538. }
  539. // if ((res.data.code === '00020007')) {
  540. // this.$alert(`医院术语字符数超出最大数量,请修改后再试`, '提示', {
  541. // confirmButtonText: '确定',
  542. // // cancelButtonText: '取消',
  543. // // cancelButtonClass: 'cancelSure',
  544. // // confirmButtonClass: 'sure',
  545. // // customClass: 'exportConfirm',
  546. // type: 'warning'
  547. // })
  548. // .then(() => {})
  549. // .catch(() => {});
  550. // this.getDataList(); // 重新获取列表
  551. // setTimeout(() => {
  552. // this.uploadInfo = '导入';
  553. // }, 300);
  554. // } else if (res.data.data === true && res.status === 200) {
  555. // this.$alert(`导入成功`, '提示', {
  556. // confirmButtonText: '确定',
  557. // // cancelButtonText: '取消',
  558. // // cancelButtonClass: 'cancelSure',
  559. // // confirmButtonClass: 'sure',
  560. // // customClass: 'exportConfirm',
  561. // type: 'success'
  562. // })
  563. // .then(() => {})
  564. // .catch(() => {});
  565. // this.getDataList(); // 重新获取列表
  566. // setTimeout(() => {
  567. // this.uploadInfo = '导入';
  568. // }, 300);
  569. // } else {
  570. // this.$alert(`${res.data.msg}`, '提示', {
  571. // confirmButtonText: '确定',
  572. // // cancelButtonText: '取消',
  573. // // cancelButtonClass: 'cancelSure',
  574. // // confirmButtonClass: 'sure',
  575. // // customClass: 'exportConfirm',
  576. // type: 'warning'
  577. // })
  578. // .then(() => {})
  579. // .catch(() => {});
  580. // setTimeout(() => {
  581. // this.uploadInfo = '导入';
  582. // }, 300);
  583. // }
  584. });
  585. },
  586. downloadUrl(res) {
  587. var disposition = res.headers['content-disposition'];
  588. var fileName = decodeURI(
  589. disposition.split('filename=')[1].split(';filename*=')[0]
  590. );
  591. let blob = new Blob([res.data], { type: 'application/.xls' }); //.xls是我和后台约定好的文件格式
  592. let link = document.createElement('a');
  593. link.href = window.URL.createObjectURL(blob);
  594. link.download = fileName;
  595. link.click();
  596. link.remove();
  597. },
  598. /********新增编辑弹窗**********/
  599. showModal() {
  600. this.modalVisiable = true;
  601. },
  602. getMsgFormSon(data) {
  603. if (data == 'close') {
  604. this.modalVisiable = false;
  605. } else {
  606. this.modalVisiable = false;
  607. this.getDataList();
  608. }
  609. }
  610. }
  611. };
  612. </script>
  613. <style lang="less" scoped>
  614. @import '../../../less/admin.less';
  615. .delete {
  616. color: red;
  617. }
  618. .delete:hover {
  619. color: red;
  620. }
  621. .pagination {
  622. min-width: 1010px;
  623. }
  624. .downTemplate {
  625. margin-right: 8px;
  626. span {
  627. color: #02a7f0;
  628. }
  629. }
  630. #upFileMatch {
  631. display: none;
  632. }
  633. #upFile {
  634. display: none !important;
  635. }
  636. .el-message-box {
  637. /deep/.cancelBtn {
  638. background-color: #d7d7d7;
  639. border-color: transparent;
  640. }
  641. /deep/.confirmC {
  642. background-color: #ff545b !important;
  643. border-color: transparent !important;
  644. }
  645. }
  646. .exportBox6 {
  647. /deep/ .el-message-box__btns {
  648. margin-top: 20px;
  649. }
  650. /deep/ .el-message-box__message {
  651. // text-align: center;
  652. }
  653. /deep/.leftbtn {
  654. background-color: #d7d7d7;
  655. border-color: transparent !important;
  656. }
  657. /deep/ .el-message-box__header {
  658. border-bottom: 1px solid #dcdfe6;
  659. }
  660. }
  661. .searchBar {
  662. min-width: 980px;
  663. height: 60px;
  664. display: flex;
  665. justify-content: center;
  666. align-items: center;
  667. background-color: #dee2ea;
  668. z-index: 9999;
  669. padding: 40px 20px 0;
  670. .searchContent {
  671. height: 40px;
  672. flex: 1;
  673. background-color: #fff;
  674. display: flex;
  675. justify-content: flex-end;
  676. float: right;
  677. }
  678. }
  679. .contentsOther {
  680. padding: 0 20px;
  681. }
  682. </style>