frameTreeView.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. <template>
  2. <div>
  3. <el-container :style="{height: asideHeight+'px'}">
  4. <el-aside width="280px" style="border-color: rgb(238, 241, 246)">
  5. <div class="el-row--flex">
  6. <el-input
  7. v-model="filterText"
  8. :placeholder="this.$t('frameManage.keywordsFilter')"
  9. clearable
  10. />
  11. <el-button
  12. type="text"
  13. size="mini"
  14. style="margin-left: 10px;color: #67C23A"
  15. @click="quickCreateFrame"
  16. >{{ this.$t('frameManage.quickCreate') }}</el-button>
  17. </div>
  18. <el-tree
  19. ref="frameTree"
  20. :data="treeData"
  21. :show-checkbox="false"
  22. node-key="id"
  23. :default-expand-all="true"
  24. :auto-expand-parent="true"
  25. :expand-on-click-node="false"
  26. :highlight-current="true"
  27. :current-node-key="selectedNodeId"
  28. draggable
  29. :accordion="true"
  30. :filter-node-method="filterNode"
  31. @node-drag-start="nodeDragStart"
  32. @node-drop="nodeDrop"
  33. @node-click="nodeClick"
  34. >
  35. <span slot-scope="{ node, data }" class="custom-tree-node">
  36. <el-tooltip
  37. :content="data.full_name"
  38. :disabled="isShowTooltip"
  39. :open-delay="300"
  40. placement="top"
  41. effect="dark"
  42. >
  43. <!-- <span><svg-icon :icon-class="data.type===4?'sickroom':data.type===5?'bed':'area'" />{{ data.full_name }}</span>-->
  44. <span @mouseover="mouseOver($event)"
  45. class="over-ellipsis"
  46. ><svg-icon
  47. :style="data.customer_id ? 'color: #0a901c' : ''"
  48. :icon-class="data.type===4?'sickroom':data.type===5?'bed':'area'"
  49. />{{ data.full_name }}</span>
  50. </el-tooltip>
  51. <span class="top-right">
  52. <el-button
  53. v-if="data.type!==5"
  54. type="text"
  55. size="mini"
  56. icon="el-icon-plus"
  57. @click.stop="() => append(data)"
  58. />
  59. <el-button
  60. type="text"
  61. v-if="data.type===5||data.type===4"
  62. size="mini"
  63. icon="el-icon-edit"
  64. @click.stop="() => edit(data)"
  65. />
  66. <el-button
  67. type="text"
  68. v-if="data.type===5||data.type===4"
  69. :disabled="data.type===1 || data.type===3"
  70. size="mini"
  71. icon="el-icon-delete"
  72. @click.stop="() => remove(data)"
  73. />
  74. <el-tooltip class="item" effect="light" :content="$t('frameManage.renameRooms')" placement="top">
  75. <el-button
  76. v-if="data.type===3"
  77. type="text"
  78. size="mini"
  79. icon="el-icon-c-scale-to-original"
  80. @click.stop="() => batchRenameRoom(data)"
  81. />
  82. </el-tooltip>
  83. <el-tooltip class="item" effect="light" :content="$t('frameManage.renameBeds')" placement="top">
  84. <el-button
  85. v-if="data.type===3"
  86. type="text"
  87. size="mini"
  88. icon="el-icon-tickets"
  89. @click.stop="() => beatchRenameBed(data)"
  90. />
  91. </el-tooltip>
  92. </span>
  93. </span>
  94. </el-tree>
  95. </el-aside>
  96. <el-main>
  97. <el-tabs v-model="activeName" style="margin:0px;" type="border-card">
  98. <el-tab-pane :label="this.$t('frameManage.memberList')" name="frameInfo">
  99. <keep-alive>
  100. <customer-manager v-if="uiVersion===2" :frame="selectedNode" @saved="handleCustomerChange" />
  101. <patient-manager v-if="uiVersion===1" :frame="selectedNode" @saved="handleCustomerChange" />
  102. <elderly-care-manager v-if="uiVersion===3" :frame="selectedNode" @saved="handleCustomerChange" />
  103. </keep-alive>
  104. </el-tab-pane>
  105. <el-tab-pane :label="this.$t('frameManage.deviceList')" name="deviceList">
  106. <keep-alive>
  107. <device-manager :frame="selectedNode" />
  108. </keep-alive>
  109. </el-tab-pane>
  110. </el-tabs>
  111. </el-main>
  112. </el-container>
  113. <!---添加空间结构弹窗 -->
  114. <el-dialog :title="frameEditTitle" :visible.sync="frameDialogVisible" width="500px">
  115. <el-form ref="editForm" :model="frameInfo" :rules="rules" label-width="130px">
  116. <el-row>
  117. <el-col :span="24">
  118. <!--医院结构名称-->
  119. <el-form-item :label="this.$t('action.name')" prop="name">
  120. <el-input v-model="frameInfo.name" :maxlength="20" @change="frameChange">
  121. <template slot="append">{{ frameInfo.type === 4? this.$t('frameManage.room') : this.$t('frameManage.bed') }}</template>
  122. </el-input>
  123. </el-form-item>
  124. </el-col>
  125. </el-row>
  126. <el-row>
  127. <el-col :span="24">
  128. <!--医院结构别名-->
  129. <el-form-item :label="this.$t('action.alias')" prop="alias">
  130. <el-input v-model="frameInfo.alias" :maxlength="20" />
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <el-row>
  135. <el-col :span="24">
  136. <!--医院结构别名-->
  137. <el-form-item :label="this.$t('action.fullName')" prop="full_name">
  138. <el-input v-model="frameInfo.full_name" :maxlength="20" />
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <el-row hidden>
  143. <el-col :span="12">
  144. <el-form-item :label="this.$t('action.type')">
  145. <el-radio v-model="frameInfo.type" :label="1">{{ this.$t('frameManage.room') }}</el-radio>
  146. <el-radio v-model="frameInfo.type" :label="2">{{ this.$t('frameManage.bed') }}</el-radio>
  147. </el-form-item>
  148. </el-col>
  149. </el-row>
  150. <el-form-item>
  151. <el-button type="primary" class="save" @click="handleFrameSubmit('editForm')">{{ this.$t('action.yes') }}</el-button>
  152. </el-form-item>
  153. </el-form>
  154. </el-dialog>
  155. <!---添加空间结构弹窗 -->
  156. <!---快速创建结构弹窗 -->
  157. <el-dialog :title="this.$t('frameManage.quickCreateFrame')" :visible.sync="frameQuickCreateVisible" width="620px">
  158. <el-form ref="createFrameForm" :model="createFrameModel" :rules="createFrameRules" label-width="200px">
  159. <el-row>
  160. <el-col :span="17">
  161. <!--前缀-->
  162. <el-form-item :label="this.$t('frameManage.prefix')" prop="prefix">
  163. <el-input v-model="createFrameModel.prefix" :placeholder="$t('frameManage.prefixExample')" maxlength="10" show-word-limit />
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="6">
  167. <div class="el-form-item__label" style="margin-left: 20px">
  168. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.prefixExample') }}
  169. </div>
  170. </el-col>
  171. </el-row>
  172. <el-row>
  173. <el-col :span="24">
  174. <!--开始房间号-->
  175. <el-form-item :label="this.$t('frameManage.startRoom')" prop="start_no">
  176. <el-input-number v-model="createFrameModel.room_start_no" :min="1" @change="roomStartChange" />
  177. </el-form-item>
  178. </el-col>
  179. </el-row>
  180. <el-row>
  181. <el-col :span="24">
  182. <!--结束房间号-->
  183. <el-form-item :label="this.$t('frameManage.endRoom')" prop="end_no">
  184. <el-input-number v-model="createFrameModel.room_end_no" :min="createFrameModel.room_start_no" />
  185. </el-form-item>
  186. </el-col>
  187. </el-row>
  188. <el-row>
  189. <el-col :span="24">
  190. <!--每房床位数-->
  191. <el-form-item :label="this.$t('frameManage.bedQuantity')" prop="beds_per_room">
  192. <el-input-number v-model="createFrameModel.beds_per_room" :min="1" :max="20" />
  193. </el-form-item>
  194. </el-col>
  195. </el-row>
  196. <el-row>
  197. <el-col :span="18">
  198. <!--每房床位数-->
  199. <el-form-item :label="this.$t('frameManage.showRoomDigit')" prop="room_num_bits">
  200. <el-input-number v-model="createFrameModel.room_num_bits" :min="1" :max="4" @change="(val)=>{bitNumChange(val,'room')}" />
  201. </el-form-item>
  202. </el-col>
  203. <el-col :span="6">
  204. <div class="el-form-item__label">
  205. {{ this.$t('frameManage.example') }}:{{ room_num_demo }}
  206. </div>
  207. </el-col>
  208. </el-row>
  209. <el-row>
  210. <el-col :span="18">
  211. <!--每房床位数-->
  212. <el-form-item :label="this.$t('frameManage.showBedDigit')" prop="bed_num_bits">
  213. <el-input-number v-model="createFrameModel.bed_num_bits" :min="1" :max="4" @change="(val)=>{bitNumChange(val,'bed')}" />
  214. </el-form-item>
  215. </el-col>
  216. <el-col :span="6">
  217. <div class="el-form-item__label">
  218. {{ this.$t('frameManage.example') }}:{{ bed_num_demo }}
  219. </div>
  220. </el-col>
  221. </el-row>
  222. <el-row>
  223. <el-col :span="17">
  224. <!--需要跳过的房间号-->
  225. <el-form-item :label="this.$t('frameManage.skipRoomNo')" prop="skip_room_no">
  226. <el-input v-model="createFrameModel.skip_room_no" :placeholder="$t('frameManage.skipMsg1')" clearable :maxlength="20"/>
  227. </el-form-item>
  228. </el-col>
  229. <el-col :span="6">
  230. <div class="el-form-item__label" style="margin-left: 20px">
  231. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.skipMsg2') }}
  232. </div>
  233. </el-col>
  234. </el-row>
  235. <el-row>
  236. <el-col :span="17">
  237. <!--需要跳过的床位号-->
  238. <el-form-item :label="this.$t('frameManage.skipBedNo')" prop="skip_bed_no">
  239. <el-input v-model="createFrameModel.skip_bed_no" :placeholder="$t('frameManage.skipMsg1')" clearable :maxlength="20"/>
  240. </el-form-item>
  241. </el-col>
  242. <el-col :span="6">
  243. <div class="el-form-item__label" style="margin-left: 20px">
  244. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.skipMsg2') }}
  245. </div>
  246. </el-col>
  247. </el-row>
  248. <el-form-item>
  249. <el-button type="primary" class="save" @click="quickCreateSubmit()">{{ this.$t('action.yes') }}</el-button>
  250. </el-form-item>
  251. </el-form>
  252. </el-dialog>
  253. <!---快速创建结构弹窗 -->
  254. <!--重命名床位-->
  255. <el-dialog :title="this.$t('frameManage.renameBeds')" :visible.sync="renameBedVisible" width="620px">
  256. <el-form ref="createFrameForm" :model="renameBedFrameModel" :rules="createFrameRules" label-width="200px">
  257. <el-row>
  258. <el-col :span="24">
  259. <el-form-item :label="$t('frameManage.renameRule')">
  260. <el-radio-group v-model="renameBedFrameModel.rename_type">
  261. <el-radio :label="1">{{$t('frameManage.orderInPart')}}</el-radio>
  262. <el-radio :label="2">{{$t('frameManage.orderInRoom')}}</el-radio>
  263. </el-radio-group>
  264. </el-form-item>
  265. </el-col>
  266. <el-col :span="17">
  267. <!--前缀-->
  268. <el-form-item :label="this.$t('frameManage.prefix')" prop="prefix">
  269. <el-input v-model="renameBedFrameModel.prefix" @change="generateBedExample" :placeholder="$t('frameManage.renamePrefixExample')" maxlength="10" show-word-limit />
  270. </el-form-item>
  271. </el-col>
  272. <el-col :span="6">
  273. <div class="el-form-item__label" style="margin-left: 20px">
  274. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.renamePrefixExample') }}
  275. </div>
  276. </el-col>
  277. </el-row>
  278. <el-row>
  279. <el-col :span="18">
  280. <!--床位数字位数-->
  281. <el-form-item :label="this.$t('frameManage.showBedDigit')" prop="bed_num_bits">
  282. <el-input-number v-model="renameBedFrameModel.bed_num_bits" :min="1" :max="4" @change="(val)=>{renameBedBitNumChange(val,'bed')}" />
  283. </el-form-item>
  284. </el-col>
  285. <el-col :span="6">
  286. <div class="el-form-item__label">
  287. {{ this.$t('frameManage.example') }}:{{ bed_num_demo }}
  288. </div>
  289. </el-col>
  290. </el-row>
  291. <el-row>
  292. <el-col :span="17">
  293. <!--需要跳过的床位号-->
  294. <el-form-item :label="this.$t('frameManage.skipBedNo')" prop="skip_bed_no">
  295. <el-input v-model="renameBedFrameModel.skip_bed_no" @change="generateBedExample" :placeholder="$t('frameManage.skipMsg1')" clearable :maxlength="100"/>
  296. </el-form-item>
  297. </el-col>
  298. <el-col :span="6">
  299. <div class="el-form-item__label" style="margin-left: 20px">
  300. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.skipMsg2') }}
  301. </div>
  302. </el-col>
  303. </el-row>
  304. <el-row>
  305. <el-col :span="17">
  306. <!--名称后缀-->
  307. <el-form-item :label="this.$t('frameManage.nameSuffix')" prop="prefix">
  308. <el-input v-model="renameBedFrameModel.name_suffix" :placeholder="$t('frameManage.suffixExample')" maxlength="10" show-word-limit />
  309. </el-form-item>
  310. </el-col>
  311. <el-col :span="6">
  312. <div class="el-form-item__label" style="margin-left: 20px">
  313. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.suffixExample') }}
  314. </div>
  315. </el-col>
  316. </el-row>
  317. <el-row>
  318. <el-col :span="17">
  319. <!--全名后缀-->
  320. <el-form-item :label="this.$t('frameManage.suffix')" prop="prefix">
  321. <el-input v-model="renameBedFrameModel.suffix" :placeholder="$t('frameManage.suffixExample')" maxlength="10" show-word-limit />
  322. </el-form-item>
  323. </el-col>
  324. <el-col :span="6">
  325. <div class="el-form-item__label" style="margin-left: 20px">
  326. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.suffixExample') }}
  327. </div>
  328. </el-col>
  329. </el-row>
  330. <el-row>
  331. <el-form-item >
  332. <el-checkbox v-model="renameBedFrameModel.all_part" :true-label="1" :false-label="0">{{ this.$t('frameManage.updateForAllPart') }}</el-checkbox>
  333. </el-form-item>
  334. </el-row>
  335. <el-row>
  336. <el-form-item :label="this.$t('frameManage.namePreview')" >
  337. <el-tag v-for="item in bedExamples" :key="item.name">{{item.name}}{{renameBedFrameModel.name_suffix}}</el-tag>
  338. </el-form-item>
  339. <el-form-item :label="this.$t('frameManage.fullNamePreview')" >
  340. <el-tag v-for="item in bedExamples" :key="item.name">{{item.name}}{{renameBedFrameModel.suffix}}</el-tag>
  341. </el-form-item>
  342. </el-row>
  343. <el-form-item>
  344. <el-button type="primary" class="save" @click="renameBedNameSubmit">{{ this.$t('action.yes') }}</el-button>
  345. </el-form-item>
  346. </el-form>
  347. </el-dialog>
  348. <!--重命名床位-->
  349. <!-- 重命名房间名称-->
  350. <el-dialog :title="this.$t('frameManage.renameRooms')" :visible.sync="renameRoomVisible" width="620px">
  351. <el-form ref="createFrameForm" :model="renameRoomFrameModel" :rules="createFrameRules" label-width="200px">
  352. <el-row>
  353. <el-col :span="17">
  354. <!--前缀-->
  355. <el-form-item :label="this.$t('frameManage.prefix')" prop="prefix">
  356. <el-input v-model="renameRoomFrameModel.prefix" @change="generateRoomExample" :placeholder="$t('frameManage.renamePrefixExample')" maxlength="10" show-word-limit />
  357. </el-form-item>
  358. </el-col>
  359. <el-col :span="6">
  360. <div class="el-form-item__label" style="margin-left: 20px">
  361. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.renamePrefixExample') }}
  362. </div>
  363. </el-col>
  364. </el-row>
  365. <el-row>
  366. <el-col :span="18">
  367. <!--床位数字位数-->
  368. <el-form-item :label="this.$t('frameManage.showRoomDigit')" prop="room_num_bits">
  369. <el-input-number v-model="renameRoomFrameModel.room_num_bits" :min="1" :max="4" @change="(val)=>{renameRoomBitNumChange(val,'bed')}" />
  370. </el-form-item>
  371. </el-col>
  372. <el-col :span="6">
  373. <div class="el-form-item__label">
  374. {{ this.$t('frameManage.example') }}:{{ bed_num_demo }}
  375. </div>
  376. </el-col>
  377. </el-row>
  378. <el-row>
  379. <el-col :span="17">
  380. <!--需要跳过的床位号-->
  381. <el-form-item :label="this.$t('frameManage.skipRoomNo')" prop="skip_room_no">
  382. <el-input v-model="renameRoomFrameModel.skip_room_no" @change="generateRoomExample" :placeholder="$t('frameManage.skipMsg1')" clearable :maxlength="100"/>
  383. </el-form-item>
  384. </el-col>
  385. <el-col :span="6">
  386. <div class="el-form-item__label" style="margin-left: 20px">
  387. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.skipMsg2') }}
  388. </div>
  389. </el-col>
  390. </el-row>
  391. <el-row>
  392. <el-col :span="17">
  393. <!--全名后缀-->
  394. <el-form-item :label="this.$t('frameManage.roomSuffix')" prop="prefix">
  395. <el-input v-model="renameRoomFrameModel.suffix" :placeholder="$t('frameManage.room')" maxlength="10" show-word-limit />
  396. </el-form-item>
  397. </el-col>
  398. <el-col :span="6">
  399. <div class="el-form-item__label" style="margin-left: 20px">
  400. {{ this.$t('frameManage.example') }}:{{ $t('frameManage.room') }}
  401. </div>
  402. </el-col>
  403. </el-row>
  404. <el-row>
  405. <el-form-item >
  406. <el-checkbox v-model="renameRoomFrameModel.all_part" :true-label="1" :false-label="0">{{ this.$t('frameManage.updateForAllPart') }}</el-checkbox>
  407. </el-form-item>
  408. </el-row>
  409. <el-row>
  410. <el-form-item :label="this.$t('frameManage.namePreview')" >
  411. <el-tag v-for="item in roomExamples" :key="item.name">{{item.name}}{{renameRoomFrameModel.suffix}}</el-tag>
  412. </el-form-item>
  413. </el-row>
  414. <el-form-item>
  415. <el-button type="primary" class="save" @click="renameRoomNameSubmit">{{ this.$t('action.yes') }}</el-button>
  416. </el-form-item>
  417. </el-form>
  418. </el-dialog>
  419. <!--- 重命名房间 -->
  420. </div>
  421. </template>
  422. <script>
  423. import * as HospitalFrame_API from '@/api/ncs_hospitalFrame'
  424. import * as API_Frame from '@/api/ncs_hospitalFrame'
  425. import CustomerManager from '../customer/components/customerManager'
  426. import DeviceManager from '../ncs-device/components/deviceManager'
  427. import PatientManager from '../customer/components/patientManager'
  428. // import { uiVersion } from '@/utils/domain'
  429. import { FRAME_TYPE } from '@/utils/enum/FrameTypeEnum'
  430. import ElderlyCareManager from "../customer/components/elderlyCareManager"
  431. const uiVersion = domain.uiVersion
  432. export default {
  433. name: 'FrameTreeView',
  434. components: {ElderlyCareManager, PatientManager, DeviceManager, CustomerManager },
  435. data() {
  436. return {
  437. treeData: [],
  438. treeDataClone: [],
  439. isShowTooltip: false,
  440. /** 当前选中的树节点 */
  441. selectedNodeId: 0,
  442. selectedNode: {},
  443. filterText: '',
  444. activeName: 'frameInfo',
  445. /** 上级机构数组 **/
  446. parents: [],
  447. /** frame 编辑弹窗 **/
  448. frameEditTitle: this.$t('action.add'),
  449. frameDialogVisible: false,
  450. renameBedVisible:false,
  451. renameRoomVisible:false,
  452. frameInfo: {},
  453. renameBedFrameModel:{
  454. bed_num_bits:2,
  455. rename_type:1,
  456. all_part:0
  457. },
  458. renameRoomFrameModel:{
  459. room_num_bits:2,
  460. all_part:0
  461. },
  462. bedExamples:[{name:'01'},{name:'02'},{name:'03'},{name:'04'},{name:'05'},{name:'06'},{name:'07'},{name:'08'},{name:'09'},{name:'10'}],
  463. roomExamples:[{name:'01'},{name:'02'},{name:'03'},{name:'04'},{name:'05'},{name:'06'},{name:'07'},{name:'08'},{name:'09'},{name:'10'}],
  464. rules: {
  465. name: [
  466. this.MixinRequired(this.$t('frameManage.inputFrameName')),
  467. { min: 1, max: 20, message: this.$t('frameManage.inputLong'), trigger: 'blur' }
  468. ],
  469. alias: [
  470. { min: 1, max: 20, message: this.$t('frameManage.inputLong'), trigger: 'blur' }
  471. ],
  472. full_name: [
  473. this.MixinRequired(this.$t('frameManage.inputFrameFullName')),
  474. { min: 1, max: 20, message: this.$t('frameManage.inputLong'), trigger: 'blur' }
  475. ]
  476. },
  477. /** 快速创建空间结构弹窗 **/
  478. frameQuickCreateVisible: false,
  479. createFrameModel: {
  480. prefix: '',
  481. room_start_no: 1,
  482. room_end_no: 2,
  483. beds_per_room: 4,
  484. room_num_bits: 2,
  485. bed_num_bits: 2,
  486. skip_room_no: '',
  487. skip_bed_no: ''
  488. },
  489. bed_num_demo: '01',
  490. room_num_demo: '01',
  491. createFrameRules: {
  492. },
  493. uiVersion: uiVersion
  494. }
  495. },
  496. computed: {
  497. asideHeight() {
  498. return this.mainAreaHeight
  499. }
  500. },
  501. watch: {
  502. selectedNodeId(newval, old) {
  503. console.log('watch', newval)
  504. this.selectedNode = this.findNodeById(this.treeData, newval)
  505. },
  506. filterText(val) {
  507. this.$refs.frameTree.filter(val)
  508. }
  509. },
  510. mounted() {
  511. this.getFrameTree().then(() => {
  512. this.selectedNodeId = this.treeData[0].id
  513. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  514. }).catch(err => {
  515. this.$message.error(err.message)
  516. })
  517. },
  518. methods: {
  519. /**
  520. * 获取空间结构树形数据
  521. * */
  522. getFrameTree() {
  523. return new Promise((resolve, reject) => {
  524. API_Frame.getframestruct(this.$store.getters.partId, FRAME_TYPE.PART).then(res => {
  525. this.treeData = res.frameTree
  526. resolve()
  527. }).catch(err => {
  528. reject(err)
  529. })
  530. })
  531. },
  532. append(data) {
  533. if (data.type === FRAME_TYPE.ROOM) {
  534. this.frameEditTitle = '【' + data.full_name + '】' + this.$t('frameManage.addBed')
  535. } else {
  536. this.frameEditTitle = '【' + data.full_name + '】' + this.$t('frameManage.addRoom')
  537. }
  538. this.frameInfo = {
  539. hospital_id: data.hospital_id,
  540. parent_id: data.id,
  541. type: data.type === FRAME_TYPE.ROOM ? FRAME_TYPE.BED : FRAME_TYPE.ROOM,
  542. parent_name: data.name,
  543. name: '',
  544. alias: ''
  545. }
  546. this.frameDialogVisible = true
  547. console.log('append', data)
  548. },
  549. edit(data, e) {
  550. const parentNode = this.findNodeById(this.treeData, data.parent_id)
  551. this.frameInfo = {
  552. ...data,
  553. parent_name: parentNode === null ? '' : parentNode.name
  554. }
  555. this.frameEditTitle = this.$t('frameManage.editFrame')
  556. this.frameDialogVisible = true
  557. },
  558. remove(data) {
  559. let warning = ''
  560. if (data.type === FRAME_TYPE.ROOM) {
  561. warning = this.$t('frameManage.sureDelete') + '【' + data.full_name + '】' + this.$t('frameManage.allBad')
  562. } else {
  563. warning = this.$t('frameManage.sureDeleteBed') + '【' + data.full_name + '】?'
  564. }
  565. this.$confirm(warning, this.$t('action.waring' + ''), {
  566. confirmButtonText: this.$t('action.yes'),
  567. cancelButtonText: this.$t('action.cancel'),
  568. type: 'warning'
  569. }).then(() => {
  570. HospitalFrame_API.deleteHospitalFrame(data.id).then(response => {
  571. this.$message({
  572. type: 'success',
  573. message: this.$t('action.deleted')
  574. })
  575. this.getFrameTree().then(() => {
  576. // 判断选中节点是否被删除,如果被删除需要重新选择根节点
  577. const selectNode = this.findNodeById(this.treeData, this.selectedNodeId)
  578. if (selectNode === null) {
  579. this.selectedNodeId = this.treeData[0].id
  580. }
  581. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  582. })
  583. }).catch(response => {
  584. this.$message({
  585. type: 'info',
  586. message: response.message
  587. })
  588. })
  589. }).catch(() => {
  590. })
  591. },
  592. handleFrameSubmit(formName) {
  593. this.$refs[formName].validate(valid => {
  594. if (valid) {
  595. const params = this.MixinClone(this.frameInfo)
  596. if (params.id) {
  597. HospitalFrame_API.updateHospitalFrame(params.id, params).then(response => {
  598. this.$message.success(this.$t('action.editSuccess') + '')
  599. this.frameDialogVisible = false
  600. this.getFrameTree().then(() => {
  601. this.selectedNodeId = response.id
  602. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  603. })
  604. })
  605. } else {
  606. if (!params.part_id) {
  607. params.part_id = this.$store.getters.partId
  608. }
  609. HospitalFrame_API.addHospitalFrame(params).then(response => {
  610. this.$message.success(this.$t('action.addSuccess') + '')
  611. this.frameDialogVisible = false
  612. this.getFrameTree()
  613. })
  614. }
  615. } else {
  616. this.$message.error(this.$t('action.fromError'))
  617. return false
  618. }
  619. })
  620. },
  621. /** 开始拖拽之前保存treeData数据,拖拽完成后判定能否拖拽到目标节点,不允许拖拽把初始数据覆盖拖拽后的数据,否则拖拽成功
  622. * @param node
  623. * @param event
  624. */
  625. nodeDragStart(node, event) {
  626. this.treeDataClone = this.MixinClone(this.treeData)
  627. },
  628. /** 拖拽结束 **/
  629. nodeDrop(node, target, position, event) {
  630. var success = true
  631. const nparent = this.findNodeById(this.treeDataClone, node.data.parent_id)
  632. const tparent = this.findNodeById(this.treeDataClone, target.data.parent_id)
  633. if (position === 'inner') { // 进入了某个节点之中,不能将某一节点拖入同级节点,也不能跨级拖动
  634. if (Number(node.data.type) <= Number(target.data.type) || Number(node.data.type) - Number(target.data.type) > 1) {
  635. this.treeData = this.treeDataClone
  636. success = false
  637. }
  638. } else {
  639. // 查找Target和node的parent 判定target的parent类型与node的parent类型是否一致
  640. if (nparent === null || tparent === null || nparent.type !== tparent.type) {
  641. this.treeData = this.treeDataClone
  642. success = false
  643. }
  644. }
  645. if (success) { // 拖拽完成,更新node和target排序
  646. HospitalFrame_API.sort(node.data.id, target.data.id, position).then(res => {
  647. this.selectedNodeId = node.data.id
  648. this.getFrameTree().then(() => {
  649. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  650. console.log('sid', this.selectedNodeId)
  651. })
  652. })
  653. }
  654. },
  655. /** 树形结构中查找指定Id节点 */
  656. findNodeById(data, id) {
  657. let node = null
  658. if (data.length > 0) {
  659. for (var i = 0; i < data.length; i++) {
  660. if (data[i].id === id) {
  661. node = data[i]
  662. break
  663. }
  664. if (data[i].children && data[i].children.length > 0) {
  665. const subresult = this.findNodeById(data[i].children, id)
  666. if (subresult !== null) {
  667. node = subresult
  668. break
  669. }
  670. }
  671. }
  672. }
  673. return node
  674. },
  675. /** 节点过滤方法 **/
  676. filterNode(value, data) {
  677. if (!value) return true
  678. return data.full_name.indexOf(value) !== -1
  679. },
  680. /** 点击树形节点 **/
  681. nodeClick(data, node, leaf) {
  682. this.$set(this, 'selectedNodeId', data.id)
  683. },
  684. /** 快速创建空间结构弹窗 **/
  685. quickCreateFrame() {
  686. this.frameQuickCreateVisible = true
  687. },
  688. quickCreateSubmit(formname) {
  689. const params = this.createFrameModel
  690. params.part_frame_id = this.treeData[0].id
  691. HospitalFrame_API.quickCreate(params).then(res => {
  692. this.$message.success(this.$t('action.createSuccess') + '')
  693. this.frameQuickCreateVisible = false
  694. this.getFrameTree().then(() => {
  695. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  696. })
  697. }).catch(err => {
  698. this.$message.error(err.message)
  699. })
  700. },
  701. /** 显示位数变化 **/
  702. bitNumChange(val, frame_type) {
  703. const s = Array(val).join(0) + 1
  704. if (frame_type === 'room') {
  705. this.room_num_demo = s
  706. } else {
  707. this.bed_num_demo = s
  708. }
  709. },
  710. renameBedBitNumChange(val,frame_type){
  711. this.bitNumChange(val,frame_type)
  712. this.generateBedExample()
  713. },
  714. renameRoomBitNumChange(val,frame_type){
  715. this.bitNumChange(val,frame_type)
  716. this.generateRoomExample()
  717. },
  718. /** 起始位数变化 结束位置要根据起始位置的大小来变化 */
  719. roomStartChange(val) {
  720. console.log(val)
  721. if (val > this.createFrameModel.room_end_no) {
  722. this.createFrameModel.room_end_no = val
  723. }
  724. },
  725. /**
  726. * 名称输入变化
  727. * @param val
  728. */
  729. frameChange(val) {
  730. console.log('s', this.frameInfo)
  731. if (!this.frameInfo.full_name) {
  732. if (this.frameInfo.type === FRAME_TYPE.ROOM) {
  733. this.$set(this.frameInfo, 'full_name', val + this.$t('frameManage.room'))
  734. // this.frameInfo.full_name = val
  735. } else {
  736. this.$set(this.frameInfo, 'full_name', this.frameInfo.parent_name + '-' + val + this.$t('frameManage.bed'))
  737. // this.frameInfo.full_name =
  738. }
  739. }
  740. },
  741. handleCustomerChange() {
  742. this.getFrameTree()
  743. },
  744. mouseOver(event) {
  745. this.isShowTooltip =
  746. event.currentTarget.scrollWidth <= event.currentTarget.clientWidth;
  747. },
  748. beatchRenameBed(data){
  749. this.renameBedVisible=true
  750. console.log('data',data)
  751. },
  752. batchRenameRoom(data){
  753. this.renameRoomVisible=true
  754. },
  755. generateBedExample(){
  756. this.bedExamples=[]
  757. let total =10
  758. let skipNumber=[]
  759. if(this.renameBedFrameModel.skip_bed_no!==null&&this.renameBedFrameModel.skip_bed_no!==undefined&&this.renameBedFrameModel.skip_bed_no!==''){
  760. skipNumber = this.renameBedFrameModel.skip_bed_no.split(',').map(p=>Number(p))
  761. console.log('sn',this.renameBedFrameModel.skip_bed_no)
  762. total+=skipNumber.filter(p=>p<=10).length
  763. }else{
  764. total=10
  765. }
  766. for (let i = 1; i <=total ; i++) {
  767. if(skipNumber.includes(i)){
  768. continue
  769. }
  770. this.bedExamples.push({
  771. name:(this.renameBedFrameModel.prefix?this.renameBedFrameModel.prefix:'')+''+this.padding2(i,this.renameBedFrameModel.bed_num_bits)
  772. })
  773. }
  774. },
  775. generateRoomExample(){
  776. this.roomExamples=[]
  777. let total =10
  778. let skipNumber=[]
  779. if(this.renameRoomFrameModel.skip_room_no!==null&&this.renameRoomFrameModel.skip_room_no!==undefined&&this.renameRoomFrameModel.skip_room_no!==''){
  780. skipNumber = this.renameRoomFrameModel.skip_room_no.split(',').map(p=>Number(p))
  781. console.log('sn',this.renameRoomFrameModel.skip_room_no)
  782. total+=skipNumber.filter(p=>p<=10).length
  783. }else{
  784. total=10
  785. }
  786. for (let i = 1; i <=total ; i++) {
  787. if(skipNumber.includes(i)){
  788. continue
  789. }
  790. this.roomExamples.push({
  791. name:(this.renameRoomFrameModel.prefix?this.renameRoomFrameModel.prefix:'')+''+this.padding2(i,this.renameRoomFrameModel.room_num_bits)
  792. })
  793. }
  794. },
  795. padding2(num, length) {
  796. if((num + "").length >= length) {
  797. return num;
  798. }
  799. return this.padding2("0" + num, length)
  800. },
  801. renameBedNameSubmit(){
  802. API_Frame.renameBeds(this.$store.getters.partId,this.renameBedFrameModel).then(res=>{
  803. this.renameBedVisible=false
  804. this.getFrameTree().then(() => {
  805. this.selectedNodeId = this.treeData[0].id
  806. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  807. }).catch(err => {
  808. this.$message.error(err.message)
  809. })
  810. }).catch(err=>{
  811. })
  812. },
  813. renameRoomNameSubmit(){
  814. API_Frame.renameRooms(this.$store.getters.partId,this.renameRoomFrameModel).then(res=>{
  815. this.renameRoomVisible=false
  816. this.getFrameTree().then(() => {
  817. this.selectedNodeId = this.treeData[0].id
  818. this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
  819. }).catch(err => {
  820. this.$message.error(err.message)
  821. })
  822. }).catch(err=>{
  823. })
  824. }
  825. }
  826. }
  827. </script>
  828. <style scoped>
  829. .top-right{
  830. display: block;
  831. min-width: 50px;
  832. width: 60px;
  833. text-align: right;
  834. position: absolute;
  835. right: 1px;
  836. }
  837. .over-ellipsis{
  838. display: block;
  839. width: calc(100% - 60px);
  840. overflow: hidden;
  841. text-overflow: ellipsis;
  842. white-space: nowrap;
  843. }
  844. .el-aside{
  845. margin: 8px;
  846. padding: 8px;
  847. border-width: 1px;
  848. border-style: solid;
  849. background: #fff;
  850. }
  851. .custom-tree-node {
  852. flex: 1;
  853. display: flex;
  854. align-items: center;
  855. justify-content: space-between;
  856. font-size: 14px;
  857. padding-right: 8px;
  858. }
  859. .el-tree{margin-top: 8px}
  860. .el-main{
  861. margin: 8px;
  862. padding: 0;
  863. }
  864. .el-tag+.el-tag{
  865. margin-left: 10px;
  866. }
  867. </style>