AddPlan.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  1. <style lang="less" scoped>
  2. .addPlanWrapper {
  3. padding: 20px 60px 120px 60px;
  4. margin: 70px 20px 0 20px;
  5. background: #fff;
  6. .topBack {
  7. top: 0;
  8. left: 0;
  9. }
  10. .tipImg{
  11. position: absolute;
  12. width: 20px;
  13. height: 20px;
  14. top: 10px;
  15. right: -30px;
  16. cursor: pointer;
  17. }
  18. ul {
  19. li {
  20. border-radius: 2px;
  21. margin-bottom: 10px;
  22. }
  23. }
  24. .group_item {
  25. border-bottom: 1px solid #eee;
  26. .item_title {
  27. display: flex;
  28. justify-content: space-between;
  29. align-items: center;
  30. background: #E3EAF4;
  31. border-radius: 4px;
  32. margin-bottom: 10px;
  33. .title_left {
  34. display: flex;
  35. justify-content: center;
  36. align-items: center;
  37. .handleIcon {
  38. display: flex;
  39. align-items: center;
  40. margin: 0 5px;
  41. cursor: pointer;
  42. img {
  43. width: 20px;
  44. height: 20px;
  45. }
  46. }
  47. }
  48. .title_right {
  49. .titlwSwitchStatus {
  50. margin: 0 22px 0 16px;
  51. }
  52. }
  53. }
  54. ul {
  55. li {
  56. display: flex;
  57. .move_btn {
  58. background: #E2F4F6;
  59. padding-left: 10px;
  60. display: flex;
  61. height: 40px;
  62. .move_top,
  63. .move_down {
  64. width: 30px;
  65. .img_box {
  66. width: 100%;
  67. height: 100%;
  68. display: flex;
  69. justify-content: center;
  70. align-items: center;
  71. }
  72. .ispointer {
  73. cursor: pointer;
  74. }
  75. img {
  76. width: 10px;
  77. height: 14px;
  78. }
  79. }
  80. .move_top {
  81. img {
  82. margin-top: -15px;
  83. }
  84. }
  85. }
  86. .list_item_title {
  87. width: 140px;
  88. }
  89. .list_item_swich {
  90. .planStatus {
  91. margin-left: 16px;
  92. }
  93. }
  94. .list_right {
  95. // width: calc(100% - 60px);
  96. flex: 1;
  97. display: flex;
  98. justify-content: space-between;
  99. background: #E2F4F6;
  100. .right_l {
  101. display: flex;
  102. // width: calc(100% - 200px);
  103. }
  104. /deep/.el-input--small {
  105. width: 60px;
  106. }
  107. }
  108. .list_right1 {
  109. width: calc(100%);
  110. background: #FFFFFF;
  111. }
  112. }
  113. }
  114. }
  115. .list-w {
  116. /deep/.list_right:nth-of-type(1){
  117. background: #E2F4F6 !important;
  118. }
  119. }
  120. .b_active{
  121. background: #F2F2F2 ;
  122. /deep/.list_right{
  123. background: #F2F2F2 !important;
  124. }
  125. }
  126. .pr-10{
  127. padding-right: 10px;
  128. }
  129. .open {
  130. transform: rotate(0deg);
  131. transition: transform 0.3s;
  132. }
  133. .close {
  134. transform: rotate(180deg);
  135. transition: transform 0.3s;
  136. }
  137. .plus-icon-enter-active {
  138. transition: all 0.3s;
  139. }
  140. .plus-icon-enter {
  141. opacity: 0;
  142. }
  143. .plus-icon-leave-active {
  144. transition: all 0.3s;
  145. }
  146. .plus-icon-leave-active {
  147. opacity: 0;
  148. }
  149. }
  150. </style>
  151. <template>
  152. <el-scrollbar style="height: 100%" ref="elscrollbar">
  153. <div class="addPlanWrapper">
  154. <crumbs
  155. :title="
  156. isEdit ? '电子病历方案配置-修改方案' : '电子病历方案配置-添加方案'
  157. "
  158. class="topBack"
  159. :param="$route.params"
  160. linkTo="Plan"
  161. ></crumbs>
  162. <el-row>
  163. <el-col :span="16">
  164. <el-form ref="form" :model="form" label-width="80px" :rules="rules">
  165. <el-form-item
  166. label="医院名称"
  167. class="selectMedicine"
  168. prop="hospitalId"
  169. >
  170. <el-select
  171. v-model="form.hospitalId"
  172. placeholder="请选择"
  173. clearable
  174. style="width: 100%"
  175. >
  176. <el-option
  177. v-for="item in HospitalInfoList"
  178. :label="item.name"
  179. :value="item.id"
  180. :key="item.id"
  181. ></el-option>
  182. </el-select>
  183. </el-form-item>
  184. <el-form-item label="方案名称" prop="planName">
  185. <el-input
  186. v-model="form.planName"
  187. placeholder="2-30位,可输入汉字、字母、数字和下划线"
  188. :disabled="needDisable"
  189. ></el-input>
  190. </el-form-item>
  191. <el-form-item label="方案编码" prop="planCode">
  192. <el-input
  193. v-model="form.planCode"
  194. placeholder="可输入字母、数字和下划线"
  195. :disabled="needDisable"
  196. ></el-input>
  197. </el-form-item>
  198. <el-form-item label="方案配置">
  199. <div
  200. class="group_item"
  201. v-for="(group, i) in form.planDetailSub"
  202. :key="group.id"
  203. >
  204. <div class="item_title">
  205. <div class="title_left">
  206. <div class="handleIcon" @click="listShow(i)">
  207. <img
  208. src="../../../images/multi.png"
  209. :alt="group.name"
  210. :class="isOpenCloseItems[i] ? 'open' : 'close'"
  211. />
  212. </div>
  213. <h4>{{ group.name }}</h4>
  214. </div>
  215. <div class="title_right">
  216. <el-switch
  217. v-model="group.status"
  218. :active-value="1"
  219. :inactive-value="0"
  220. active-color="#4BC4D7"
  221. inactive-color="#BBBBBB"
  222. ></el-switch>
  223. <span class="titlwSwitchStatus">{{
  224. group.status === 1 ? "启用中" : "未启用"
  225. }}</span>
  226. </div>
  227. </div>
  228. <transition name="plus-icon">
  229. <ul v-show="isOpenCloseItems[i]">
  230. <li
  231. v-for="(item, index) in group.planDetails"
  232. :key="item.id"
  233. :class="((downActive==index||upActive == index)&&item.list)?'b_active':''"
  234. >
  235. <div class="move_btn">
  236. <div class="move_top">
  237. <div
  238. class="img_box ispointer"
  239. v-if="(index !== 0 && ismix(item.name))"
  240. @mouseover="upActive = index"
  241. @mouseout="upActive = null"
  242. @click="
  243. handleMove('up', {
  244. name: item.name,
  245. orderNo: item.orderNo,
  246. groupIndex: i,
  247. itemIndex: index
  248. })
  249. "
  250. >
  251. <img
  252. :src="
  253. upActive === index
  254. ? require('../../../images/icon_hover_top.png')
  255. : require('../../../images/icon_default_top.png')
  256. "
  257. />
  258. </div>
  259. <div class="img_box" v-else></div>
  260. </div>
  261. <div class="move_down">
  262. <div
  263. class="img_box ispointer"
  264. v-if="
  265. (index !== group.planDetails.length - 1 &&
  266. ismix(item.name))
  267. "
  268. @mouseover="downActive = index"
  269. @mouseout="downActive = null"
  270. @click="
  271. handleMove('down', {
  272. name: item.name,
  273. orderNo: item.orderNo,
  274. groupIndex: i,
  275. itemIndex: index
  276. })
  277. "
  278. >
  279. <img
  280. :src="
  281. downActive === index
  282. ? require('../../../images/icon_hover_down.png')
  283. : require('../../../images/icon_default_down.png')
  284. "
  285. />
  286. </div>
  287. <div class="img_box" v-else></div>
  288. </div>
  289. </div>
  290. <div class="list_right" v-if="!item.list">
  291. <div class="list_right" style="position: relative;">
  292. <div class="right_l">
  293. <div class="list_item_title">
  294. {{ item.name }}
  295. </div>
  296. <div class="list_item_swich">
  297. <el-switch
  298. v-model="item.status"
  299. :active-value="1"
  300. :inactive-value="0"
  301. active-color="#4BC4D7"
  302. inactive-color="#BBBBBB"
  303. ></el-switch>
  304. <span class="planStatus">{{
  305. item.status === 1 ? "启用中" : "未启用"
  306. }}</span>
  307. </div>
  308. <el-tooltip class="item" effect="dark" :content="tipGe" placement="top">
  309. <img :src="require('@/images/tip.png')" v-if="item.code==='general'" class="tipImg">
  310. </el-tooltip>
  311. </div>
  312. <div v-if="item.number" style="position: relative;"class="pr-10">
  313. <span style="margin-right: 8px">默认显示个数</span>
  314. <el-select
  315. v-model="item.number"
  316. placeholder="请选择"
  317. size="small"
  318. :disabled="item.status !== 1 ? true : false"
  319. >
  320. <el-option label="1" :value="1"></el-option>
  321. <el-option label="2" :value="2"></el-option>
  322. <el-option label="3" :value="3"></el-option>
  323. <el-option label="4" :value="4"></el-option>
  324. <el-option label="5" :value="5"></el-option>
  325. <el-option label="6" :value="6"></el-option>
  326. </el-select>
  327. <el-tooltip class="item" effect="dark" :content="item.code==='diag'?tipZn:item.code==='treatment'?tipZy:tipQt" placement="top">
  328. <img :src="require('@/images/tip.png')" v-if="item.code==='casewriting'||item.code==='treatment'||item.code==='diag'" class="tipImg">
  329. </el-tooltip>
  330. </div>
  331. </div>
  332. </div>
  333. <div v-if='item.list' style="width: 100%" class="list-w">
  334. <div
  335. class="list_right list_right1"
  336. v-for="(child,index) in item.list"
  337. :key="index"
  338. style="position: relative;"
  339. >
  340. <div class="right_l">
  341. <div class="list_item_title">
  342. {{ child.name }}
  343. </div>
  344. <div class="list_item_swich" v-if="child.code!='znjs'">
  345. <div @click="isStauts(item,child)" style="display: inline-block;">
  346. <el-switch
  347. v-model="child.status"
  348. :active-value="1"
  349. :inactive-value="0"
  350. active-color="#4BC4D7"
  351. inactive-color="#BBBBBB"
  352. ></el-switch>
  353. </div>
  354. <span class="planStatus">{{
  355. child.status === 1 ? "启用中" : "未启用"
  356. }}</span>
  357. </div>
  358. </div>
  359. <div v-if="child.number" class="pr-10">
  360. <span style="margin-right: 8px">默认显示个数</span>
  361. <el-select
  362. v-model="child.number"
  363. placeholder="请选择"
  364. size="small"
  365. :disabled="child.status !== 1 ? true : false"
  366. >
  367. <el-option label="1" :value="1"></el-option>
  368. <el-option label="2" :value="2"></el-option>
  369. <el-option label="3" :value="3"></el-option>
  370. <el-option label="4" :value="4"></el-option>
  371. <el-option label="5" :value="5"></el-option>
  372. <el-option label="6" :value="6"></el-option>
  373. </el-select>
  374. </div>
  375. <el-tooltip class="item" effect="dark" :content="tipSc" placement="top">
  376. <img :src="require('@/images/tip.png')" v-if="child.code=='maygeneral'||child.code=='maymedicine'||child.code=='mayoperation'||child.code=='maynurse'||child.code=='hasgeneral'||child.code=='hasmedicine'||child.code=='hasoperation'||child.code=='hasnurse'" class="tipImg">
  377. </el-tooltip>
  378. </div>
  379. </div>
  380. </li>
  381. </ul>
  382. </transition>
  383. </div>
  384. </el-form-item>
  385. <el-form-item>
  386. <div>
  387. <el-button style="float: right" type="primary" @click="onSubmit"
  388. >确定</el-button
  389. >
  390. </div>
  391. </el-form-item>
  392. </el-form>
  393. </el-col>
  394. </el-row>
  395. </div>
  396. </el-scrollbar>
  397. </template>
  398. <script>
  399. import api from "@api/cdss.js";
  400. export default {
  401. name: "addPlan",
  402. data() {
  403. var numreg = /^[a-zA-Z0-9_\u4e00-\u9fa5]+$/;
  404. var numreg1 = /^[0-9a-zA-Z_]{1,}$/;
  405. var validatePass = (rule, value, callback) => {
  406. if (!numreg.test(value)) {
  407. callback(new Error("汉字、字母、数字和下划线"));
  408. } else {
  409. callback();
  410. }
  411. };
  412. var validatePass1 = (rule, value, callback) => {
  413. if (!numreg1.test(value)) {
  414. callback(new Error("字母、数字和下划线"));
  415. } else {
  416. callback();
  417. }
  418. };
  419. return {
  420. tipZn:'智能诊断模块内的可能诊断、鉴别诊断、既往诊断取该数量。',//病历书写规范提示
  421. tipQt:'只控制竖版数量,横版默认展示3行',//智能诊断
  422. tipZy:'只控制竖版数量,横版数量默认展示1个',//中药处方推荐
  423. tipGe:'横版、竖版数量都默认展示两行',//一般治疗
  424. tipSc:'竖版、横版数量都默认全量展示',//二级的提示
  425. objOne:{},
  426. upActive: null,
  427. downActive: null,
  428. isEdit: false,
  429. hospitalId: null,
  430. planCode:'',
  431. needDisable:false,
  432. form: {
  433. hospitalId: "",
  434. planName: "",
  435. planCode: "",
  436. planStatus: 1,
  437. planDetailSub: []
  438. },
  439. isOpenCloseItems: { 0: true }, // 是否展开方案配置项
  440. rules: {
  441. planName: [
  442. { required: true, message: "方案名称不能为空", trigger: "change" },
  443. { min: 2, max: 30, message: "长度2-30位", trigger: "blur" },
  444. // { required: true, validator: validatePass, trigger: "blur" }
  445. ],
  446. hospitalId: [
  447. { required: true, message: "医院名称不能为空", trigger: "change" }
  448. // { min: 2, max: 30, message: '长度2-30位', trigger: 'blur' },
  449. // { required: true, validator: validatePass, trigger: 'blur' }
  450. ],
  451. planCode: [
  452. { required: true, message: "方案编码不能为空", trigger: "change" },
  453. { required: true, validator: validatePass1, trigger: "blur" }
  454. ]
  455. },
  456. HospitalInfoList: [], //医院下拉列表
  457. mixArr: ["开单合理性", "高危", "危急值提醒", "其他提醒"],
  458. newList: []
  459. };
  460. },
  461. methods: {
  462. // 对有子集的启用禁用按钮进行联动
  463. isStauts(arr,arrChild){
  464. let len=0; //控制数量
  465. let arrCopy=JSON.parse(JSON.stringify(arr))
  466. if(arr.name=='开单合理性') return
  467. arr.list.forEach(item=>{
  468. if(arrChild.code!=arr.list[0].code&&arrChild.status==1){
  469. //子集选中父级也要选中
  470. this.$set(arr.list[0],'status',arrChild.status)
  471. return
  472. }
  473. if(arr.list[0].status==0){
  474. //父级为0,子级都要为0
  475. this.$set(item,'status',arrChild.status)
  476. return
  477. }
  478. if(arrChild.code==arr.list[0].code&&arr.list[0].status==1){
  479. //父级为1,子级都要为1
  480. this.$set(item,'status',arrChild.status)
  481. return
  482. }
  483. if(item.status===0){
  484. len=len+1;
  485. }
  486. })
  487. if(arr.list.length-1==len&&arrChild.code!=arr.list[0].code){
  488. //当子级都不选中,父级也不选中
  489. this.$set(arr.list[0],'status',0)
  490. }
  491. },
  492. //展开收起控制
  493. listShow(i) {
  494. // TODO Vue监听不到对象中新添加的项,所以复制一份
  495. let obj = { ...this.isOpenCloseItems };
  496. obj[i] === true ? (obj[i] = false) : (obj[i] = true);
  497. this.isOpenCloseItems = obj;
  498. },
  499. onSubmit() {
  500. this.$refs.form.validate((valid) => {
  501. if (valid) {
  502. let params =JSON.parse(JSON.stringify(this.form))
  503. //这里拷贝一份,因为在下面params会被改变
  504. let paramsCopy=JSON.parse(JSON.stringify(params))
  505. params.planDetailParent = params.planDetailSub;
  506. delete params.planDetailSub;
  507. let arr = [];
  508. let index = null;
  509. params.planDetailParent[0].planDetails.forEach((item, i) => {
  510. if (item.name === "开单合理性") {
  511. arr.push(...item.list);
  512. index = i;
  513. }
  514. });
  515. params.planDetailParent[0].planDetails.splice(index, 1, ...arr);
  516. //改变paramsCopy里面的可能诊断和已诊断的数据结构,将数据塞进params
  517. let objArr=[...this.updateDateParam(paramsCopy,"maydiagnose")] //可能诊断
  518. let objhasArr=[...this.updateDateParam(paramsCopy,"hasdiagnose")] //已有诊断
  519. let objArrOne=objArr[0]; //获取可能诊断的对象
  520. delete objArrOne.list //删除可能诊断对象中的多余list
  521. let objhasArrOne=objhasArr[0];
  522. delete objhasArrOne.list
  523. objArr.splice(0,1)
  524. objhasArr.splice(0,1)
  525. params.planDetailParent = params.planDetailParent.map((item) => {
  526. let newArr = [];
  527. if (item.planDetails) {
  528. newArr = item.planDetails.map((child) => {
  529. let obj={
  530. code: child.code,
  531. hospitalId: this.form.hospitalId,
  532. name: child.name,
  533. number: child.number,
  534. orderNo: child.orderNo,
  535. planId: child.planId,
  536. remark: child.remark,
  537. status: child.status,
  538. value: child.value,
  539. id:child.id,
  540. parentId:child.parentId,
  541. planDetailSub:null,
  542. };
  543. if(child.code==='maydiagnose'){
  544. obj=JSON.parse(JSON.stringify(objArrOne));
  545. obj.hospitalId=this.form.hospitalId
  546. obj.planDetailSub=[];
  547. objArr.forEach(item=>{
  548. item.hospitalId=this.form.hospitalId
  549. obj.planDetailSub.push(item)
  550. })
  551. }else if(child.code==='hasdiagnose'){
  552. obj=obj=JSON.parse(JSON.stringify(objhasArrOne));
  553. obj.hospitalId=this.form.hospitalId
  554. obj.planDetailSub=[];
  555. objhasArr.forEach(item=>{
  556. item.hospitalId=this.form.hospitalId
  557. obj.planDetailSub.push(item)
  558. })
  559. }else{
  560. obj= obj
  561. }
  562. return obj
  563. });
  564. }
  565. return {
  566. code: item.code,
  567. hospitalId: this.form.hospitalId,
  568. name: item.name,
  569. number: item.number,
  570. orderNo: item.orderNo,
  571. planDetailSub: newArr,
  572. status: item.status
  573. };
  574. });
  575. //处理开单合理性,删除前端写死的智能警示
  576. params.planDetailParent[0].planDetailSub.forEach((item,index)=>{
  577. if(item.code==="znjs"){
  578. params.planDetailParent[0].planDetailSub.splice(index,1)
  579. }
  580. })
  581. api.savePlanInfoDatas(params).then((res) => {
  582. if (res.data.code === "0") {
  583. this.$message({
  584. showClose: true,
  585. message: "保存成功",
  586. type: "success",
  587. duration: 1000
  588. });
  589. this.isSaveSuccess = true; // 保存成功,可正常退出
  590. this.$router.push({
  591. name: "Plan",
  592. params: Object.assign({}, this.$route.params, {
  593. currentPage: 1
  594. })
  595. });
  596. } else if (res.data.code === "00020007") {
  597. // 方案名/方案编码已存在
  598. this.$message({
  599. showClose: true,
  600. message: res.data.msg,
  601. type: "error",
  602. duration: 1000
  603. });
  604. }
  605. this.saveDisable = false;
  606. });
  607. }
  608. });
  609. },
  610. ismix(val) {
  611. const index = this.mixArr.findIndex((item) => item == val);
  612. if (index <= 0) {
  613. return true;
  614. }
  615. return false;
  616. },
  617. handleMove(type, obj) {
  618. /**
  619. * @params
  620. * type:up/down
  621. * obj:{
  622. * orderNo:当前点击项的orderNo,
  623. * itemIndex:当前点击项的index,
  624. * groupIndex:当前组的index
  625. * }
  626. */
  627. const { name, orderNo, itemIndex, groupIndex } = obj;
  628. // exIndex获取到要交换的Index值
  629. let exIndex = type === "up" ? itemIndex - 1 : itemIndex + 1;
  630. // exOrderNo获取到要交换的orderNo
  631. const exOrder = this.form.planDetailSub[groupIndex].planDetails[exIndex];
  632. // 赋值一份新的数据
  633. let newList = JSON.parse(
  634. JSON.stringify(this.form.planDetailSub[groupIndex].planDetails)
  635. );
  636. // 交换orderNo
  637. newList[exIndex].orderNo = orderNo;
  638. newList[itemIndex].orderNo = exOrder.orderNo;
  639. if (newList[itemIndex].list) {
  640. newList[itemIndex].list[0].orderNo = exOrder.orderNo;
  641. }
  642. // 排序
  643. newList = this.groupSort(newList);
  644. // 更新数据
  645. this.form.planDetailSub[groupIndex].planDetails = newList;
  646. },
  647. // 获取医院下拉列表
  648. getHospitalInfo() {
  649. api.getHospitalInfo().then((res) => {
  650. if (res.data.code === "0") {
  651. this.HospitalInfoList = res.data.data;
  652. }
  653. });
  654. },
  655. // 初始化
  656. fomatArr(data) {
  657. let oneArr = JSON.parse(
  658. JSON.stringify(data[0].planDetails)
  659. );
  660. let list = oneArr.filter((ite) => {
  661. const j = this.mixArr.findIndex((itemB) => itemB === ite.name);
  662. return j !== -1;
  663. });
  664. let biglist = oneArr.filter((ite) => {
  665. const j = this.mixArr.findIndex((itemB) => itemB === ite.name);
  666. return j === -1;
  667. });
  668. let obj = { list };
  669. list.forEach((child) => {
  670. if (child.name === "开单合理性") {
  671. obj.orderNo = child.orderNo;
  672. obj.name = child.name;
  673. obj.id = child.id + "d";
  674. }
  675. });
  676. biglist.push(obj);
  677. this.form.planDetailSub[0].planDetails = this.groupSort(biglist);
  678. },
  679. getDefaultPlans() {
  680. api.getDefaultPlans().then((res) => {
  681. if (res.data.code === "0") {
  682. this.form.planDetailSub = res.data.data.planDetailDefault;
  683. this.fomatArr(res.data.data.planDetailDefault);
  684. //改变可能诊断和已诊断的数据添加list数组,方便页面渲染
  685. this.$nextTick(()=>{
  686. //给开单合理性的list里面加一个固定的智能警示
  687. this.setZnData(this.form.planDetailSub[0].planDetails,'开单合理性')
  688. this.updateDate(this.form.planDetailSub[0].planDetails,'maydiagnose')
  689. this.updateDate(this.form.planDetailSub[0].planDetails,'hasdiagnose')
  690. //处理数量不显示 (备注:因为考虑到客户层面,需要前端特殊处理)
  691. this.delNumber(this.form.planDetailSub[0].planDetails)
  692. this.$forceUpdate()
  693. })
  694. }
  695. });
  696. },
  697. //添加固定的智能警示
  698. setZnData(data,name){
  699. let znjsData={}
  700. data.forEach(item=>{
  701. if(item.name=='开单合理性'){
  702. znjsData.code='znjs';
  703. znjsData.name='智能警示';
  704. znjsData.orderNo=item.orderNo;
  705. znjsData.id=item.id+'s';
  706. // this.$set(item.list,0,znjsData)
  707. item.list.unshift(znjsData)
  708. }
  709. })
  710. },
  711. //处理数量不显示 (备注:因为考虑到客户层面,需要前端特殊处理)
  712. delNumber(datas){
  713. //没有数量的code
  714. let nameArray=["auxiliary",'critical',"maymedicine","mayoperation","maynurse","hasmedicine","hasoperation","hasnurse",'rationali','highrisk ','crivalue','otherremind'];
  715. //递归遍历将没用数量设置为空不展示
  716. for (let i in datas){
  717. nameArray.some(item=>{
  718. if(item==datas[i].code){
  719. return datas[i].number=null;
  720. }
  721. })
  722. if(datas[i].planDetails){
  723. this.delNumber(datas[i].planDetails)
  724. }
  725. }
  726. },
  727. // 相应数组排序
  728. groupSort(arr) {
  729. if (Array.isArray(arr)) {
  730. for (let i = arr.length - 1; i > 0; i--) {
  731. for (let j = 0; j < i; j++) {
  732. if (arr[j].orderNo > arr[j + 1].orderNo) {
  733. [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
  734. }
  735. }
  736. }
  737. return arr;
  738. }
  739. },
  740. // 编辑获取默认数据
  741. async getPlanInfoIds(params) {
  742. try {
  743. const res = await api.getPlanInfoIds(params);
  744. if (res.data.code === "0") {
  745. const obj = res.data.data[0];
  746. // // 合并默认数据
  747. const { data } = this.$route.params;
  748. this.form = {
  749. hospitalId: obj.hospitalId,
  750. planName: obj.planName,
  751. planCode: obj.planCode,
  752. planStatus: obj.planStatus,
  753. planDetailSub: obj.sysSetInfo,
  754. id: data.id
  755. };
  756. const defaultRes = await api.getDefaultPlans();
  757. if (defaultRes.data.code === "0") {
  758. this.mergeDefaultPlans(defaultRes.data.data.planDetailDefault);
  759. this.$nextTick(()=>{
  760. //给开单合理性的list里面加一个固定的智能警示
  761. this.setZnData(this.form.planDetailSub[0].planDetails,'开单合理性')
  762. // 改数组里面的可能诊断和已有诊断
  763. this.updateDate(this.form.planDetailSub[0].planDetails,'maydiagnose')
  764. this.updateDate(this.form.planDetailSub[0].planDetails,'hasdiagnose')
  765. //处理数量不显示
  766. this.delNumber(this.form.planDetailSub[0].planDetails)
  767. this.$forceUpdate()
  768. })
  769. }
  770. }
  771. } catch (err) {
  772. console.error("err", err);
  773. }
  774. },
  775. // 合并默认数据
  776. mergeDefaultPlans(data) {
  777. if (!this.form.planDetailSub) {
  778. this.form.planDetailSub = data;
  779. }
  780. data.forEach((item) => {
  781. const oneIndex = this.form.planDetailSub.findIndex(
  782. (ite) => ite.name === item.name
  783. );
  784. // 第一层数据不存在的话,直接加入进去
  785. if (oneIndex === -1) {
  786. item.status = 0;
  787. this.form.planDetailSub.push(item);
  788. } else if (!this.form.planDetailSub[oneIndex].planDetails) {
  789. this.form.planDetailSub[oneIndex].planDetails = item.planDetails;
  790. } else {
  791. // 第一层数据存在,验证第二层
  792. item.planDetails &&
  793. item.planDetails.forEach((child) => {
  794. const twoArr = this.form.planDetailSub[oneIndex].planDetails;
  795. const childIndex = twoArr
  796. ? twoArr.findIndex((it) => it.name === child.name)
  797. : null;
  798. // 第二层数据不存在,直接添加进去
  799. if (childIndex && childIndex === -1) {
  800. child.status = 0;
  801. this.form.planDetailSub[oneIndex].planDetails.push(child);
  802. }
  803. });
  804. }
  805. });
  806. // 排序
  807. const newData = this.groupSort(this.form.planDetailSub);
  808. newData.forEach((sun) => {
  809. if (sun.planDetails) {
  810. this.groupSort(sun.planDetails);
  811. }
  812. });
  813. this.fomatArr(newData);
  814. },
  815. // 修改请求数据中的可能诊断和已诊断的数据模式
  816. updateDate(array,name){
  817. array.forEach(item=>{
  818. if(item.code===name){
  819. this.$set(item,'list',[])
  820. if(Array.isArray(item.planDetails)){
  821. item.planDetails.forEach((items)=>{
  822. item.list.push(items)
  823. })
  824. }
  825. let itemCopy=JSON.parse(JSON.stringify(item))
  826. delete itemCopy.planDetails
  827. item.list.unshift(itemCopy)
  828. }
  829. })
  830. },
  831. // 修改params里面的可能诊断和已诊断数据
  832. updateDateParam(arrayCopy,name){
  833. let dataList=[]
  834. arrayCopy.planDetailSub[0].planDetails.forEach((item)=>{
  835. if(item.code===name){
  836. dataList=item.list
  837. }
  838. })
  839. return dataList
  840. },
  841. },
  842. created() {
  843. const { isEdit, data, needDisable } = this.$route.params;
  844. this.needDisable = needDisable;
  845. this.getHospitalInfo(); // 获取医院下拉列表
  846. if (isEdit) {
  847. // 编辑页面
  848. this.isEdit = true;
  849. this.hospitalId = data.hospitalId
  850. this.planCode = data.planCode
  851. let params = {
  852. hospitalId: data.hospitalId,
  853. id: data.id
  854. };
  855. this.getPlanInfoIds(params);
  856. } else {
  857. // 新增页面
  858. this.getDefaultPlans(); // 获取默认配置信息
  859. }
  860. }
  861. };
  862. </script>