AddPlan.vue 32 KB

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