AddDiagBase.vue 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804
  1. <template>
  2. <div style="min-height:100%" ref="viewBox">
  3. <crumbs :title="title" :param="$route.params" linkTo="ZskDiagBase"></crumbs>
  4. <div class="contents">
  5. <el-form
  6. :inline="true"
  7. ref="form"
  8. :label-position="labelPosition"
  9. class="add-new-form"
  10. label-width="100px"
  11. :model="form"
  12. :rules="rules"
  13. >
  14. <div class="content">
  15. <el-form-item label="疾病名称:" class="item" prop="conceptId" :rules="rules.conceptId">
  16. <el-select
  17. clearable
  18. remote
  19. filterable
  20. :remote-method="searchDiag"
  21. v-model.trim="form.conceptId"
  22. >
  23. <el-option
  24. v-for="item in conceptList"
  25. :key="item.conceptId"
  26. :label="item.conceptName"
  27. :value="item.conceptId"
  28. ></el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="诊断依据描述:" prop="description" class="item">
  32. <el-input
  33. class="inps"
  34. maxlength="200"
  35. placeholder="请输入诊断依据描述"
  36. v-model.trim="form.description"
  37. ></el-input>
  38. </el-form-item>
  39. </div>
  40. <div class="content content-2">
  41. <div class="content-2-header">
  42. <p class="title1">
  43. <span class="star">*</span>诊断依据内容
  44. </p>
  45. <p class="title2">注:1、选择诊断依据类型后才能展示基础依据类型。2、医学内容可输入升高、降低、阴性、阳性等~</p>
  46. </div>
  47. <el-table
  48. size="mini"
  49. :span-method="dataSpanMethod"
  50. :data="form.klDiagnoseTypeVO"
  51. border
  52. ref="tableList"
  53. style="min-height: 200px"
  54. height="calc(100vh - 450px)"
  55. :header-cell-style="{background:'#E3EAF4'}"
  56. >
  57. <el-table-column label="依据" width="100" fixed>
  58. <template slot="header" slot-scope="scope">
  59. <span class="name">依据</span>
  60. </template>
  61. <template slot-scope="scope">
  62. <el-form-item>
  63. <img
  64. src="../../images/icon-copy.png"
  65. height="18"
  66. width="18"
  67. class="icon"
  68. @click="copyDiag(scope.row.depart_id)"
  69. />
  70. <img
  71. src="../../images/icon-add.png"
  72. height="18"
  73. width="18"
  74. class="icon"
  75. @click="addDiag(scope.row.depart_id)"
  76. />
  77. <img
  78. src="../../images/icon-delete.png"
  79. height="18"
  80. width="18"
  81. class="icon"
  82. @click="delDiag(scope.row.depart_id,scope.$index)"
  83. v-show="dest.length>1"
  84. />
  85. </el-form-item>
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="诊断依据类型" width="130">
  89. <template slot="header" slot-scope="scope">
  90. <span class="star">*</span>
  91. <span class="name">诊断依据类型</span>
  92. </template>
  93. <template slot-scope="scope">
  94. <el-form-item
  95. class="is-request"
  96. :prop="'klDiagnoseTypeVO.'+scope.$index+'.conditionType'"
  97. :rules="rules.conditionType"
  98. >
  99. <el-select
  100. ref="aa"
  101. v-model="form.klDiagnoseTypeVO[scope.$index].conditionType"
  102. @change="(val)=>basTypeChange(val,scope.$index)"
  103. >
  104. <el-option
  105. v-for="item in baseTypes"
  106. :key="item.ruleType"
  107. :label="item.name"
  108. :value="item.ruleType"
  109. ></el-option>
  110. </el-select>
  111. </el-form-item>
  112. </template>
  113. </el-table-column>
  114. <el-table-column label="组" width="130">
  115. <template slot="header" slot-scope="scope">
  116. <span class="star">*</span>
  117. <span class="name">组</span>
  118. </template>
  119. <template slot-scope="scope">
  120. <el-form-item>
  121. <img
  122. src="../../images/icon-add.png"
  123. height="18"
  124. width="18"
  125. class="icon"
  126. @click="addGroup(scope.$index)"
  127. />
  128. <img
  129. src="../../images/icon-delete.png"
  130. height="18"
  131. width="18"
  132. class="icon"
  133. @click="delGroup(scope.row.depart_id,scope.$index)"
  134. v-show="isMax(scope.row.depart_id)"
  135. />
  136. </el-form-item>
  137. </template>
  138. </el-table-column>
  139. <el-table-column label="符合条件数量" width="150">
  140. <template slot="header" slot-scope="scope">
  141. <span class="star">*</span>
  142. <span class="name">符合条件数量</span>
  143. </template>
  144. <template slot-scope="scope">
  145. <el-form-item
  146. :prop="'klDiagnoseTypeVO.'+scope.$index+'.groupVO.'+0+'.fitNo'"
  147. :rules="rules.fitNo"
  148. >
  149. <el-select v-model="scope.row.groupVO[0].fitNo">
  150. <el-option
  151. v-for="item in numArr[scope.$index].num[0]"
  152. :key="item.id"
  153. :label="item.name"
  154. :value="item.id"
  155. ></el-option>
  156. </el-select>
  157. </el-form-item>
  158. </template>
  159. </el-table-column>
  160. <el-table-column v-for="(v,i) in columns" :width="v.width" :key="i">
  161. <template slot="header" slot-scope="scope">
  162. <span class="star" v-if="v.istar">*</span>
  163. <span class="name">{{v.title}}</span>
  164. </template>
  165. <template slot-scope="scope">
  166. <div v-for="(item,index) in scope.row.groupVO" :key="index">
  167. <div v-for="(items,i) in item.klDiagnoseDetail" :key="i">
  168. <div v-if="v.title == '基础依据'">
  169. <el-form-item>
  170. <img
  171. src="../../images/icon-add.png"
  172. height="18"
  173. width="18"
  174. class="icon"
  175. @click="addRule(scope.row,scope.$index,index,i)"
  176. />
  177. <img
  178. src="../../images/icon-delete.png"
  179. height="18"
  180. width="18"
  181. class="icon"
  182. @click="delRule(scope.row,scope.$index,index,i)"
  183. v-show="item.klDiagnoseDetail.length>1"
  184. />
  185. </el-form-item>
  186. </div>
  187. <div class="box-2" v-if="v.title == '基础依据名称'">
  188. <el-form-item
  189. :prop="'klDiagnoseTypeVO.' +
  190. scope.$index +
  191. '.groupVO.' +
  192. index +
  193. '.klDiagnoseDetail.'+i+'.basDescription'"
  194. :rules="rules.basDescription"
  195. >
  196. <el-input
  197. class="inp-name"
  198. placeholder="请输入基础依据名称"
  199. maxlength="100"
  200. v-model.trim="items.basDescription"
  201. ></el-input>
  202. </el-form-item>
  203. </div>
  204. <div class="box-2" v-if="v.title == '基础依据类型'">
  205. <el-form-item
  206. :prop="'klDiagnoseTypeVO.' +
  207. scope.$index +
  208. '.groupVO.' +
  209. index +
  210. '.klDiagnoseDetail.'+i+'.basType'"
  211. :rules="rules.basType"
  212. >
  213. <el-select
  214. v-model="items.basType"
  215. @change="(val)=>baseTermTypeChange(val,scope.$index,index,i)"
  216. >
  217. <el-option
  218. v-for="item in baseTermTypeList"
  219. :key="item.id"
  220. :label="item.name"
  221. :value="item.type"
  222. ></el-option>
  223. </el-select>
  224. </el-form-item>
  225. </div>
  226. <el-form-item
  227. :prop="'klDiagnoseTypeVO.' +
  228. scope.$index +
  229. '.groupVO.' +
  230. index +
  231. '.klDiagnoseDetail.'+i+'.basLibType'"
  232. v-if="!items.basNameType && v.title == '基础依据术语类型'"
  233. :rules="rules.basLibType"
  234. >
  235. <el-select
  236. v-model="items.basLibType"
  237. @change="(val)=>basLibTypeChange(val,scope.$index,index,i)"
  238. >
  239. <el-option
  240. v-for="item in items.basLibTypeList"
  241. :key="item.id"
  242. :label="item.name"
  243. :value="Number(item.code)"
  244. ></el-option>
  245. </el-select>
  246. </el-form-item>
  247. <el-form-item v-if="items.basNameType && v.title == '基础依据术语类型'">
  248. <el-input disabled v-model="items.basTypeName"></el-input>
  249. </el-form-item>
  250. <div
  251. v-if="v.title == '医学标准术语' && items.basType == 1"
  252. class="box-2 box-o"
  253. :class="items.basType===3 || items.basType===4 || items.basType===5 || items.basType===6? 'tmall' : 'taobao'"
  254. >
  255. <el-form-item
  256. v-if="items.basType==1 || items.basType==2 || items.basType==''"
  257. :prop="'klDiagnoseTypeVO.' +
  258. scope.$index +
  259. '.groupVO.' +
  260. index +
  261. '.klDiagnoseDetail.'+i+'.basConceptId'"
  262. :rules="rules.subConceptId"
  263. >
  264. <el-select
  265. class="searchselect"
  266. v-model.trim="items.basConceptId"
  267. multiple
  268. filterable
  269. remote
  270. collapse-tags
  271. reserve-keyword
  272. placeholder="请选择"
  273. :remote-method="(val)=>searchConcept(val,scope.$index,index,i)"
  274. @change="(val)=>conceptChange(val,scope.$index,index,i,items.basType)"
  275. @visible-change="(val)=>changeValue1(val,scope.$index,index,i)"
  276. >
  277. <el-option
  278. v-for="item in items.conceptList"
  279. :title="item.conceptName"
  280. :key="item.conceptId"
  281. :label="item.conceptName"
  282. :value="item.conceptId"
  283. ></el-option>
  284. </el-select>
  285. </el-form-item>
  286. </div>
  287. <div
  288. v-if="v.title == '医学标准术语' && items.basType != 1"
  289. class="box-2 box-o"
  290. :class="items.basType===3 || items.basType===4 || items.basType===5 || items.basType===6? 'tmall' : 'taobao'"
  291. >
  292. <el-form-item
  293. v-if="items.basType==1 || items.basType==2 || items.basType==''"
  294. :prop="'klDiagnoseTypeVO.' +
  295. scope.$index +
  296. '.groupVO.' +
  297. index +
  298. '.klDiagnoseDetail.'+i+'.conceptId'"
  299. :rules="[
  300. { required: true, message: '请选择医学标准术语', trigger: 'change' }
  301. ]"
  302. >
  303. <el-select
  304. clearable
  305. remote
  306. filterable
  307. :remote-method="(val)=>searchConcept(val,scope.$index,index,i)"
  308. v-model.trim="items.conceptId"
  309. @change="(val)=>conceptChange(val,scope.$index,index,i,items.basType)"
  310. >
  311. <el-option
  312. v-for="item in items.conceptList"
  313. :key="item.conceptId"
  314. :label="item.conceptName"
  315. :value="item.conceptId"
  316. ></el-option>
  317. </el-select>
  318. </el-form-item>
  319. </div>
  320. <div class="last-box" v-if="v.title == '依据具体内容'">
  321. <el-form-item
  322. :prop="'klDiagnoseTypeVO.' +
  323. scope.$index +
  324. '.groupVO.' +
  325. index +
  326. '.klDiagnoseDetail.'+i+'.dataType'"
  327. v-if="items.basType===2&&!items.onlyNumType&&!items.onlyTxtType"
  328. :rules="rules.dataType"
  329. >
  330. <el-select
  331. class="box-1"
  332. :class="items.basType===2&&!items.onlyNumType&&!items.onlyTxtType? 'taobao' : 'tmall'"
  333. v-model="items.dataType"
  334. @change="(val)=>dataTypeChange(val,scope.$index,index,i)"
  335. placeholder="请选择"
  336. size="small"
  337. >
  338. <el-option
  339. v-for="item in dataTypes"
  340. :key="item.id"
  341. :label="item.name"
  342. :value="item.id"
  343. ></el-option>
  344. </el-select>
  345. </el-form-item>
  346. <el-form-item
  347. v-if="(!items.onlyNumType&&items.dataType==='1')||items.onlyNumType"
  348. label="最大值:"
  349. label-width="60px"
  350. >
  351. <div class="last-box-1">
  352. <el-form-item
  353. :prop="'klDiagnoseTypeVO.' +
  354. scope.$index +
  355. '.groupVO.' +
  356. index +
  357. '.klDiagnoseDetail.'+i+'.maxOperator'"
  358. :rules="[
  359. {
  360. validator: (rule, value, callback) => {
  361. maxOperator(items, rule, value, callback);
  362. },
  363. trigger: ['change']
  364. }
  365. ]"
  366. >
  367. <el-select
  368. v-model="items.maxOperator"
  369. placeholder="请选择"
  370. size="small"
  371. clearable
  372. >
  373. <el-option
  374. v-for="item in operMaxList"
  375. :key="item.key"
  376. :label="item.name"
  377. :value="item.key"
  378. ></el-option>
  379. </el-select>
  380. </el-form-item>
  381. <el-form-item
  382. class="num"
  383. :prop="'klDiagnoseTypeVO.' +
  384. scope.$index +
  385. '.groupVO.' +
  386. index +
  387. '.klDiagnoseDetail.'+i+'.maxVal'"
  388. :rules="[
  389. {
  390. validator: (rule, value, callback) => {
  391. maxVal(items, rule, value, callback);
  392. },
  393. trigger: ['blur']
  394. }
  395. ]"
  396. >
  397. <el-input v-model="items.maxVal" placeholder="填写数值"></el-input>
  398. </el-form-item>
  399. <el-form-item prop="minUnit">
  400. <el-input v-model.trim="items.maxUnit" placeholder="填写单位"></el-input>
  401. </el-form-item>
  402. </div>
  403. </el-form-item>
  404. <el-form-item
  405. v-if="(!items.onlyNumType&&items.dataType==='1')||items.onlyNumType"
  406. label="最小值:"
  407. label-width="60px"
  408. >
  409. <div class="last-box-1 last-box-s">
  410. <el-form-item
  411. :prop="'klDiagnoseTypeVO.' +
  412. scope.$index +
  413. '.groupVO.' +
  414. index +
  415. '.klDiagnoseDetail.'+i+'.minOperator'"
  416. :rules="[
  417. {
  418. validator: (rule, value, callback) => {
  419. minOperator(items, rule, value, callback);
  420. },
  421. trigger: ['change']
  422. }
  423. ]"
  424. >
  425. <el-select
  426. v-model="items.minOperator"
  427. placeholder="请选择"
  428. size="small"
  429. clearable
  430. >
  431. <el-option
  432. v-for="item in operMinList"
  433. :key="item.key"
  434. :label="item.name"
  435. :value="item.key"
  436. ></el-option>
  437. </el-select>
  438. </el-form-item>
  439. <el-form-item
  440. class="minnum"
  441. :prop="'klDiagnoseTypeVO.' +
  442. scope.$index +
  443. '.groupVO.' +
  444. index +
  445. '.klDiagnoseDetail.'+i+'.minVal'"
  446. :rules="[
  447. {
  448. validator: (rule, value, callback) => {
  449. minVal(items, rule, value, callback);
  450. },
  451. trigger: ['blur']
  452. }
  453. ]"
  454. >
  455. <el-input v-model="items.minVal" placeholder="填写数值"></el-input>
  456. </el-form-item>
  457. <el-form-item prop="minUnit">
  458. <el-input v-model.trim="items.minUnit" placeholder="填写单位"></el-input>
  459. </el-form-item>
  460. </div>
  461. </el-form-item>
  462. <div>
  463. <el-form-item
  464. :prop="'klDiagnoseTypeVO.' +
  465. scope.$index +
  466. '.groupVO.' +
  467. index +
  468. '.klDiagnoseDetail.'+i+'.eqValue'"
  469. v-if="items.basType===4 || items.basType===3 || items.basType===5 || items.basType===6"
  470. maxlength="200"
  471. label="正则表达式:"
  472. class="discDesc"
  473. :rules="[
  474. {
  475. required: true,
  476. message: '请输入正则表达式',
  477. trigger: 'blur'
  478. },
  479. ]"
  480. >
  481. <el-input class="inp" placeholder="请输入正则表达式" v-model.trim="items.eqValue"></el-input>
  482. </el-form-item>
  483. </div>
  484. <div>
  485. <el-form-item
  486. :prop="'klDiagnoseTypeVO.' +
  487. scope.$index +
  488. '.groupVO.' +
  489. index +
  490. '.klDiagnoseDetail.'+i+'.eqValue'"
  491. maxlength="200"
  492. v-if="(!items.onlyNumType&&!items.basNameType&&(items.basType===2 || items.basType===1)&&items.dataType==='2')||items.onlyTxtType"
  493. label="医学内容:"
  494. class="discDesc"
  495. :rules="[
  496. {
  497. required: true,
  498. message: '请输入医学内容',
  499. trigger: 'blur'
  500. }
  501. ]"
  502. >
  503. <el-input v-model.trim="items.eqValue" class="inp" placeholder="请输入医学内容"></el-input>
  504. </el-form-item>
  505. </div>
  506. </div>
  507. </div>
  508. </div>
  509. </template>
  510. </el-table-column>
  511. </el-table>
  512. </div>
  513. </el-form>
  514. <div class="Butn">
  515. <el-button class="disclButn" size="small" type="primary" @click="confirm">确定</el-button>
  516. </div>
  517. </div>
  518. </div>
  519. </template>
  520. <script type="text/javascript">
  521. import util from '../../api/utils.js';
  522. import api from '@api/zskDiagBase.js';
  523. import { tableRules } from './rules';
  524. export default {
  525. name: 'AddZskDiagBase',
  526. data() {
  527. return {
  528. columns: [
  529. { title: '基础依据', width: 90, istar: true },
  530. { title: '基础依据名称', width: 160, istar: true },
  531. { title: '基础依据类型', width: 130, istar: true },
  532. { title: '基础依据术语类型', width: 160, istar: true },
  533. { title: '医学标准术语', width: 230, istar: true },
  534. { title: '依据具体内容', width: 850 }
  535. ],
  536. dicts: {},
  537. baseTypes: [], //诊断数据类型
  538. baseTermTypeList: [], //基础依据类型
  539. basLibTypeList: [], //基础术语依据类型
  540. numTypes: '', //只有数值类型的类型id
  541. labelPosition: 'left',
  542. isCopy: false,
  543. title: '诊断依据维护-添加诊断依据',
  544. conceptName: '',
  545. conceptList: [],
  546. form: {
  547. description: '',
  548. conceptId: '',
  549. klDiagnoseTypeVO: [
  550. {
  551. conditionType: '',
  552. depart_id: 0,
  553. groupVO: [
  554. {
  555. baseGroup: '',
  556. conditionGroup: '',
  557. fitNo: '',
  558. klDiagnoseDetail: [
  559. {
  560. dataType: '',
  561. basNameType: false,
  562. onlyNumType: false,
  563. onlyTxtType: false,
  564. basTypeName: '',
  565. basConceptId: [],
  566. conceptId: '',
  567. basConceptList: [],
  568. basDescription: '',
  569. basLename: '',
  570. basLibName: '',
  571. basLibType: null,
  572. basType: '',
  573. eqOperator: '',
  574. eqUnit: '',
  575. eqValue: '',
  576. maxOperator: '',
  577. maxUnit: '',
  578. maxVal: '',
  579. minOperator: '',
  580. minUnit: '',
  581. minVal: ''
  582. }
  583. ]
  584. }
  585. ]
  586. }
  587. ]
  588. },
  589. id: null,
  590. rules: tableRules,
  591. dataTypes: [
  592. { id: '1', name: '数值类型' },
  593. { id: '2', name: '文本类型' }
  594. ],
  595. operMaxList: [
  596. { name: '<=', key: '<=' },
  597. { name: '<', key: '<' }
  598. ],
  599. operMinList: [
  600. { name: '>', key: '>' },
  601. { name: '>=', key: '>=' }
  602. ],
  603. basType: '',
  604. dataType: '',
  605. spanArr: [],
  606. list: [], //提交数据数组,
  607. i: 1,
  608. onshow: true,
  609. arr: [],
  610. basConceptId: [],
  611. conceptId: ''
  612. };
  613. },
  614. created() {
  615. const param = this.$route.params;
  616. this.baseTypes = JSON.parse(localStorage.getItem('zskDiagList') || '[]');
  617. this.dicts = JSON.parse(localStorage.getItem('zskDiagDicts') || '{}');
  618. let info = param.data;
  619. if (info) {
  620. this.id = info.id;
  621. this.isCopy = param.copy;
  622. this.title =
  623. '诊断依据维护-' + (this.isCopy ? '复制' : '修改') + '诊断依据';
  624. this.conceptList = [
  625. { conceptId: info.conceptId, conceptName: info.conceptName }
  626. ];
  627. for (let i = 0; i < info.klDiagnoseTypeVO.length; i++) {
  628. info.klDiagnoseTypeVO[i].depart_id = i;
  629. }
  630. this.form = Object.assign({}, this.form, this.formatData(info));
  631. if (this.isCopy) {
  632. this.conceptList = [];
  633. delete this.form.conceptName;
  634. delete this.form.conceptId;
  635. delete this.form.description;
  636. delete this.form.id;
  637. }
  638. var index2 = this.baseTypes.findIndex(
  639. item => item.ruleType === this.form.klDiagnoseTypeVO[0].conditionType
  640. );
  641. this.baseTermTypeList = this.baseTypes[index2].subMenuList;
  642. const klDiagnoseTypeVO = this.form.klDiagnoseTypeVO;
  643. let groupVOi, klDiagnoseDetailj;
  644. for (let i = 0; i < klDiagnoseTypeVO.length; i++) {
  645. groupVOi = klDiagnoseTypeVO[i].groupVO;
  646. for (let j = 0; j < groupVOi.length; j++) {
  647. klDiagnoseDetailj = groupVOi[j].klDiagnoseDetail;
  648. for (let k = 0; k < groupVOi[j].klDiagnoseDetail.length; k++) {
  649. this.arr = [];
  650. var index2 = this.baseTermTypeList.findIndex(
  651. item => item.type === klDiagnoseDetailj[k].basType
  652. );
  653. klDiagnoseDetailj[k].basLibTypeList = this.baseTermTypeList[
  654. index2
  655. ].subMenuList;
  656. klDiagnoseDetailj[k].conceptList = this.formatData2(
  657. klDiagnoseDetailj[k].libNameList
  658. );
  659. klDiagnoseDetailj[k].basConceptList = this.formatData2(
  660. klDiagnoseDetailj[k].libNameList
  661. );
  662. if (klDiagnoseDetailj[k].basType == 1) {
  663. klDiagnoseDetailj[k].libNameList.forEach(item => {
  664. this.arr.push(item.basConceptId);
  665. });
  666. this.$set(klDiagnoseDetailj[k], 'basConceptId', this.arr);
  667. } else if (klDiagnoseDetailj[k].basType == 2) {
  668. klDiagnoseDetailj[k].libNameList.forEach(item => {
  669. this.arr.push(item.basConceptId);
  670. });
  671. this.$set(klDiagnoseDetailj[k], 'conceptId', this.arr[0]);
  672. }
  673. if (
  674. klDiagnoseDetailj[k].maxOperator ||
  675. klDiagnoseDetailj[k].minOperator
  676. ) {
  677. klDiagnoseDetailj[k].dataType = '1';
  678. } else if (klDiagnoseDetailj[k].eqValue) {
  679. klDiagnoseDetailj[k].dataType = '2';
  680. }
  681. if (
  682. klDiagnoseDetailj[k].basType == 3 ||
  683. klDiagnoseDetailj[k].basType == 4 ||
  684. klDiagnoseDetailj[k].basType == 5 ||
  685. klDiagnoseDetailj[k].basType == 6
  686. ) {
  687. klDiagnoseDetailj[k].basTypeName =
  688. klDiagnoseDetailj[k].basLibTypeList[0].name;
  689. klDiagnoseDetailj[k].basNameType = true;
  690. } else {
  691. klDiagnoseDetailj[k].basTypeName = '';
  692. klDiagnoseDetailj[k].basNameType = false;
  693. }
  694. const onlyNum = this.dicts['onlyNum'] || '&';
  695. const onlyTxt = this.dicts['onlyTxt'] || '&';
  696. const codes = onlyNum + ',';
  697. const code = onlyTxt + ',';
  698. let type = klDiagnoseDetailj[k].basLibType;
  699. let a = klDiagnoseDetailj[k].basLibType;
  700. klDiagnoseDetailj[k].onlyNumType =
  701. type && codes.indexOf(a + ',') > -1;
  702. klDiagnoseDetailj[k].onlyTxtType =
  703. type && code.indexOf(a + ',') > -1;
  704. }
  705. }
  706. }
  707. this.i = this.form.klDiagnoseTypeVO.slice(-1)[0].depart_id + 1;
  708. }
  709. },
  710. computed: {
  711. numArr() {
  712. let arr = [];
  713. let num = [];
  714. for (let i = 0; i < this.form.klDiagnoseTypeVO.length; i++) {
  715. arr.push({ num: [] });
  716. for (let j = 0; j < this.form.klDiagnoseTypeVO[i].groupVO.length; j++) {
  717. arr[i].num.push([]);
  718. for (
  719. let k = 0;
  720. k <
  721. this.form.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail.length;
  722. k++
  723. ) {
  724. arr[i].num[j].push({ id: k + 1, name: k + 1 });
  725. }
  726. }
  727. }
  728. return arr;
  729. },
  730. dest() {
  731. const formData = JSON.parse(JSON.stringify(this.form));
  732. let map = {},
  733. dest = [];
  734. for (let i = 0; i < formData.klDiagnoseTypeVO.length; i++) {
  735. let ai = formData.klDiagnoseTypeVO[i];
  736. if (!map[ai.depart_id]) {
  737. dest.push({
  738. depart_id: ai.depart_id,
  739. conditionType: ai.conditionType,
  740. groupVO: ai.groupVO
  741. });
  742. map[ai.depart_id] = ai;
  743. } else {
  744. for (let j = 0; j < dest.length; j++) {
  745. var dj = dest[j];
  746. if (dj.depart_id == ai.depart_id) {
  747. dj.groupVO = dj.groupVO.concat(ai.groupVO);
  748. break;
  749. }
  750. }
  751. }
  752. }
  753. return dest;
  754. }
  755. },
  756. methods: {
  757. // 最大值 选择rule
  758. maxOperator(items, rule, value, callback) {
  759. const { maxVal, minOperator, minVal } = items;
  760. const val = value + minOperator + minVal + maxVal;
  761. if (!val || (!value && maxVal !== '')) {
  762. callback(new Error('最大值和最小值至少完整填写一个,单位不必填'));
  763. } else {
  764. callback();
  765. }
  766. },
  767. // 最大值 数值rule
  768. maxVal(items, rule, value, callback) {
  769. const { maxOperator, minOperator, minVal } = items;
  770. const val = value + maxOperator + minOperator + minVal;
  771. const isNum = /^(\-|\+)?\d+(\.\d+)?$/.test(value);
  772. if (!val || (value == '' && maxOperator)) {
  773. callback(new Error('最大值和最小值至少完整填写一个,单位不必填'));
  774. } else if (value !== '' && !isNum) {
  775. callback(new Error('只能输入数字'));
  776. } else {
  777. callback();
  778. }
  779. },
  780. // 最小值 选择rule
  781. minOperator(items, rule, value, callback) {
  782. const { maxVal, maxOperator, minVal } = items;
  783. const val = value + maxVal + maxOperator + minVal;
  784. if (!val || (!value && minVal !== '')) {
  785. callback(new Error('最大值和最小值至少完整填写一个,单位不必填'));
  786. } else {
  787. callback();
  788. }
  789. },
  790. // 最小值 数值rule
  791. minVal(items, rule, value, callback) {
  792. const { maxVal, minOperator, maxOperator } = items;
  793. const val = value + maxVal + minOperator + maxOperator;
  794. const isNum = /^(\-|\+)?\d+(\.\d+)?$/.test(value);
  795. if (!val || (value == '' && minOperator)) {
  796. callback(new Error('最大值和最小值至少完整填写一个,单位不必填'));
  797. } else if (value !== '' && !isNum) {
  798. callback(new Error('只能输入数字'));
  799. } else {
  800. callback();
  801. }
  802. },
  803. isMax(id) {
  804. const typeNum = this.form.klDiagnoseTypeVO.filter(
  805. item => item.depart_id === id
  806. ).length;
  807. return typeNum > 1;
  808. },
  809. getData(data) {
  810. let arr = data;
  811. let str = [];
  812. let newArr = [];
  813. arr.filter((value, index, array) => {
  814. if (value.groupVO.length > 1 && value.groupVO.length != 0) {
  815. for (let j = 0; j < value.groupVO.length; j++) {
  816. var db = {
  817. conditionType: value.conditionType,
  818. depart_id: value.depart_id,
  819. groupVO: [value.groupVO[j]]
  820. };
  821. str.push(db);
  822. }
  823. value.groupVO = [];
  824. arr.splice(index, 1);
  825. arr.splice(index, 0, ...str);
  826. newArr = str;
  827. } else {
  828. newArr = arr;
  829. }
  830. });
  831. this.getSpanArr(newArr);
  832. },
  833. getSpanArr(data) {
  834. this.spanArr = [];
  835. for (var i = 0; i < data.length; i++) {
  836. if (i === 0) {
  837. this.spanArr.push(1);
  838. this.pos = 0;
  839. } else {
  840. if (data[i].depart_id === data[i - 1].depart_id) {
  841. this.spanArr[this.pos] += 1;
  842. this.spanArr.push(0);
  843. } else {
  844. this.spanArr.push(1);
  845. this.pos = i;
  846. }
  847. }
  848. }
  849. },
  850. dataSpanMethod({ row, column, rowIndex, columnIndex }) {
  851. if (columnIndex === 0 || columnIndex === 1) {
  852. //合并行的行为只在第一列进行
  853. const _row = this.spanArr[rowIndex];
  854. const _col = _row > 0 ? 1 : 0;
  855. return {
  856. rowspan: _row,
  857. colspan: _col
  858. };
  859. }
  860. },
  861. getInitData() {
  862. this.i++;
  863. return {
  864. conditionType: '',
  865. depart_id: this.i,
  866. groupVO: [
  867. {
  868. baseGroup: '',
  869. conditionGroup: '',
  870. fitNo: '',
  871. klDiagnoseDetail: [
  872. {
  873. dataType: '',
  874. basNameType: false,
  875. onlyNumType: false,
  876. onlyTxtType: false,
  877. basTypeName: '',
  878. basConceptId: [],
  879. conceptId: '',
  880. basConceptList: [],
  881. basDescription: '',
  882. basLename: '',
  883. basLibName: '',
  884. basLibType: null,
  885. basType: '',
  886. eqOperator: '',
  887. eqUnit: '',
  888. eqValue: '',
  889. maxOperator: '',
  890. maxUnit: '',
  891. maxVal: '',
  892. minOperator: '',
  893. minUnit: '',
  894. minVal: ''
  895. }
  896. ]
  897. }
  898. ]
  899. };
  900. },
  901. //新增依据
  902. addDiag(id) {
  903. let temp = this.getInitData();
  904. var i = -1;
  905. this.form.klDiagnoseTypeVO.forEach((item, inx) => {
  906. if (item.depart_id == id) {
  907. i = inx;
  908. }
  909. });
  910. this.$nextTick(() => {
  911. this.$refs.tableList.bodyWrapper.scrollLeft = 0;
  912. });
  913. this.form.klDiagnoseTypeVO.splice(i + 1, 0, temp);
  914. },
  915. //复制依据
  916. copyDiag(id) {
  917. this.i++;
  918. const formData = JSON.parse(JSON.stringify(this.form));
  919. let i = -1;
  920. let arr = [];
  921. formData.klDiagnoseTypeVO.forEach((item, inx) => {
  922. if (item.depart_id == id) {
  923. arr.push(item);
  924. i = inx;
  925. }
  926. });
  927. arr.forEach((item, index) => {
  928. item.depart_id = this.i;
  929. this.form.klDiagnoseTypeVO.splice(i + index + 1, 0, item);
  930. });
  931. },
  932. //删除依据
  933. delDiag(id, inx) {
  934. this.form.klDiagnoseTypeVO = this.form.klDiagnoseTypeVO.filter(
  935. item => item.depart_id !== id
  936. );
  937. this.form.klDiagnoseTypeVO.forEach((item, index) => {
  938. if (item.depart_id > id) {
  939. item.depart_id = item.depart_id - 1;
  940. }
  941. });
  942. },
  943. //新增组
  944. addGroup(i) {
  945. const temp = {
  946. baseGroup: '',
  947. conditionGroup: '',
  948. fitNo: '',
  949. klDiagnoseDetail: [
  950. {
  951. dataType: '',
  952. basNameType: false,
  953. onlyNumType: false,
  954. onlyTxtType: false,
  955. basTypeName: '',
  956. basConceptId: [],
  957. conceptId: '',
  958. basConceptList: [],
  959. basDescription: '',
  960. basLename: '',
  961. basLibName: '',
  962. basLibType: null,
  963. basType: '',
  964. eqOperator: '',
  965. eqUnit: '',
  966. eqValue: '',
  967. maxOperator: '',
  968. maxUnit: '',
  969. maxVal: '',
  970. minOperator: '',
  971. minUnit: '',
  972. minVal: ''
  973. }
  974. ]
  975. };
  976. this.form.klDiagnoseTypeVO[i].groupVO.splice(i + 1, 0, temp);
  977. },
  978. delGroup(id, i) {
  979. this.form.klDiagnoseTypeVO.splice(i, 1);
  980. },
  981. //新增基础依据
  982. addRule(row, index, inx, i) {
  983. let temp = {
  984. dataType: '',
  985. basNameType: false,
  986. basTypeName: '',
  987. basConceptId: [],
  988. conceptId: '',
  989. basConceptList: [],
  990. basDescription: '',
  991. basLename: '',
  992. basLibName: '',
  993. basLibType: null,
  994. basType: '',
  995. eqOperator: '',
  996. eqUnit: '',
  997. eqValue: '',
  998. maxOperator: '',
  999. maxUnit: '',
  1000. maxVal: '',
  1001. minOperator: '',
  1002. minUnit: '',
  1003. minVal: ''
  1004. };
  1005. this.form.klDiagnoseTypeVO[index].groupVO[inx].klDiagnoseDetail.splice(
  1006. i + 1,
  1007. 0,
  1008. temp
  1009. );
  1010. this.form.klDiagnoseTypeVO = JSON.parse(
  1011. JSON.stringify(this.form.klDiagnoseTypeVO)
  1012. ); //8525更新对象触发滚动条更新
  1013. },
  1014. delRule(row, inx, index, i) {
  1015. const klDiagnoseDetail = this.form.klDiagnoseTypeVO[inx].groupVO[index]
  1016. .klDiagnoseDetail;
  1017. if (klDiagnoseDetail.length === 1) {
  1018. return;
  1019. } else {
  1020. klDiagnoseDetail.splice(i, 1);
  1021. const numArr = this.numArr[inx].num[0];
  1022. const fitNo = this.form.klDiagnoseTypeVO[inx].groupVO[0].fitNo;
  1023. if (numArr[numArr.length - 1].name < fitNo) {
  1024. this.form.klDiagnoseTypeVO[inx].groupVO[0].fitNo = '';
  1025. }
  1026. }
  1027. },
  1028. //诊断依据类型修改
  1029. basTypeChange(val, inx) {
  1030. if (!val) {
  1031. this.baseTermTypeList = [];
  1032. return;
  1033. }
  1034. var index2 = this.baseTypes.findIndex(item => item.ruleType === val);
  1035. this.baseTermTypeList = this.baseTypes[index2].subMenuList;
  1036. },
  1037. //基础依据类型修改
  1038. baseTermTypeChange(val, inx, index, i) {
  1039. if (!val) {
  1040. return;
  1041. }
  1042. this.basType = val;
  1043. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1044. i
  1045. ].basType = val;
  1046. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1047. i
  1048. ].basLibType = '';
  1049. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1050. i
  1051. ].dataType = '';
  1052. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1053. i
  1054. ].basConceptId = [];
  1055. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1056. i
  1057. ].conceptId = '';
  1058. this.clearConcept(val, inx, index, i); //清空医学标准术语
  1059. this.clearNumText(val, inx, index, i); //清空数值、医学内容
  1060. var index2 = this.baseTermTypeList.findIndex(item => item.type === val);
  1061. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1062. i
  1063. ].basLibTypeList = this.baseTermTypeList[index2].subMenuList;
  1064. this.form.klDiagnoseTypeVO[inx].groupVO[
  1065. index
  1066. ].baseTermTypeList = this.baseTermTypeList;
  1067. if (val == 3 || val == 4 || val == 5 || val == 6) {
  1068. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1069. i
  1070. ].basTypeName = this.form.klDiagnoseTypeVO[inx].groupVO[
  1071. index
  1072. ].klDiagnoseDetail[i].basLibTypeList[0].name;
  1073. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1074. i
  1075. ].basNameType = true;
  1076. this.$refs['form'].clearValidate([
  1077. 'klDiagnoseTypeVO.' +
  1078. inx +
  1079. '.groupVO.' +
  1080. index +
  1081. '.klDiagnoseDetail.' +
  1082. i +
  1083. '.basLibType'
  1084. ]);
  1085. } else {
  1086. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1087. i
  1088. ].basTypeName = '';
  1089. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1090. i
  1091. ].basNameType = false;
  1092. }
  1093. },
  1094. //基础依据术语类型修改
  1095. basLibTypeChange(val, inx, index, i) {
  1096. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1097. i
  1098. ].basLibType = val;
  1099. // this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1100. // i
  1101. // ].dataType = '';
  1102. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1103. i
  1104. ].basConceptId = [];
  1105. if ((this.numTypes + ',').indexOf(val + ',') > -1) {
  1106. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1107. i
  1108. ].dataType = '1';
  1109. } else {
  1110. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1111. i
  1112. ].dataType = '';
  1113. }
  1114. const onlyNum = this.dicts['onlyNum'] || '&';
  1115. const onlyTxt = this.dicts['onlyTxt'] || '&';
  1116. const codes = onlyNum + ',';
  1117. const code = onlyTxt + ',';
  1118. let type = this.form.klDiagnoseTypeVO[inx].groupVO[index]
  1119. .klDiagnoseDetail[i].basLibType;
  1120. let a = this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[i]
  1121. .basLibType;
  1122. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1123. i
  1124. ].onlyNumType = type && codes.indexOf(a + ',') > -1;
  1125. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1126. i
  1127. ].onlyTxtType = type && code.indexOf(a + ',') > -1;
  1128. this.clearConcept(val, inx, index, i);
  1129. this.clearNumText2(val, inx, index, i);
  1130. },
  1131. changeValue1(val, inx, index, i) {
  1132. const formData = JSON.parse(
  1133. JSON.stringify(
  1134. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[i]
  1135. )
  1136. );
  1137. let basConceptId = [];
  1138. let data2 = formData.basConceptList.filter(it => {
  1139. let arr = formData.basConceptId.map(v => v.conceptId);
  1140. return !arr.includes(it.conceptId);
  1141. });
  1142. formData.basConceptId.forEach(item => {
  1143. data2.forEach(it => {
  1144. if (item == it.conceptId) {
  1145. basConceptId.push(it);
  1146. }
  1147. });
  1148. });
  1149. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1150. i
  1151. ].conceptList = basConceptId;
  1152. },
  1153. //医学标准术语
  1154. conceptChange(val, inx, index, i, basType) {
  1155. if (basType == 1) {
  1156. this.$set(
  1157. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[i],
  1158. 'basConceptId',
  1159. val
  1160. );
  1161. } else if (basType == 2) {
  1162. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1163. i
  1164. ].conceptId = val;
  1165. }
  1166. },
  1167. searchConcept(val, inx, index, i) {
  1168. const formData = JSON.parse(JSON.stringify(this.form));
  1169. const param = {
  1170. excludedConceptIds: [
  1171. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[i]
  1172. .basType
  1173. ],
  1174. libType:
  1175. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[i]
  1176. .basLibType,
  1177. name: val
  1178. };
  1179. api
  1180. .searchConcept(param)
  1181. .then(res => {
  1182. if (res.data.code == '0') {
  1183. let data = res.data.data;
  1184. this.$nextTick(() => {
  1185. // dom元素更新后执行,因此这里能正确打印更改之后的值
  1186. if (
  1187. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1188. i
  1189. ].basType == 1
  1190. ) {
  1191. let conceptList =
  1192. formData.klDiagnoseTypeVO[inx].groupVO[index]
  1193. .klDiagnoseDetail[i].conceptList;
  1194. let data2 = data.filter(it => {
  1195. let arr = conceptList.map(v => v.conceptId);
  1196. return !arr.includes(it.conceptId);
  1197. });
  1198. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1199. i
  1200. ].conceptList = data2; // 改变了的值
  1201. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1202. i
  1203. ].basConceptList = formData.klDiagnoseTypeVO[inx].groupVO[
  1204. index
  1205. ].klDiagnoseDetail[i].basConceptList.concat(data2);
  1206. } else {
  1207. formData.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1208. i
  1209. ].conceptList = data;
  1210. }
  1211. });
  1212. this.form = formData;
  1213. }
  1214. })
  1215. .catch(error => {
  1216. console.log(error);
  1217. });
  1218. },
  1219. dataTypeChange(val, inx, index, i) {
  1220. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1221. i
  1222. ].dataType = val;
  1223. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1224. i
  1225. ].eqOperator = val === '2' ? '=' : '';
  1226. },
  1227. clearConcept(val, inx, index, i) {
  1228. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1229. i
  1230. ].basConceptId = [];
  1231. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1232. i
  1233. ].basLibName = '';
  1234. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1235. i
  1236. ].conceptList = [];
  1237. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1238. i
  1239. ].conceptId = '';
  1240. },
  1241. clearNumText2(val, inx, index, i) {
  1242. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1243. i
  1244. ].maxOperator = '';
  1245. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1246. i
  1247. ].maxVal = '';
  1248. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1249. i
  1250. ].maxUnit = '';
  1251. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1252. i
  1253. ].minOperator = '';
  1254. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1255. i
  1256. ].minVal = '';
  1257. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1258. i
  1259. ].minUnit = '';
  1260. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1261. i
  1262. ].eqValue = '';
  1263. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1264. i
  1265. ].eqOperator = '';
  1266. },
  1267. clearNumText(val, inx, index, i) {
  1268. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1269. i
  1270. ].maxOperator = '';
  1271. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1272. i
  1273. ].maxVal = '';
  1274. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1275. i
  1276. ].maxUnit = '';
  1277. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1278. i
  1279. ].minOperator = '';
  1280. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1281. i
  1282. ].minVal = '';
  1283. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1284. i
  1285. ].minUnit = '';
  1286. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1287. i
  1288. ].eqValue = '';
  1289. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1290. i
  1291. ].eqOperator = '';
  1292. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1293. i
  1294. ].onlyNumType = false;
  1295. this.form.klDiagnoseTypeVO[inx].groupVO[index].klDiagnoseDetail[
  1296. i
  1297. ].onlyTxtType = false;
  1298. },
  1299. formatData(data) {
  1300. //转换字段名
  1301. let str = JSON.stringify(data)
  1302. .replace(/byIdDTO/g, 'groupVO')
  1303. .replace(/klDiagnoseByIdDTO/g, 'klDiagnoseDetail');
  1304. //console.log(JSON.parse(str))
  1305. return JSON.parse(str);
  1306. },
  1307. formatData2(data) {
  1308. //转换字段名
  1309. let str = JSON.stringify(data)
  1310. .replace(/basLibName/g, 'conceptName')
  1311. .replace(/basConceptId/g, 'conceptId');
  1312. //console.log(JSON.parse(str))
  1313. return JSON.parse(str);
  1314. },
  1315. searchDiag(val) {
  1316. const param = {
  1317. diseaseName: val
  1318. };
  1319. api
  1320. .searchDiag(param)
  1321. .then(res => {
  1322. if (res.data.code == '0') {
  1323. const data = res.data.data;
  1324. this.conceptList = data;
  1325. }
  1326. })
  1327. .catch(error => {
  1328. console.log(error);
  1329. });
  1330. },
  1331. setInitGroupData() {
  1332. let temp = this.getInitData();
  1333. this.form.klDiagnoseTypeVO = [temp];
  1334. },
  1335. setRules() {
  1336. let that = this;
  1337. let list = this.form.klDiagnoseTypeVO;
  1338. if (list && list.length > 0) {
  1339. list.forEach((item, i) => {
  1340. let list1 = list[i].groupVO;
  1341. list1.forEach((it, x) => {
  1342. let list2 = list1[x].klDiagnoseDetail;
  1343. list2.forEach((t, j) => {
  1344. let grandeObj = this.form.klDiagnoseTypeVO[i].groupVO[x]
  1345. .klDiagnoseDetail[j];
  1346. if (grandeObj) {
  1347. const keyTxt =
  1348. 'klDiagnoseTypeVO.' +
  1349. i +
  1350. '.groupVO.' +
  1351. x +
  1352. '.klDiagnoseDetail.' +
  1353. j;
  1354. that.rules[keyTxt + '.dataType'] = [
  1355. {
  1356. required: true,
  1357. message: '请选择类型',
  1358. trigger: ['change']
  1359. }
  1360. ];
  1361. that.rules[keyTxt + '.maxOperator'] = [
  1362. {
  1363. validator: (rule, value, callback) => {
  1364. const { maxVal, minOperator, minVal } = grandeObj;
  1365. const val = value + minOperator + minVal + maxVal;
  1366. if (!val || (!value && maxVal !== '')) {
  1367. callback(
  1368. new Error(
  1369. '最大值和最小值至少完整填写一个,单位不必填'
  1370. )
  1371. );
  1372. } else {
  1373. callback();
  1374. }
  1375. },
  1376. trigger: 'change'
  1377. }
  1378. ];
  1379. that.rules[keyTxt + '.minOperator'] = [
  1380. {
  1381. validator: (rule, value, callback) => {
  1382. const { maxVal, maxOperator, minVal } = grandeObj;
  1383. const val = value + maxOperator + minVal + maxVal;
  1384. if (!val || (!value && minVal !== '')) {
  1385. callback(
  1386. new Error(
  1387. '最大值和最小值至少完整填写一个,单位不必填'
  1388. )
  1389. );
  1390. } else {
  1391. callback();
  1392. }
  1393. },
  1394. trigger: 'change'
  1395. }
  1396. ];
  1397. that.rules[keyTxt + '.maxVal'] = [
  1398. {
  1399. validator: (rule, value, callback) => {
  1400. const { maxOperator, minOperator, minVal } = grandeObj;
  1401. const val = value + maxOperator + minVal + minOperator;
  1402. const isNum = /^(\-|\+)?\d+(\.\d+)?$/.test(value);
  1403. if (!val || (value === '' && maxOperator)) {
  1404. callback(
  1405. new Error(
  1406. '最大值和最小值至少完整填写一个,单位不必填'
  1407. )
  1408. );
  1409. } else if (value !== '' && !isNum) {
  1410. callback(new Error('只能输入数字'));
  1411. } else {
  1412. callback();
  1413. }
  1414. },
  1415. trigger: 'blur'
  1416. }
  1417. ];
  1418. that.rules[keyTxt + '.minVal'] = [
  1419. {
  1420. validator: (rule, value, callback) => {
  1421. const { maxVal, minOperator, maxOperator } = grandeObj;
  1422. const val = value + maxOperator + maxVal + minOperator;
  1423. const isNum = /^(\-|\+)?\d+(\.\d+)?$/.test(value);
  1424. if (!val || (value === '' && minOperator)) {
  1425. callback(
  1426. new Error(
  1427. '最大值和最小值至少完整填写一个,单位不必填'
  1428. )
  1429. );
  1430. } else if (value !== '' && !isNum) {
  1431. callback(new Error('只能输入数字'));
  1432. } else {
  1433. callback();
  1434. }
  1435. },
  1436. trigger: 'blur'
  1437. }
  1438. ];
  1439. }
  1440. });
  1441. });
  1442. });
  1443. }
  1444. },
  1445. saveDiagBase(params) {
  1446. api.saveDiagBase(params).then(res => {
  1447. if (res.data.code == 0) {
  1448. this.$message({
  1449. message: '操作成功',
  1450. type: 'success'
  1451. });
  1452. this.$router.push({
  1453. name: 'ZskDiagBase',
  1454. params: this.$route.params
  1455. });
  1456. } else {
  1457. this.$message({
  1458. message: res.data.msg,
  1459. type: 'warning'
  1460. });
  1461. }
  1462. });
  1463. },
  1464. validateForms(callBack) {
  1465. this.$refs['form'].validate(valid => {
  1466. if (valid) {
  1467. callBack();
  1468. } else {
  1469. return false;
  1470. }
  1471. });
  1472. },
  1473. confirm() {
  1474. const formData = JSON.parse(JSON.stringify(this.form));
  1475. const _this = this;
  1476. for (let i = 0; i < formData.klDiagnoseTypeVO.length; i++) {
  1477. for (let j = 0; j < formData.klDiagnoseTypeVO[i].groupVO.length; j++) {
  1478. delete formData.klDiagnoseTypeVO[i].groupVO[j].baseTermTypeList;
  1479. for (
  1480. let k = 0;
  1481. k < formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail.length;
  1482. k++
  1483. ) {
  1484. delete formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[k]
  1485. .basLibTypeList;
  1486. delete formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[k]
  1487. .conceptList;
  1488. formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[
  1489. k
  1490. ].basConceptId =
  1491. formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[k]
  1492. .basType == 2
  1493. ? JSON.stringify(
  1494. formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[k]
  1495. .conceptId
  1496. ).split('')
  1497. : formData.klDiagnoseTypeVO[i].groupVO[j].klDiagnoseDetail[k]
  1498. .basConceptId;
  1499. }
  1500. }
  1501. }
  1502. let map = {},
  1503. dest = [];
  1504. for (let i = 0; i < formData.klDiagnoseTypeVO.length; i++) {
  1505. let ai = formData.klDiagnoseTypeVO[i];
  1506. if (!map[ai.depart_id]) {
  1507. dest.push({
  1508. depart_id: ai.depart_id,
  1509. conditionType: ai.conditionType,
  1510. groupVO: ai.groupVO
  1511. });
  1512. map[ai.depart_id] = ai;
  1513. } else {
  1514. for (let j = 0; j < dest.length; j++) {
  1515. var dj = dest[j];
  1516. if (dj.depart_id == ai.depart_id) {
  1517. dj.groupVO = dj.groupVO.concat(ai.groupVO);
  1518. break;
  1519. }
  1520. }
  1521. }
  1522. }
  1523. formData.klDiagnoseTypeVO = dest;
  1524. this.validateForms(function() {
  1525. let params = formData;
  1526. _this.saveDiagBase(params);
  1527. });
  1528. }
  1529. },
  1530. watch: {
  1531. form: {
  1532. handler: function(newQuestion, oldQuestion) {
  1533. this.getData(this.form.klDiagnoseTypeVO);
  1534. },
  1535. deep: true,
  1536. immediate: true
  1537. }
  1538. }
  1539. };
  1540. </script>
  1541. <style lang="less" scoped>
  1542. @import '../../less/admin.less';
  1543. .box-o {
  1544. /deep/ .el-select {
  1545. width: 210px;
  1546. }
  1547. /deep/.el-input--suffix .el-input__inner {
  1548. height: 30px !important;
  1549. }
  1550. }
  1551. /deep/ .searchselect {
  1552. .el-select__tags {
  1553. max-width: 210px !important;
  1554. }
  1555. .el-tag {
  1556. min-width: 40px !important;
  1557. max-width: 75px !important;
  1558. .el-select__tags-text {
  1559. min-width: 40px !important;
  1560. max-width: 75px !important;
  1561. display: block;
  1562. overflow: hidden;
  1563. text-overflow: ellipsis;
  1564. white-space: nowrap;
  1565. }
  1566. .el-tag__close {
  1567. top: -22px;
  1568. right: -28px;
  1569. }
  1570. }
  1571. .el-tag:last-child {
  1572. min-width: 40px !important;
  1573. max-width: 75px !important;
  1574. .el-select__tags-text {
  1575. min-width: 40px !important;
  1576. max-width: 75px !important;
  1577. }
  1578. }
  1579. }
  1580. .contents {
  1581. height: 100%;
  1582. .content {
  1583. background: #fff;
  1584. padding: 20px 20px;
  1585. color: #545455;
  1586. min-width: 980px;
  1587. position: relative;
  1588. .tip-text {
  1589. color: #f56c6c;
  1590. margin-left: 10px;
  1591. }
  1592. .conceptItem {
  1593. padding: 0 10px;
  1594. cursor: pointer;
  1595. height: 32px;
  1596. line-height: 32px;
  1597. &:hover {
  1598. background: #ebedf1;
  1599. }
  1600. }
  1601. .el-table--scrollable-y .el-table__body-wrapper {
  1602. height: calc(100vh - 370px);
  1603. }
  1604. /deep/ .el-input {
  1605. height: 30px;
  1606. line-height: 30px;
  1607. .el-input__inner {
  1608. height: 30px;
  1609. line-height: 30px;
  1610. font-size: 12px;
  1611. }
  1612. }
  1613. /deep/ .el-select .el-input .el-icon-arrow-up {
  1614. line-height: 25px;
  1615. }
  1616. .inps {
  1617. width: 500px !important;
  1618. font-size: 14px;
  1619. /deep/ .el-input__inner {
  1620. width: 500px !important;
  1621. font-size: 14px;
  1622. }
  1623. }
  1624. .item {
  1625. /deep/.el-form-item__label {
  1626. font-size: 14px;
  1627. }
  1628. /deep/.el-input__inner {
  1629. font-size: 14px;
  1630. }
  1631. }
  1632. }
  1633. /deep/.is-error .el-form-item__error {
  1634. top: 30px;
  1635. }
  1636. .content-2 {
  1637. margin-top: 10px;
  1638. padding: 20px 20px;
  1639. height: calc(100vh - 370px);
  1640. .cell {
  1641. overflow: initial;
  1642. }
  1643. .content-2-header {
  1644. padding: 20px 0;
  1645. .title1 {
  1646. font-size: 14px;
  1647. font-weight: 400;
  1648. color: #333333;
  1649. line-height: 20px;
  1650. }
  1651. .title2 {
  1652. font-size: 12px;
  1653. font-weight: 400;
  1654. color: #ff545b;
  1655. line-height: 17px;
  1656. }
  1657. }
  1658. .el-form-item {
  1659. margin-bottom: 10px;
  1660. margin-right: 0;
  1661. }
  1662. .discDesc {
  1663. margin-bottom: 20px;
  1664. /deep/ .el-form-item__error {
  1665. top: 38px;
  1666. left: 100px !important;
  1667. white-space: nowrap;
  1668. }
  1669. }
  1670. .el-popper[x-placement^='bottom'] {
  1671. width: 100px !important;
  1672. }
  1673. .disclButn {
  1674. position: absolute;
  1675. right: calc(50% - 60px);
  1676. bottom: 10px;
  1677. }
  1678. .el-table .cell.el-tooltip {
  1679. position: relative;
  1680. }
  1681. .box-2 {
  1682. position: relative;
  1683. .tips {
  1684. left: 3px;
  1685. }
  1686. }
  1687. .box-3 {
  1688. position: relative;
  1689. }
  1690. .tips {
  1691. width: 12px;
  1692. height: 12px;
  1693. position: absolute;
  1694. left: 15px;
  1695. top: 15px;
  1696. }
  1697. .title {
  1698. position: absolute;
  1699. z-index: -1;
  1700. }
  1701. .last-box {
  1702. display: flex;
  1703. height: 50px;
  1704. margin-bottom: 10px;
  1705. position: relative;
  1706. /deep/ .el-input,
  1707. .el-input__inner {
  1708. width: 85px;
  1709. font-size: 12px;
  1710. margin-right: 15px;
  1711. }
  1712. /deep/ .el-form-item__content {
  1713. position: inherit !important;
  1714. }
  1715. .last-box-1 {
  1716. display: flex;
  1717. /deep/ .el-form-item__error {
  1718. top: 38px;
  1719. left: 10px;
  1720. white-space: nowrap;
  1721. width: 360px;
  1722. }
  1723. }
  1724. .last-box-s {
  1725. position: absolute;
  1726. /deep/ .el-form-item__error {
  1727. top: 38px;
  1728. left: 0px;
  1729. white-space: nowrap;
  1730. width: 260px;
  1731. }
  1732. }
  1733. /deep/ .el-form-item__error {
  1734. top: 38px;
  1735. left: 10px;
  1736. white-space: nowrap;
  1737. }
  1738. /deep/ .inp {
  1739. width: 600px !important;
  1740. .el-input__inner {
  1741. width: 600px !important;
  1742. }
  1743. }
  1744. .el-form-item {
  1745. margin: 0;
  1746. overflow: hidden;
  1747. display: flex;
  1748. }
  1749. }
  1750. .tmall {
  1751. visibility: hidden;
  1752. height: 60px;
  1753. }
  1754. .medical {
  1755. margin-right: 26px;
  1756. }
  1757. .group {
  1758. border-bottom: 1px solid red;
  1759. padding: 30px 0;
  1760. .group-row {
  1761. padding: 10px 0;
  1762. border-bottom: 1px solid red;
  1763. }
  1764. }
  1765. .group:last-child {
  1766. border-bottom: none;
  1767. }
  1768. .icon {
  1769. padding: 0 3px;
  1770. cursor: pointer;
  1771. }
  1772. .star {
  1773. color: #ff545b;
  1774. }
  1775. }
  1776. .Butn {
  1777. display: flex;
  1778. justify-content: center;
  1779. background: #fff;
  1780. .el-button {
  1781. margin: 15px 0;
  1782. }
  1783. }
  1784. .name {
  1785. font-size: 14px;
  1786. font-weight: 400;
  1787. color: #333333;
  1788. line-height: 20px;
  1789. }
  1790. }
  1791. </style>