AddPlan.vue 29 KB

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