AddDiagBase.vue 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336
  1. <!-- 添加常见科室症状 -->
  2. <template>
  3. <div class="AddDiagBaseWrapper" @click="close">
  4. <crumbs
  5. :title="'诊断依据数据维护-'+titleText"
  6. class="topBack"
  7. :param="$route.params"
  8. linkTo="DiagBase"
  9. ></crumbs>
  10. <el-form ref="ruleForm" class="addDepartForm">
  11. <el-form-item class="addDiagName" label="选择添加疾病名称:" >
  12. <input class="searchInput" @focus="focuInput" type="text" v-model = "searchDiagVal">
  13. <span class="searchName" @click="searchDiag">搜索</span>
  14. <ul v-if="showDiagList&&diagList.length > 0" class="itemList diagList" ref="diagList">
  15. <li
  16. v-for="item in diagList"
  17. class="diagItem ellipsis"
  18. :title="item.name"
  19. @click="selectDiag(item)"
  20. :key="item.conceptId">
  21. {{item.name}}
  22. </li>
  23. </ul>
  24. </el-form-item>
  25. <el-form-item class="isRequired" label="已选添加疾病名称:" :class="{colorRed: !disNameExist}">
  26. {{disName}}
  27. </el-form-item>
  28. </el-form>
  29. <div class="symptomList">
  30. <p class="moduleTitle">疾病特征:</p>
  31. <p class="inpTips">序号输入规则“序号+.”后可输入的范围0~99;标准词只能有一个词;化验类型关联只能出现一个词,其他类型可以输入多个词;化验类型可输入结果列,其他类型不可输入</p>
  32. <table class="diagTable">
  33. <tr class="tableTitle">
  34. <td class="FeatureSort">排序</td>
  35. <td class="FeatureType require">类型</td>
  36. <td class="FeatureNumber require">序号</td>
  37. <td class="FeatureStand require">标准词</td>
  38. <td class="FeatureRelate">关联词</td>
  39. <td class="FeatureuniqueName">化验公表项</td>
  40. <td class="FeatureResult">结果</td>
  41. <td class="FeatureOpera"></td>
  42. </tr>
  43. <DisFeatureItem
  44. v-for="(item, index) in disFeatureList"
  45. :key="index"
  46. :item = "item"
  47. :index = "index"
  48. :featureTypeList = 'featureTypeList'
  49. :showDiagList = 'showDiagList'
  50. :searchIndex = 'searchIndex'
  51. :searchFiled = 'searchFiled'
  52. :searchResultList = 'searchResultList'
  53. @handleInp="handleInp($event)"
  54. @clickItem="clickItem($event)"
  55. @addItem ="addItem($event)"
  56. @delItem ="delItem($event)"
  57. @selectSearchItem = "selectSearchItem($event)"
  58. >
  59. </DisFeatureItem>
  60. </table>
  61. <p class="moduleTitle">诊断公式:</p>
  62. <p class="inpTips">可输入数字(0~9);可输入规定汉字:任、一、二、三、四、五、六、七、八、九、十,其余汉字不可输入可输入的符号:“.”、“/”、“()” “+”;确诊还可输入“拟、诊”二字;鉴别诊断的序号不可输入公式中,数据放入后该条件无效;</p>
  63. <table class="diagTable">
  64. <tr class="tableTitle">
  65. <td class="FormulaSort">排序</td>
  66. <td class="FormulaType">类型</td>
  67. <td class="FormulaNumber">公式</td>
  68. <td class="FormulaOpera"></td>
  69. </tr>
  70. <DisFormulaItem
  71. v-for="(item, index) in disFormulaList"
  72. :key="index"
  73. :item = "item"
  74. :index = "index"
  75. :formulaTypeList = 'formulaTypeList'
  76. @handleInp="handleInp($event)"
  77. @clickItem="clickItem($event)"
  78. @addItem ="addItem($event)"
  79. @delItem ="delItem($event)"
  80. >
  81. </DisFormulaItem>
  82. </table>
  83. <div class="btn clearfix">
  84. <div class="btnBox">
  85. <el-button
  86. type="primary"
  87. :disabled = "isReady"
  88. @click="saveTemp"
  89. >临时保存</el-button>
  90. <el-button
  91. type="primary"
  92. :disabled = "isReady"
  93. @click="submitForm('save')"
  94. >校验并保存数据</el-button>
  95. <el-button
  96. type="primary"
  97. :disabled = "hasQuestion != 0"
  98. @click="exportDiagnosticAll"
  99. >导出诊断依据</el-button>
  100. <el-button
  101. type="primary"
  102. :disabled = "hasQuestion != 0"
  103. @click="updateNeo"
  104. >更新图谱</el-button>
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. </template>
  110. <script>
  111. import api from '@api/diagBase.js';
  112. import utils from '@api/utils.js';
  113. import apis from '@api/icss.js';
  114. import Textarea from './Textarea';
  115. import DisFeatureItem from './DisFeatureItem'
  116. import DisFormulaItem from './DisFormulaItem'
  117. export default {
  118. name: 'AddChronicAndIndexRelation',
  119. data() {
  120. return{
  121. id: '', //诊断id
  122. disName:'', //诊断名称
  123. modifier: '', //操作人
  124. titleText: '添加',
  125. diagList: [],
  126. featureTypeList: [],
  127. formulaTypeList: [],
  128. disFeatureList: [
  129. {
  130. type:1,
  131. code:'',
  132. standard:'',
  133. relation:'',
  134. midResult:'',
  135. formula:'',
  136. result:'',
  137. uniqueName:''
  138. }
  139. ], //疾病特征列表
  140. disFeatureListResult:[], //疾病特征列表(保存用)
  141. disFormulaList:[
  142. {
  143. type:92,
  144. code:'',
  145. standard:'',
  146. relation:'',
  147. midResult:'',
  148. result:'',
  149. formula:'',
  150. uniqueName:''
  151. }
  152. ],
  153. disFormulaListResult:[], //诊断公式列表(保存用)
  154. searchDiagVal: '',
  155. isEdit: false,
  156. saveDisable: false ,
  157. hasQuestion: 1, //是否有问题词
  158. disNameExist: true, //诊断名称是否存在
  159. hasNoUniqueName: false, //是否存在没有公表项的化验
  160. isReady:false,
  161. showDiagList: false,
  162. searchIndex: -1,
  163. searchFiled: '',
  164. searchResultList: [],
  165. loading: undefined,
  166. showSearchList: true //是否展示搜索列表(解决引接口回来比较迟输入内容为空搜索内容还存在)
  167. }
  168. },
  169. created(){
  170. this.loading = this.$loading({
  171. lock: true,
  172. text: 'Loading',
  173. spinner: 'el-icon-loading',
  174. background: 'rgba(0, 0, 0, 0.7)'
  175. });
  176. const userLoginDTO = JSON.parse(localStorage.getItem('userLoginDTO'))
  177. this.modifier = userLoginDTO && userLoginDTO.linkman
  178. this.getDropList()
  179. const { isEdit, data } = this.$route.params;
  180. if(isEdit) {
  181. if(isEdit) {
  182. this.isEdit = isEdit;
  183. this.titleText = '修改';
  184. this.disName = data.disName
  185. this.id = data.id
  186. this.disNameExist = data.disNameExist
  187. if(data.disFeature.length) {
  188. this.disFeatureList = data.disFeature
  189. }
  190. if(data.disformula.length) {
  191. this.disFormulaList = data.disformula
  192. }
  193. this.hasQuestion = data.hasQuestion
  194. }
  195. } else {
  196. }
  197. },
  198. mounted(){
  199. this.$nextTick(()=>{
  200. if(Array.isArray(this.$refs.textarea)) {
  201. for(let i=0; i <this.$refs.textarea.length; i++) {
  202. this.$refs.textarea[i].resizeTextarea()
  203. }
  204. }else {
  205. this.$refs.textarea&&this.$refs.textarea.resizeTextarea()
  206. }
  207. this.loading.close()
  208. })
  209. },
  210. watch: {
  211. // searchTagVal(newVal, preVal) {
  212. // if(newVal.trim() == ''){
  213. // this.getTagList()
  214. // }else if(newVal.trim() != preVal.trim()){
  215. // this.getTagList()
  216. // }
  217. // }
  218. },
  219. beforeRouteLeave(to, from, next) {
  220. this.showConfirmDialog('是否离开当前页面?(如果未校验并保存数据/暂存数据时请先保存)',()=>{
  221. next()
  222. })
  223. },
  224. methods: {
  225. getDropList() {
  226. return apis.getKnowledgeEnums().then((res) =>{
  227. if(res.data.code === '0') {
  228. this.featureTypeList = res.data.data.diagnoseFeatureTypeEnum.filter(item => item.key != 0)
  229. this.formulaTypeList = res.data.data.diagnoseTypeEnum
  230. }
  231. })
  232. },
  233. close() {
  234. this.showDiagList = false
  235. this.searchResultList = []
  236. this.diagList = []
  237. },
  238. back(){
  239. this.$router.go(-1);
  240. },
  241. searchDiag() {
  242. if(!this.searchDiagVal) {
  243. return
  244. }
  245. const param = {
  246. "name": this.searchDiagVal,
  247. }
  248. api.diagBaseIndex(param).then((res)=>{
  249. if(res.data.code === '0') {
  250. this.diagList = res.data.data
  251. this.showDiagList = true
  252. }
  253. })
  254. },
  255. selectDiag(item) {
  256. this.disName = item.name
  257. this.searchDiagVal = ''
  258. this.diagList=[]
  259. },
  260. selectSearchItem(event){
  261. const {index, item, searchType} = event
  262. if(searchType === 'FeatureStand') {
  263. const SelectResult = this.getSelectResult(this.disFeatureList[index].standard, item)
  264. this.disFeatureList[index].standard = SelectResult
  265. this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  266. this.searchResultList = []
  267. } else if(searchType === 'FeatureRelate') {
  268. const SelectResult = this.getSelectResult(this.disFeatureList[index].relation, item)
  269. this.disFeatureList[index].relation = SelectResult
  270. this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  271. this.searchResultList = []
  272. }
  273. },
  274. getSelectResult(val,item) {
  275. const index = val.lastIndexOf('、')
  276. if(index < 0) {
  277. return item
  278. } else {
  279. return val.slice(0,index+1)+item
  280. }
  281. },
  282. focuInput() {
  283. this.showDiagList = false
  284. },
  285. clickItemBox(e) {
  286. e.target.children[0].focus()
  287. },
  288. getSearchVal(val) {
  289. const index = val.lastIndexOf('、')
  290. if(index < 0) {
  291. return val
  292. } else {
  293. return val.slice(index+1)
  294. }
  295. },
  296. diagBaseSearch(field, name, type) {
  297. this.showDiagList = true
  298. const param = {
  299. field,
  300. name,
  301. type
  302. }
  303. api.diagBaseSearch(param).then((res)=>{
  304. if(res.data.code == '0'&&this.showSearchList) {
  305. this.searchResultList = res.data.data
  306. } else {
  307. this.searchResultList = []
  308. }
  309. })
  310. },
  311. addItem(event) {
  312. const {index, type } = event
  313. if(type == 1) {
  314. const item = {
  315. type:1,
  316. code:'',
  317. standard:'',
  318. relation:'',
  319. midResult:'',
  320. result:'',
  321. uniqueName:''
  322. }
  323. this.disFeatureList.splice(index+1, 0, item)
  324. }else if(type == 2) {
  325. const item = {
  326. type:92,
  327. code:'',
  328. standard:'',
  329. relation:'',
  330. midResult:'',
  331. result:'',
  332. uniqueName:''
  333. }
  334. this.disFormulaList.splice(index+1, 0, item)
  335. }
  336. },
  337. delItem(event) {
  338. const {index, type} = event
  339. if(type == 1) {
  340. this.disFeatureList.splice(index, 1)
  341. }else if(type == 2) {
  342. this.disFormulaList.splice(index, 1)
  343. }
  344. },
  345. //导入
  346. // uploadClick() {
  347. // let inp = document.getElementById("upFile");
  348. // inp.click();
  349. // },
  350. // uploadFile(e){
  351. // let fileInfo = e.target.files[0];
  352. // e.preventDefault();
  353. // let formData = new FormData();
  354. // formData.append('uploadfile', fileInfo);
  355. // const header = {
  356. // headers:{
  357. // 'Content-Type': 'multipart/form-data'
  358. // }
  359. // }
  360. // api.importDiagnosticBasis(formData,header).then((res)=>{
  361. //
  362. // if(res.data.code==0){
  363. // const data = res.data.data
  364. // this.warning('上传成功','success')
  365. // let feature = data.feature
  366. // let equation = data.equation
  367. // const featureList = []
  368. // const formulaList = []
  369. // if(feature&&feature.length > 0) {
  370. // for(let i = 1; i <feature.length; i++) {
  371. // const item = {}
  372. // item.type = '';
  373. // for (let j = 0; j < this.featureTypeList.length; j++) {
  374. // if(feature[i].type.indexOf(this.featureTypeList[j].name) > -1) {
  375. // item.type = this.featureTypeList[j].key
  376. // break;
  377. // }
  378. // }
  379. // item.code = feature[i].code
  380. // item.standard = feature[i].standard
  381. // item.relation = feature[i].associated
  382. // if(item.type === 4) {
  383. // item.midResult = ''
  384. // } else {
  385. // item.midResult = feature[i].midResult
  386. // }
  387. // featureList.push(item)
  388. // }
  389. // }
  390. // if(equation&&equation.length > 0) {
  391. // for(let i = 1; i <equation.length; i++) {
  392. // const item = {}
  393. // item.type = '';
  394. // for (let j = 0; j < this.formulaTypeList.length; j++) {
  395. // if(equation[i].type.indexOf(this.formulaTypeList[j].name) > -1) {
  396. // item.type = this.formulaTypeList[j].key
  397. // break;
  398. // }
  399. // }
  400. // item.formula = equation[i].associated
  401. // formulaList.push(item)
  402. // }
  403. // }
  404. // this.disFeatureList = featureList
  405. // this.disFormulaList = formulaList
  406. //
  407. // }else{
  408. // /*this.$message({
  409. // dangerouslyUseHTMLString: true,
  410. // message:res.data.msg,
  411. // type:'warning'
  412. // });*/
  413. // this.$alert(res.data.msg,'错误信息',{
  414. // dangerouslyUseHTMLString: true,
  415. // confirmButtonText: '确定',
  416. // callback: action => {
  417. // /*this.$message({
  418. // type: 'info',
  419. // message: `action: ${ action }`
  420. // });*/
  421. // }
  422. // });
  423. // }
  424. // })
  425. // //解决上传相同文件不触发change
  426. // let inp = document.getElementById("upFile");
  427. // inp.value = "";
  428. // },
  429. updateNeo() {
  430. const submitFormResult = this.submitForm('updateNeo')
  431. if(!submitFormResult) {
  432. return
  433. } else {
  434. submitFormResult.then((data) => {
  435. if(data !== false) {
  436. if(this.hasQuestion == 0) {
  437. const param = {
  438. id: this.id,
  439. modifier: this.modifier
  440. }
  441. api.diagBaseUpdateNeo(param).then((res) => {
  442. if(res.data.code == 0) {
  443. this.warning('更新成功', 'success');
  444. } else {
  445. this.warning(res.data.msg)
  446. }
  447. })
  448. } else {
  449. this.warning('更新失败');
  450. }
  451. }
  452. })
  453. }
  454. },
  455. exportDiagnosticAll(){
  456. const submitFormResult = this.submitForm('export')
  457. if(!submitFormResult) {
  458. return
  459. } else {
  460. submitFormResult.then(() => {
  461. if(this.hasQuestion == 0) {
  462. const param = {
  463. diagnoseId: this.id
  464. }
  465. api.exportDiagnosticAll(param).then((res) => {
  466. utils.downloadExportedData(res.data,'诊断依据.xls');
  467. })
  468. }else {
  469. if(!this.hasNoUniqueName) {
  470. this.warning('导出失败');
  471. }
  472. }
  473. }).catch((e)=>{
  474. })
  475. }
  476. },
  477. saveTemp(){
  478. if(!this.disName) {
  479. this.warning('请选择诊断');
  480. return
  481. }
  482. const loading = this.$loading({
  483. lock: true,
  484. text: 'Loading',
  485. spinner: 'el-icon-loading',
  486. background: 'rgba(0, 0, 0, 0.7)'
  487. });
  488. this.hasQuestion= 1
  489. const param = {
  490. disFeature: this.disFeatureList,
  491. disName: this.disName,
  492. disformula: this.disFormulaList,
  493. id: this.id,
  494. modifier: this.modifier
  495. }
  496. api.tempSaveOrUpate(param).then((res)=>{
  497. loading.close()
  498. if(res.data.code === '0') {
  499. this.id = res.data.data
  500. this.warning('临时保存成功','success')
  501. }else {
  502. this.warning(res.data.msg)
  503. }
  504. })
  505. },
  506. submitForm(type) {
  507. if(!this.disName) {
  508. this.warning('请选择诊断');
  509. return
  510. }
  511. this.disFeatureListResult = []
  512. this.disFormulaListResult = []
  513. for(let i = 0; i < this.disFeatureList.length; i++) { //如果有任意一项有值,就检测,所有项都没值,则删掉这条数据
  514. if(this.disFeatureList[i].type || this.disFeatureList[i].code || this.disFeatureList[i].standard || this.disFeatureList[i].relation || this.disFeatureList[i].midResult) {
  515. this.disFeatureListResult.push(this.disFeatureList[i])
  516. }
  517. }
  518. let disFeatureList;
  519. if(this.disFeatureListResult.length) {
  520. disFeatureList = this.disFeatureListResult;
  521. } else {
  522. disFeatureList = [
  523. {
  524. type:'',
  525. code:'',
  526. standard:'',
  527. relation:'',
  528. midResult:'',
  529. result:'',
  530. formula:'',
  531. uniqueName:''
  532. }
  533. ];
  534. }
  535. this.disFeatureList = disFeatureList
  536. // this.showDelDialog()
  537. this.hasQuestion = 1
  538. return this.diagBaseVerifyData(type)
  539. },
  540. diagBaseVerifyData(type) {
  541. //判断诊断依据先判断化验有没有公表项
  542. const labArr= []
  543. for (let i = 0; i < this.disFeatureList.length; i++) {
  544. if(+this.disFeatureList[i].type === 3) {
  545. labArr.push({index: i, mealName: this.disFeatureList[i].standard, itemName: this.disFeatureList[i].relation, uniqueName:''})
  546. }
  547. }
  548. if(type == 'save'){
  549. this.isReady = true
  550. }
  551. if(labArr.length > 0) {
  552. const hasErrorData = this.errorDataVerify()
  553. if(!hasErrorData) {
  554. return false
  555. } else {
  556. this.hasNoUniqueName = false
  557. const labVerifyData = this.labVerifyData(labArr,type)
  558. if(labVerifyData) {
  559. return labVerifyData.then((data) =>{
  560. if(this.hasNoUniqueName||data===false) {
  561. return false
  562. }else {
  563. return this.verifyDiagBase(type)
  564. }
  565. })
  566. }
  567. }
  568. } else {
  569. const hasErrorData = this.errorDataVerify()
  570. if(!hasErrorData) {
  571. return false
  572. } else {
  573. return this.verifyDiagBase(type)
  574. }
  575. }
  576. },
  577. errorDataVerify() {
  578. for(let i = 0; i < this.disFormulaList.length; i++) { //如果有任意一项有值,就检测,所有项都没值,则删掉这条数据
  579. if( this.disFormulaList[i].formula ) {
  580. this.disFormulaListResult.push(this.disFormulaList[i])
  581. }
  582. }
  583. const disFeatureList = this.disFeatureList;
  584. const disFormulaList = this.disFormulaListResult;
  585. let codeErrorNum = 0;
  586. let errStrList = [];
  587. //必填项是否填写
  588. for(let i=0; i < disFeatureList.length; i++) {
  589. if(!disFeatureList[i].type) {
  590. disFeatureList[i].typeNull = "未选择类型"
  591. }
  592. if(!disFeatureList[i].code) {
  593. disFeatureList[i].codeNull = "未填写编码"
  594. }
  595. if(!disFeatureList[i].standard) {
  596. disFeatureList[i].standardNull = "未填写标准词"
  597. }
  598. if(!disFeatureList[i].type||!disFeatureList[i].code||!disFeatureList[i].standard) {
  599. const errStr = "第" + (i+ 1) +"行必填项未填写"
  600. errStrList.push(errStr)
  601. }
  602. let regex =new RegExp(`^${disFeatureList[i].type}\\.(0|[1-9]\\d?)$`,)
  603. if(disFeatureList[i].code &&!regex.test(disFeatureList[i].code)) { //序号和类型不匹配
  604. codeErrorNum++
  605. disFeatureList[i].codeError = "序号和类型不匹配"
  606. const errStr = "疾病特征第" + (i+ 1) +"行序号和类型不匹配"
  607. errStrList.push(errStr)
  608. } else { //序号和类型匹配但序号重复
  609. let codeArr = disFeatureList.filter(item => item.code ===disFeatureList[i].code)
  610. if(codeArr.length > 1) {
  611. codeErrorNum++
  612. disFeatureList[i].codeError = "序号重复"
  613. const errStr = "疾病特征第" + (i+ 1) +"行序号重复"
  614. errStrList.push(errStr)
  615. }
  616. }
  617. //化验项有结果则必须有关联词
  618. if(disFeatureList[i].type == '3' && disFeatureList[i].midResult && !disFeatureList[i].relation) {
  619. disFeatureList[i].relationNull = "未填写关联词"
  620. const errStr = "第" + (i+ 1) +"行化验项数据填写不完整"
  621. errStrList.push(errStr)
  622. }
  623. //导入后判断
  624. // let regexPause = new RegExp(`、`) //判断标准词是否有顿号
  625. // if(disFeatureList[i].standard &&regexPause.test(disFeatureList[i].standard)) {
  626. // disFeatureList[i].verifyStandard ='数据异常'
  627. // const errStr = "疾病特征第" + (i+ 1) +"行标准词数据异常"
  628. // errStrList.push(errStr)
  629. // }
  630. // if(disFeatureList[i].type == '3'&&regexPause.test(disFeatureList[i].relation)) {
  631. // disFeatureList[i].verifyRelation ='数据异常'
  632. // const errStr = "疾病特征第" + (i+ 1) +"行化验关联词数据异常"
  633. // errStrList.push(errStr)
  634. // }
  635. //导入后判断
  636. if(disFeatureList[i].type == '3') {
  637. disFeatureList[i].verifyRelation = ""
  638. disFeatureList[i].verifyResult = ""
  639. if(!disFeatureList[i].midResult ) {//化验项下面诊断公式如果有用到,判断是否填写结果项
  640. const regex2 = new RegExp(`(?<=\\D|\\b)${disFeatureList[i].code.replace('.','\\.')}(?=\\D|\\b)`) //序号+前面是单词边界或者是非数字+后面是单词边界或者是非数字
  641. // const regex2 = new RegExp(`、\\s*、{1,}`)
  642. // const regex2 = new RegExp(`([^0-9]|\\s{0,1})${disFeatureList[i].code}([^0-9]|\\s{0,1})`)
  643. let hasError = disFormulaList.find(item => {return regex2.test(item.formula)})
  644. if(hasError) {
  645. if(!disFeatureList[i].relation) {
  646. disFeatureList[i].verifyRelation = "数据异常"
  647. }
  648. disFeatureList[i].verifyResult = "数据异常"
  649. const errStr = "第" + (i+ 1) +"行化验项数据异常"
  650. errStrList.push(errStr)
  651. }
  652. }
  653. }
  654. if(disFeatureList[i].type == '4' && !disFeatureList[i].relation ) { //辅检项下面诊断公式如果有用到,判断是否填写结果项(辅检结果是填在关联词列)
  655. const regex2 = new RegExp(`(?<=\\D|\\b)${disFeatureList[i].code.replace('.','\\.')}(?=\\D|\\b)`)
  656. let hasError = disFormulaList.find(item => {return regex2.test(item.formula)})
  657. if(hasError) {
  658. disFeatureList[i].verifyRelation = "数据异常"
  659. const errStr = "第" + (i+ 1) +"行辅捡项数据异常"
  660. errStrList.push(errStr)
  661. }
  662. }
  663. let regex1 =new RegExp(`、\\s*、{1,}|^、|、$`)
  664. if(disFeatureList[i].relation &&regex1.test(disFeatureList[i].relation)) { //不能输入连续的、,前后也不能是、
  665. disFeatureList[i].verifyRelation ='数据异常'
  666. const errStr = "疾病特征第" + (i+ 1) +"行数据异常"
  667. errStrList.push(errStr)
  668. }
  669. if(disFeatureList[i].midResult &&regex1.test(disFeatureList[i].midResult)) {
  670. disFeatureList[i].verifyResult ='数据异常'
  671. const errStr = "疾病特征第" + (i+ 1) +"行数据异常"
  672. errStrList.push(errStr)
  673. }
  674. }
  675. this.disFeatureList = JSON.parse(JSON.stringify(disFeatureList))
  676. let formulaListErrNum = 0
  677. for(let i=0; i < disFormulaList.length; i++) {
  678. if(disFormulaList[i].type&&!disFormulaList[i].formula ) {
  679. disFormulaList[i].verifyFormula = "诊断公式不能为空"
  680. formulaListErrNum++;
  681. const errStr = "诊断公式第" + (i+ 1) +"行诊断公式不能为空"
  682. errStrList.push(errStr)
  683. } else if(disFormulaList[i].formula&&!disFormulaList[i].type) {
  684. disFormulaList[i].verifyType = "诊断类型不能为空"
  685. const errStr = "诊断公式第" + (i+ 1) +"行诊断类型不能为空"
  686. errStrList.push(errStr)
  687. formulaListErrNum++;
  688. }
  689. //导入后判断
  690. // if(disFormulaList[i].type == 91) { //确诊中有没有包含其他不可输入内容
  691. // let regexDisFormula = /[^\u4EFB\u4E00\u4E8C\u4E09\u56DB\u4E94\u516D\u4E03\u516B\u4E5D\u5341\u62df\u8bca0-9\/\.+\(\)\(\)]/g
  692. // if(regexDisFormula.test(disFormulaList[i].formula)) {
  693. // disFormulaList[i].verifyFormula = "公式格式错误"
  694. // const errStr = "诊断公式第" + (i+ 1) +"行公式格式错误,"
  695. // errStrList.push(errStr)
  696. // formulaListErrNum++;
  697. // }
  698. // } else { //其他诊断中有没有包含其他不可输入内容
  699. // //计算公式只能输入以下内容: 任、一、二、三、四、五、六、七、八、九、十、0-9、/、.、(、)、(、)
  700. // let regexDisFormula = /[^\u4EFB\u4E00\u4E8C\u4E09\u56DB\u4E94\u516D\u4E03\u516B\u4E5D\u53410-9\/\.+\(\)\(\)]/g
  701. // if(regexDisFormula.test(disFormulaList[i].formula)) {
  702. // disFormulaList[i].verifyFormula = "公式格式错误"
  703. // const errStr = "诊断公式第" + (i+ 1) +"行公式格式错误"
  704. // errStrList.push(errStr)
  705. // formulaListErrNum++;
  706. // }
  707. // }
  708. //导入后判断
  709. if(disFormulaList[i].type == 91 && disFormulaList[i].formula.indexOf("拟诊") > -1) { //确诊项如果有拟诊这两个字,判断公式列表中有没有拟诊这项
  710. const noError = disFormulaList.filter(item => item.type == 92).length > 0
  711. if(!noError) {
  712. disFormulaList[i].verifyFormula = "公式格式错误"
  713. const errStr = "诊断公式第" + (i+ 1) +"行公式格式错误"
  714. errStrList.push(errStr)
  715. formulaListErrNum++;
  716. }
  717. }
  718. }
  719. if(disFormulaList.length) {
  720. this.disFormulaList = JSON.parse(JSON.stringify(disFormulaList))
  721. }
  722. let errorStr =''
  723. for(let i = 0; i <errStrList.length; i++) {
  724. errorStr += '<p>'+errStrList[i]+'</p>'
  725. }
  726. if(errStrList.length >0 ||codeErrorNum > 0 ||formulaListErrNum > 0) {
  727. this.disFeatureList = JSON.parse(JSON.stringify(disFeatureList))
  728. this.errorTips(errorStr)
  729. this.isReady=false
  730. return false
  731. }
  732. return true
  733. },
  734. labVerifyData(labArr,type) {
  735. const labArrParam = {
  736. lisMappingSearchList : labArr
  737. }
  738. const loading = this.$loading({
  739. lock: true,
  740. text: 'Loading',
  741. spinner: 'el-icon-loading',
  742. background: 'rgba(0, 0, 0, 0.7)'
  743. });
  744. return api.getUniqueNameWithList(labArrParam).then((res) => {
  745. this.isReady=false
  746. loading.close();
  747. if(res.data.code === '0') {
  748. const data = res.data.data
  749. let errorStr = ''
  750. for (let i = 0; i < data.length; i++ ) {
  751. if(!data[i].uniqueName) { //判断是否存在公表项
  752. if(!this.hasNoUniqueName) {
  753. this.hasNoUniqueName = true
  754. }
  755. errorStr +=`<p>第${+data[i].index+1}行化验公表项不存在</p>`
  756. this.disFeatureListResult[data[i].index].verifyUnique="公表项不存在"
  757. this.disFeatureListResult[data[i].index].uniqueName=""
  758. } else {
  759. this.disFeatureListResult[data[i].index].verifyUnique=""
  760. }
  761. this.disFeatureListResult[data[i].index].uniqueName = data[i].uniqueName
  762. if(data[i].uniqueName) { //有公表项和结果,则将公表项和结果拼接起来,结果用、分隔
  763. if(this.disFeatureListResult[data[i].index].midResult) {
  764. let midResult = this.disFeatureListResult[data[i].index].midResult.replace(' ', '').split('、')
  765. for (let j = 0; j < midResult.length; j++) {
  766. if(midResult[j]) {
  767. midResult[j] = data[i].uniqueName+midResult[j]
  768. }
  769. }
  770. this.disFeatureListResult[data[i].index].result = midResult.join('、')
  771. }
  772. }
  773. }
  774. this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureListResult))
  775. this.disFeatureListResult = JSON.parse(JSON.stringify(this.disFeatureListResult))
  776. if(errorStr) {
  777. return this.errorTips(errorStr);
  778. }
  779. } else {
  780. this.warning(res.data.msg)
  781. return false
  782. }
  783. }).catch(()=>{ this.isReady=false;loading.close()})
  784. },
  785. verifyDiagBase(type) {
  786. const param = {
  787. disFeature: this.disFeatureListResult,
  788. disName: this.disName,
  789. disformula: this.disFormulaListResult,
  790. id: this.id,
  791. modifier: this.modifier
  792. }
  793. const loading = this.$loading({
  794. lock: true,
  795. text: 'Loading',
  796. spinner: 'el-icon-loading',
  797. background: 'rgba(0, 0, 0, 0.7)'
  798. });
  799. const diagBaseVerifyDataResult = api.diagBaseVerifyData(param)
  800. return diagBaseVerifyDataResult.then((res) => {
  801. if(+res.data.code === 0) {
  802. const data = res.data.data
  803. this.isReady=false
  804. if(type =='save') {
  805. if(data.hasQuestion) {
  806. this.warning('校验完成请先调整错误数据,该数据已保存')
  807. } else {
  808. this.warning('校验成功', 'success')
  809. }
  810. }
  811. this.id = data.id
  812. this.disNameExist = data.disNameExist
  813. this.disFeatureList = data.disFeature
  814. if(data.disformula.length) {
  815. this.disFormulaList = data.disformula
  816. }else {
  817. this.disFormulaList = [
  818. {
  819. type:92,
  820. code:'',
  821. standard:'',
  822. relation:'',
  823. result:'',
  824. midResult:'',
  825. formula:'',
  826. uniqueName:''
  827. }
  828. ]
  829. }
  830. this.hasQuestion = data.hasQuestion
  831. } else {
  832. this.hasQuestion = 1
  833. this.warning(res.data.msg)
  834. }
  835. loading.close()
  836. }).catch(()=>{ this.hasQuestion = false; this.isReady=false; loading.close()})
  837. },
  838. showConfirmDialog(msg, resolve) {
  839. this.$alert(msg, '提示', {
  840. confirmButtonText: '确定',
  841. type: 'warning'
  842. }).then(() => {
  843. resolve();
  844. }).catch(() => {});
  845. },
  846. // handleInp(index,e,type,itemType){ //分组不能输入负数
  847. handleInp(event){
  848. const {index,e,type,itemType} = event
  849. const value = e
  850. if(type === 'FeatureNumber') { //序号只能输入数字和.
  851. this.$nextTick(() => {
  852. this.disFeatureList[index].code = value.replace(/[^\d.]/g,'')
  853. })
  854. } else if(type==='FeatureStand') { //标准词不能输入顿号
  855. this.$nextTick(() => {
  856. const resultVal = value.replace(/、/g,'').replace(' ','')
  857. this.disFeatureList[index].standard = resultVal
  858. if(resultVal) {
  859. const searchVal = this.getSearchVal(resultVal)
  860. if(searchVal) {
  861. this.showSearchList = true
  862. this.searchIndex = index
  863. this.searchFiled = 'FeatureStand'
  864. this.diagBaseSearch(2,searchVal,itemType)
  865. } else {
  866. this.showSearchList = false
  867. this.searchResultList = []
  868. }
  869. } else {
  870. this.showSearchList = false
  871. this.searchResultList = []
  872. }
  873. })
  874. // this.disFeatureList[index].standard = value.replace(/、/g,'')
  875. } else if ( type === 'FormulaNumber') {
  876. //计算公式确诊只能输入以下内容: 任、一、二、三、四、五、六、七、八、九、十、拟、诊、0-9、/、.、(、)、(、)
  877. if(itemType == 91) {
  878. this.$nextTick(() => {
  879. this.disFormulaList[index].formula = value.replace(/[^\u4EFB\u4E00\u4E8C\u4E09\u56DB\u4E94\u516D\u4E03\u516B\u4E5D\u5341\u62df\u8bca0-9\/\.+\(\)\(\)]/g,'').replace(/[\(]/g, '(').replace(/[\)]/g, ')').replace(/' '/g, '')
  880. })
  881. } else { //计算公式其他只能输入以下内容: 任、一、二、三、四、五、六、七、八、九、十、0-9、/、.、(、)、(、)
  882. //计算公式只能输入以下内容: 任、一、二、三、四、五、六、七、八、九、十、0-9、/、.、(、)、(、)
  883. this.$nextTick(() => {
  884. this.disFormulaList[index].formula = value.replace(/[^\u4EFB\u4E00\u4E8C\u4E09\u56DB\u4E94\u516D\u4E03\u516B\u4E5D\u53410-9\/\.+\(\)\(\)]/g,'').replace(/[\(]/g, '(').replace(/[\)]/g, ')').replace(/' '/g, '')
  885. })
  886. }
  887. } else if ( type === 'FeatureRelate') {
  888. let resultVal;
  889. if(itemType == 3) {
  890. resultVal = value.replace(/、/g,'').replace(' ','')
  891. } else {
  892. resultVal = value.replace(' ','')
  893. }
  894. this.$nextTick(() => {
  895. this.disFeatureList[index].relation = resultVal
  896. })
  897. if(resultVal) {
  898. const searchVal = this.getSearchVal(resultVal)
  899. if(searchVal) {
  900. this.showSearchList = true
  901. this.searchIndex = index
  902. this.searchFiled = 'FeatureRelate'
  903. this.diagBaseSearch(3,searchVal,itemType)
  904. } else {
  905. this.showSearchList = false
  906. this.searchResultList = []
  907. }
  908. } else {
  909. this.showSearchList = false
  910. this.searchResultList = []
  911. }
  912. }
  913. // const item = this.selectedIndexList[index].indexDesc;
  914. // e.target.value = value.replace(/[^\d]/g,'');
  915. // this.selectedIndexList[index].indexDesc = item.replace(/[^\d]/g,'');
  916. },
  917. clickItem(e) {
  918. const {index, type} = e
  919. this.showDiagList = false
  920. switch(type) {
  921. case 'FeatureType':
  922. this.disFeatureList[index].typeNull = ''
  923. this.disFeatureList[index].code = ''
  924. this.disFeatureList[index].standard = ''
  925. this.disFeatureList[index].relation = ''
  926. this.disFeatureList[index].midResult = ''
  927. this.disFeatureList[index].result = ''
  928. this.disFeatureList[index].formula = ''
  929. this.disFeatureList[index].uniqueName = ''
  930. return this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  931. case 'FeatureNumber':
  932. this.disFeatureList[index].codeNull = ''
  933. this.disFeatureList[index].verifyCode = ''
  934. this.disFeatureList[index].codeError = ''
  935. return this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  936. case 'FeatureStand':
  937. this.disFeatureList[index].verifyStandard =''
  938. this.disFeatureList[index].standardNull =''
  939. return this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  940. case 'FeatureRelate':
  941. this.disFeatureList[index].verifyRelation =''
  942. this.disFeatureList[index].relationNull =''
  943. return this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  944. case 'FeatureResult':
  945. this.disFeatureList[index].verifyResult =''
  946. return this.disFeatureList = JSON.parse(JSON.stringify(this.disFeatureList))
  947. case 'FormulaType':
  948. this.disFormulaList[index].verifyType =''
  949. this.disFormulaList[index].formula =''
  950. return this.disFormulaList = JSON.parse(JSON.stringify(this.disFormulaList))
  951. case 'FormulaNumber':
  952. this.disFormulaList[index].verifyFormula =''
  953. return this.disFormulaList = JSON.parse(JSON.stringify(this.disFormulaList))
  954. }
  955. },
  956. warning(msg, type,time) {
  957. this.$message({
  958. showClose: true,
  959. message: msg,
  960. type: type || 'warning',
  961. duration:time || '3000'
  962. })
  963. },
  964. errorTips(errorStr) {
  965. this.$alert(errorStr,'错误信息',{
  966. dangerouslyUseHTMLString: true,
  967. confirmButtonText: '确定',
  968. callback: action => {
  969. /*this.$message({
  970. type: 'info',
  971. message: `action: ${ action }`
  972. });*/
  973. }
  974. });
  975. return
  976. }
  977. },
  978. components: {
  979. Textarea,
  980. DisFeatureItem,
  981. DisFormulaItem
  982. }
  983. }
  984. </script>
  985. <style lang="less">
  986. @import '../../less/common.less';
  987. .AddDiagBaseWrapper {
  988. font-size: 14px;
  989. table,tr,td {
  990. list-style: none;
  991. }
  992. color: #606266;
  993. .topBack {
  994. top: 0;
  995. }
  996. .groupTitle {
  997. background-color: #fff;
  998. height: 40px;
  999. line-height: 40px;
  1000. padding-left: 20px;
  1001. }
  1002. .searchInput, .searchName {
  1003. display: inline-block;
  1004. height: 32px;
  1005. line-height: 32px;
  1006. border: 1px solid #a9a9a9;
  1007. margin: 0px 0 0 0;
  1008. padding: 0 5px;
  1009. float: left;
  1010. margin-top: 4px;
  1011. }
  1012. .isRequired .el-form-item__label::before {
  1013. content: '*';
  1014. color: red;
  1015. }
  1016. .searchName {
  1017. border-left: none;
  1018. cursor: pointer;
  1019. font-size: 16px;
  1020. padding: 0 14px;
  1021. }
  1022. .itemList {
  1023. position: absolute;
  1024. background: #fff;
  1025. width: 162px;
  1026. max-height: 150px;
  1027. border: 1px solid #a9a9a9;
  1028. left: 138px;
  1029. top: 37px;
  1030. z-index: 2;
  1031. overflow-y: auto;
  1032. }
  1033. .diagItem {
  1034. padding: 0 5px;
  1035. height: 30px;
  1036. line-height: 30px;
  1037. font-size: 14px;
  1038. cursor: pointer;
  1039. }
  1040. .diagItem:hover {
  1041. background: #f5f7fa;
  1042. }
  1043. .addDepartForm {
  1044. position: relative;
  1045. background-color: #fff;
  1046. padding: 20px;
  1047. margin: 70px 20px -35px 20px;
  1048. }
  1049. .addDiagName {
  1050. position: relative;
  1051. }
  1052. .symptomList {
  1053. position: relative;
  1054. background-color: #fff;
  1055. padding: 0px 20px 100px 20px;
  1056. margin: 0px 20px 40px 20px;
  1057. min-height: 400px;
  1058. }
  1059. .diagTable {
  1060. width: 100%;
  1061. border-collapse: collapse;
  1062. margin-bottom: 20px;
  1063. tr {
  1064. td {
  1065. /deep/textarea::-webkit-scrollbar{
  1066. display: none;
  1067. }
  1068. position: relative;
  1069. border: 1px solid #a9a9a9;
  1070. text-align: center;
  1071. /deep/textarea::-webkit-scrollbar {
  1072. display: none;
  1073. }
  1074. }
  1075. .FormulaOpera, .FeatureOpera{
  1076. background: #fff;
  1077. border: none;
  1078. text-align: left;
  1079. padding-left: 30px;
  1080. }
  1081. /deep/.el-textarea__inner {
  1082. width: 100%;
  1083. line-height: 20px;
  1084. resize:none;
  1085. border: none;
  1086. border-radius: 0;
  1087. text-align: center;
  1088. }
  1089. }
  1090. .selectedContent {
  1091. width: 25%;
  1092. }
  1093. .selectedContentGroup {
  1094. width: 55%;
  1095. }
  1096. .selectedContentOpera {
  1097. width: 20%;
  1098. }
  1099. }
  1100. .groupInput {
  1101. text-align: center;
  1102. color: #606266;
  1103. width: 80%;
  1104. }
  1105. .groupTextarea {
  1106. text-align: center;
  1107. color: #606266;
  1108. width: 100%;
  1109. }
  1110. .btn {
  1111. position: absolute;
  1112. background-color: #fff;
  1113. width: 100%;
  1114. margin: 20px 0;
  1115. height: 40px;
  1116. bottom: 0px;
  1117. right: 0px;
  1118. .btnBox {
  1119. position: absolute;
  1120. right: 0px;
  1121. }
  1122. .el-button {
  1123. margin-right: 20px;
  1124. }
  1125. }
  1126. .tableTitle{
  1127. background: rgba(239,243,249,1);
  1128. height: 40px;
  1129. }
  1130. .require::after{
  1131. content:"*";
  1132. color: red;
  1133. }
  1134. .borderRed {
  1135. border: 3px solid red ;
  1136. box-sizing: border-box;
  1137. }
  1138. .colorRed {
  1139. color: red;
  1140. }
  1141. .FeatureSort {
  1142. width: 5%;
  1143. }
  1144. .FeatureType {
  1145. width: 7%;
  1146. padding: 0 5px;
  1147. }
  1148. .FeatureNumber {
  1149. width: 8%;
  1150. }
  1151. .FeatureStand {
  1152. width: 20%;
  1153. }
  1154. .FeatureRelate {
  1155. width: 30%;
  1156. }
  1157. .FeatureuniqueName {
  1158. width: 10%;
  1159. }
  1160. .FeatureResult {
  1161. width: 10%;
  1162. }
  1163. .FeatureOpera{
  1164. width: 10%;
  1165. }
  1166. .FormulaSort{
  1167. width: 5%;
  1168. }
  1169. .FormulaType{
  1170. width: 7%;
  1171. padding: 0 5px;
  1172. }
  1173. .FormulaNumber{
  1174. width: 78%;
  1175. }
  1176. .FormulaOpera{
  1177. width: 10%;
  1178. }
  1179. .btnOpera {
  1180. width:16px;
  1181. height:16px;
  1182. background:rgba(176,190,197,1);
  1183. border-radius: 50%;
  1184. color: #fff;
  1185. line-height: 16px;
  1186. text-align: center;
  1187. }
  1188. /deep/.el-input--mini .el-input__inner {
  1189. width: 80px;
  1190. }
  1191. /deep/ .is-disabled {
  1192. background: #ECECEC;
  1193. color: #AAAAAA;
  1194. border: none;
  1195. }
  1196. .selectType {
  1197. input {
  1198. border: 3px solid red;
  1199. }
  1200. input:hover {
  1201. border: 3px solid red;
  1202. }
  1203. }
  1204. .moduleTitle {
  1205. margin: 0 0 10px 0;
  1206. font-weight: 600;
  1207. }
  1208. .inpDisabled{
  1209. background: #ECECEC;
  1210. cursor: not-allowed;
  1211. textarea {
  1212. background: #ECECEC;
  1213. color: #AAAAAA;
  1214. border: none;
  1215. cursor: not-allowed;
  1216. height: 100%;
  1217. }
  1218. }
  1219. .inpTips {
  1220. font-size: 14px;
  1221. color: red;
  1222. margin-bottom: 10px;
  1223. }
  1224. #upFile{
  1225. display: none
  1226. }
  1227. .disableDiv {
  1228. background: rgb(236, 236, 236);
  1229. box-sizing: border-box;
  1230. cursor: not-allowed;
  1231. font-size: 14px;
  1232. line-height: 20px;
  1233. padding: 5px 0;
  1234. min-height: 30px;
  1235. }
  1236. .searchItemBox{
  1237. position: relative;
  1238. bottom: 0px;
  1239. }
  1240. .searchItemList {
  1241. position: absolute;
  1242. border: 1px solid #a9a9a9;
  1243. box-sizing: border-box;
  1244. top: 4px;
  1245. z-index: 2;
  1246. width: 100%;
  1247. max-height: 150px;
  1248. overflow: auto;
  1249. background: #fff;
  1250. margin: 0 0 20px 0;
  1251. }
  1252. }
  1253. </style>