employeeView.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <template>
  2. <el-container :style="{height: asideHeight+'px'}">
  3. <el-aside width="220px" style="overflow: hidden">
  4. <el-scrollbar wrap-class="scrollbar-wrapper">
  5. <el-menu
  6. default-active="0-0"
  7. class="el-menu-vertical-demo"
  8. @open="handleOpen"
  9. @select="handleSelect"
  10. @close="handleClose"
  11. >
  12. <el-submenu v-for="(key,index) in Object.keys(clerks)" :index="index+''" :key="index">
  13. <template slot="title">
  14. <svg-icon icon-class="role"/>
  15. <span>{{key}}</span>
  16. </template>
  17. <el-menu-item-group v-if="clerks[key].length>0">
  18. <el-menu-item :index="index+'-'+_idx" v-for="(item,_idx) in clerks[key]" :key="_idx">
  19. {{item.clerk_name}}
  20. </el-menu-item>
  21. </el-menu-item-group>
  22. </el-submenu>
  23. </el-menu>
  24. </el-scrollbar>
  25. </el-aside>
  26. <el-main :style="{height: (asideHeight-16)+'px'}">
  27. <el-tabs v-model="activeName" type="border-card">
  28. <el-tab-pane :label="this.$t('clerkFrameManage.managedFrames')" name="first">
  29. <div class="inner-toolbar">
  30. <div class="toolbar-search">
  31. <en-table-search :placeholder="this.$t('action.keywords')" @search="(keyword)=>handlerSearchManaged(keyword,1)"/>
  32. </div>
  33. </div>
  34. <el-tabs v-model="activeName2" class="inner-tab-panel" tab-position="left">
  35. <el-tab-pane :label="$t('watch.allFrame')" name="allManaged">
  36. <el-scrollbar wrap-class="scrollbar-wrapper" :style="{height: (asideHeight-171)+'px'}">
  37. <div style="padding: 0 15px">
  38. <!-- <fieldset class="margin-top-sm">-->
  39. <!-- <legend>{{ watchDeviceFrame }}</legend>-->
  40. <el-row :gutter="20" type="flex">
  41. <el-col v-for="(item,index) in clerkManageFrame.managed_frames" :key="index"
  42. :xs="8" :sm="8" :md="6" :lg="4" :xl="4">
  43. <el-card class="box-card">
  44. <div slot="header" class="clearfix">
  45. <svg-icon icon-class="sickroom"
  46. style="color: #9aaabf;margin-right: 5px"/>
  47. <span>{{ item.name }}</span>
  48. <el-checkbox v-model="item.allCkeck" style="float: right"
  49. :indeterminate="item.indeterminate"
  50. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  51. @change="(checked)=>{handleCheckAll(checked,item)}">
  52. {{ $t('action.choiceAll') }}
  53. </el-checkbox>
  54. </div>
  55. <div v-for="(bed,_index) in item.children" :key="_index"
  56. class="text item">
  57. <el-checkbox
  58. v-model="bed.checked"
  59. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  60. @change="handleCheckboxChanged(item)">
  61. <svg-icon icon-class="bed"
  62. style="color: #9aaabf;margin-right: 5px"/>
  63. <span v-if="bed.device_id && !bed.checked"
  64. style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>
  65. <span v-else>{{ bed.full_name }}</span>
  66. </el-checkbox>
  67. </div>
  68. </el-card>
  69. </el-col>
  70. </el-row>
  71. </div>
  72. </el-scrollbar>
  73. </el-tab-pane>
  74. <el-tab-pane v-for="(group,idx) in managedRoomGroup" v-if="group[0]!=='null'" :key="idx"
  75. :label="group[0]" :name="'zone-'+idx">
  76. <el-scrollbar wrap-class="scrollbar-wrapper" :style="{height: (asideHeight-171)+'px'}">
  77. <div style="padding: 0 15px">
  78. <el-row v-if="group[1].length > 1" :gutter="20" type="flex">
  79. <el-col v-for="(item,index) in group[1]" :key="index" :xs="6" :sm="6" :md="4" :lg="4"
  80. :xl="4">
  81. <el-card class="box-card">
  82. <div slot="header" class="clearfix">
  83. <svg-icon icon-class="sickroom"
  84. style="color: #9aaabf;margin-right: 5px"/>
  85. <span>{{ item.name }}</span>
  86. <el-checkbox v-model="item.allCkeck" style="float: right"
  87. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  88. :indeterminate="item.indeterminate"
  89. @change="(checked)=>{handleCheckAll(checked,item)}">
  90. {{ $t('action.choiceAll') }}
  91. </el-checkbox>
  92. </div>
  93. <div v-for="(bed,_index) in item.children" :key="_index" class="text item">
  94. <el-checkbox v-model="bed.checked" :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')">
  95. <svg-icon icon-class="bed" style="color: #9aaabf;margin-right: 5px"/>
  96. <span v-if="bed.device_id && !bed.checked" style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>
  97. <span v-else>{{ bed.full_name }}</span>
  98. </el-checkbox>
  99. <!-- <div v-if="roleId === 8">-->
  100. <!-- <svg-icon icon-class="bed" style="color: #9aaabf;margin-right: 5px" />-->
  101. <!-- <span v-if="bed.device_id && !bed.checked" style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>-->
  102. <!-- <span v-else>{{ bed.full_name }}</span>-->
  103. <!-- </div>-->
  104. </div>
  105. </el-card>
  106. </el-col>
  107. </el-row>
  108. </div>
  109. </el-scrollbar>
  110. </el-tab-pane>
  111. </el-tabs>
  112. <div class="margin-top-xs text-center padding-content">
  113. <el-row>
  114. <el-col :span="8"> <el-checkbox v-if="clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')" v-model="clerkManageFrameSource.bool_phone_acceptor">{{this.$t('clerkFrameManage.phoneAcceptorTipsLeft')}}{{clerkManageFrameSource.clerk_name}}{{this.$t('clerkFrameManage.phoneAcceptorTipsMid')}},{{clerkManageFrameSource.clerk_name}}{{this.$t('clerkFrameManage.phoneAcceptorTipsRight')}}</el-checkbox></el-col>
  115. <el-col :span="8"> <el-button type="primary" :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')" @click="saveClerkManageFrame">{{this.$t('action.saveSettings')}}</el-button></el-col>
  116. <el-col :span="8"></el-col>
  117. </el-row>
  118. </div>
  119. </el-tab-pane>
  120. <el-tab-pane :label="this.$t('clerkFrameManage.notManagedFrames')" name="second">
  121. <div class="inner-toolbar">
  122. <div class="toolbar-search">
  123. <en-table-search :placeholder="this.$t('action.keywords')" @search="(keyword)=>handlerSearchManaged(keyword,2)"/>
  124. </div>
  125. </div>
  126. <el-tabs v-model="activeName1" class="inner-tab-panel" tab-position="left">
  127. <el-tab-pane :label="$t('watch.allFrame')" name="allNoManange">
  128. <!-- <fieldset class="margin-top-sm">-->
  129. <!-- <legend>{{ watchDeviceFrame }}</legend>-->
  130. <el-scrollbar wrap-class="scrollbar-wrapper" :style="{height: (asideHeight-171)+'px'}">
  131. <div style="padding: 0 15px">
  132. <el-row :gutter="20" type="flex">
  133. <el-col v-for="(item,index) in clerkManageFrame.no_manage_frames" :key="index"
  134. :xs="8" :sm="8" :md="6" :lg="4" :xl="4">
  135. <el-card class="box-card">
  136. <div slot="header" class="clearfix">
  137. <svg-icon icon-class="sickroom"
  138. style="color: #9aaabf;margin-right: 5px"/>
  139. <span>{{ item.name }}</span>
  140. <span v-if="uiVersion !== 1"><svg-icon icon-class="sickroom"
  141. style="color: #9aaabf;margin-right: 5px"/><span>{{ item.name }}</span></span>
  142. <el-checkbox v-model="item.allCkeck" style="float: right"
  143. :indeterminate="item.indeterminate" :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  144. @change="(checked)=>{handleCheckAll(checked,item)}">
  145. {{ $t('action.choiceAll') }}
  146. </el-checkbox>
  147. </div>
  148. <div v-for="(bed,_index) in item.children" :key="_index"
  149. class="text item">
  150. <el-checkbox v-model="bed.checked"
  151. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  152. @change="handleCheckboxChanged(item)">
  153. <svg-icon icon-class="bed"
  154. style="color: #9aaabf;margin-right: 5px"/>
  155. <span v-if="bed.device_id && !bed.checked"
  156. style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>
  157. <span v-else>{{ bed.full_name }}</span>
  158. </el-checkbox>
  159. <!-- <div >-->
  160. <!-- <svg-icon icon-class="bed" style="color: #9aaabf;margin-right: 5px" />-->
  161. <!-- <span v-if="bed.device_id && !bed.checked" style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>-->
  162. <!-- <span v-else>{{ bed.full_name }}</span>-->
  163. <!-- </div>-->
  164. </div>
  165. </el-card>
  166. </el-col>
  167. </el-row>
  168. </div>
  169. </el-scrollbar>
  170. </el-tab-pane>
  171. <el-tab-pane v-for="(group,idx) in noManagedRoomGroup" v-if="group[0]!=='null'" :key="idx"
  172. :label="group[0]" :name="'zone-'+idx">
  173. <el-scrollbar wrap-class="scrollbar-wrapper" :style="{height: (asideHeight-171)+'px'}">
  174. <div style="padding: 0 15px">
  175. <el-row v-if="group[1].length > 1" :gutter="20" type="flex">
  176. <el-col v-for="(item,index) in group[1]" :key="index" :xs="8" :sm="8" :md="6"
  177. :lg="4" :xl="4">
  178. <el-card class="box-card">
  179. <div slot="header" class="clearfix">
  180. <svg-icon icon-class="sickroom"
  181. style="color: #9aaabf;margin-right: 5px"/>
  182. <span>{{ item.name }}</span>
  183. <span v-if="uiVersion !== 1"><svg-icon icon-class="sickroom"
  184. style="color: #9aaabf;margin-right: 5px"/><span>{{ item.name }}</span></span>
  185. <el-checkbox v-model="item.allCkeck" style="float: right"
  186. :indeterminate="item.indeterminate"
  187. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  188. @change="(checked)=>{handleCheckAll(checked,item)}">
  189. {{ $t('action.choiceAll') }}
  190. </el-checkbox>
  191. </div>
  192. <div v-for="(bed,_index) in item.children" :key="_index"
  193. class="text item">
  194. <el-checkbox v-model="bed.checked"
  195. :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')"
  196. @change="handleCheckboxChanged(item)">
  197. <svg-icon icon-class="bed"
  198. style="color: #9aaabf;margin-right: 5px"/>
  199. <span v-if="bed.device_id && !bed.checked"
  200. style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>
  201. <span v-else>{{ bed.full_name }}</span>
  202. </el-checkbox>
  203. <!-- <div v-if="roleId === 8">-->
  204. <!-- <svg-icon icon-class="bed" style="color: #9aaabf;margin-right: 5px" />-->
  205. <!-- <span v-if="bed.device_id && !bed.checked" style="color: #13ce66">{{ bed.full_name }} {{ bed.clerk_name }}</span>-->
  206. <!-- <span v-else>{{ bed.full_name }}</span>-->
  207. <!-- </div>-->
  208. </div>
  209. </el-card>
  210. </el-col>
  211. </el-row>
  212. </div>
  213. </el-scrollbar>
  214. </el-tab-pane>
  215. </el-tabs>
  216. <div class="margin-top-xs text-center padding-content">
  217. <el-row>
  218. <el-col :span="8"> <el-checkbox v-if="clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')" v-model="clerkManageFrameSource.bool_phone_acceptor">{{this.$t('clerkFrameManage.phoneAcceptorTipsLeft')}}{{clerkManageFrameSource.clerk_name}}{{this.$t('clerkFrameManage.phoneAcceptorTipsMid')}},{{clerkManageFrameSource.clerk_name}}{{this.$t('clerkFrameManage.phoneAcceptorTipsRight')}}</el-checkbox></el-col>
  219. <el-col :span="8"> <el-button type="primary" :disabled="!clerkManageFrame.permissions.some(k=>k==='MANAGE_BED')" @click="saveClerkManageFrame">{{this.$t('action.saveSettings')}}</el-button></el-col>
  220. <el-col :span="8"></el-col>
  221. </el-row>
  222. </div>
  223. </el-tab-pane>
  224. </el-tabs>
  225. </el-main>
  226. </el-container>
  227. </template>
  228. <script>
  229. import * as API_Clerk from '@/api/ncs_clerk'
  230. const uiVersion = domain.uiVersion
  231. const groupBy = (arr, func) =>
  232. arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => {
  233. acc[val] = (acc[val] || []).concat(arr[i])
  234. return acc
  235. }, {})
  236. export default {
  237. name: "employeeView",
  238. computed: {
  239. asideHeight() {
  240. return this.mainAreaHeight - 80
  241. }
  242. },
  243. data() {
  244. return {
  245. clerks: {},
  246. activeName: 'first',
  247. testdata: [{key: 1, check: false},
  248. {key: 2, check: false},
  249. {key: 3, check: false},
  250. {key: 4, check: false}
  251. ],
  252. showdata: [],
  253. clerkManageFrame: {
  254. permissions:[]
  255. },
  256. clerkManageFrameSource: {},
  257. managedRoomGroup: [],
  258. noManagedRoomGroup: [],
  259. uiVersion: uiVersion,
  260. activeName1: 'allNoManange',
  261. activeName2: 'allManaged',
  262. currentClerk:{}
  263. }
  264. },
  265. mounted() {
  266. this.getRoleGroupClerk()
  267. this.showdata = this.testdata
  268. },
  269. methods: {
  270. getRoleGroupClerk() {
  271. API_Clerk.getRoleGroupClerk(this.$store.getters.partId).then(res => {
  272. this.clerks = {...res}
  273. this.currentClerk = {...this.clerks[Object.keys(this.clerks)[0]][0]}
  274. this.getClerkManageFrame(this.currentClerk.clerk_id, 4)
  275. })
  276. },
  277. handleOpen() {
  278. },
  279. handleClose() {
  280. },
  281. handleSelect(val){
  282. let path =val.split('-').map(p=>Number(p))
  283. this.currentClerk = {...this.clerks[Object.keys(this.clerks)[path[0]]][path[1]]}
  284. this.getClerkManageFrame(this.currentClerk.clerk_id, 4)
  285. },
  286. getClerkManageFrame(clerkId, rootType) {
  287. API_Clerk.getClerkManageFrame(clerkId, rootType).then(res => {
  288. this.clerkManageFrameSource = {...res}
  289. this.clerkManageFrame = {...this.clerkManageFrameSource}
  290. this.clerkManageFrame.managed_frames.forEach(item=>{
  291. this.countAllFrame(item)
  292. })
  293. this.clerkManageFrame.no_manage_frames.forEach(item=>{
  294. this.countAllFrame(item)
  295. })
  296. const managedGroup = groupBy(this.clerkManageFrame.managed_frames, item => item.group_name)
  297. this.managedRoomGroup = Object.entries(managedGroup)
  298. const noManagedGroup = groupBy(this.clerkManageFrame.no_manage_frames, item => item.group_name)
  299. this.noManagedRoomGroup = Object.entries(noManagedGroup)
  300. })
  301. },
  302. handleCheckAll(checked, item) {
  303. this.$set(item, 'indeterminate', false)
  304. this.setFrameCheck(item, checked)
  305. },
  306. /** 设置选择状态 */
  307. setFrameCheck(item, checked) {
  308. const perm = this.MixinClone(item)
  309. if (!Array.isArray(perm)) {
  310. this.$set(item, 'checked', checked)
  311. if (item.children && item.children.length) {
  312. this.$set(item, 'children', this.setFrameCheck(item.children, checked))
  313. }
  314. } else {
  315. perm.map(item => {
  316. item.checked = checked
  317. this.$set(item, 'checked', checked)
  318. if (item.children && item.children.length) {
  319. this.$set(item, 'children', this.setFrameCheck(item.children, checked))
  320. }
  321. })
  322. }
  323. return perm
  324. },
  325. /** 选择 */
  326. handleCheckboxChanged(item) {
  327. this.countAllFrame(item)
  328. },
  329. /** 获取所有frame的长度、被选中的长度 */
  330. countAllFrame(frame) {
  331. const _list = []
  332. if (!Array.isArray(frame)) {
  333. // _list.push(frame)
  334. if (frame.children) _list.push(...this.countAllFrame(frame.children))
  335. } else {
  336. frame.forEach(item => {
  337. _list.push(item)
  338. if (item.children) _list.push(...this.countAllFrame(item.children))
  339. })
  340. }
  341. const length = _list.length
  342. const length_checked = _list.filter(_item => _item.checked).length
  343. this.$set(frame, 'allCkeck', length === _list.filter(_item => _item.checked).length)
  344. this.$set(frame, 'indeterminate', (length_checked !== 0) && (length !== length_checked))
  345. return _list
  346. },
  347. handlerSearchManaged(keywords,view) {
  348. if (keywords !== '') {
  349. if(view===1){
  350. this.clerkManageFrame.managed_frames =this.clerkManageFrameSource.managed_frames.filter(p => p.full_name.indexOf(keywords) > -1 || p.chidren !== null && p.children.length > 0 && p.children.some(k => k.full_name.indexOf(keywords) > -1))
  351. }else{
  352. this.clerkManageFrame.no_manage_frames = this.clerkManageFrameSource.no_manage_frames.filter(p => p.full_name.indexOf(keywords) > -1 || p.chidren !== null && p.children.length > 0 && p.children.some(k => k.full_name.indexOf(keywords) > -1))
  353. }
  354. } else {
  355. if(view===1){
  356. this.clerkManageFrame.managed_frames = [...this.clerkManageFrameSource.managed_frames]
  357. }else{
  358. this.clerkManageFrame.no_manage_frames = [...this.clerkManageFrameSource.no_manage_frames]
  359. }
  360. }
  361. const managedGroup = groupBy(this.clerkManageFrame.managed_frames, item => item.group_name)
  362. this.managedRoomGroup = Object.entries(managedGroup)
  363. const noManagedGroup = groupBy(this.clerkManageFrame.no_manage_frames, item => item.group_name)
  364. this.noManagedRoomGroup = Object.entries(noManagedGroup)
  365. },
  366. saveClerkManageFrame() {
  367. API_Clerk.saveClerkManageFrame(this.clerkManageFrameSource).then(res => {
  368. this.getClerkManageFrame(this.currentClerk.clerk_id, 4)
  369. this.$message.success(this.$t('action.saveSuccess'))
  370. })
  371. }
  372. }
  373. }
  374. </script>
  375. <style scoped>
  376. .el-aside {
  377. margin: 8px;
  378. padding: 8px;
  379. /*border-width: 1px;*/
  380. /*border-style: solid;*/
  381. background: #fff;
  382. }
  383. .el-submenu .el-menu-item {
  384. width: 100% !important;
  385. }
  386. .custom-tree-node {
  387. flex: 1;
  388. display: flex;
  389. align-items: center;
  390. justify-content: space-between;
  391. font-size: 14px;
  392. padding-right: 8px;
  393. }
  394. .el-tree {
  395. margin-top: 8px
  396. }
  397. /deep/ .el-main {
  398. margin: 8px;
  399. padding: 0;
  400. overflow: hidden;
  401. }
  402. /deep/ .scrollbar-wrapper {
  403. height: 100%;
  404. overflow-x: hidden;
  405. }
  406. /deep/ .inner-tab-panel .el-tabs__content {
  407. /*height:calc(100vh - 260px)*/
  408. }
  409. /deep/ .el-menu-item-group__title {
  410. display: none;
  411. }
  412. .el-scrollbar {
  413. height: 100%;
  414. }
  415. /deep/ .svg-icon {
  416. margin-right: 16px;
  417. }
  418. /deep/ .el-tabs--border-card > .el-tabs__content {
  419. padding: 15px;
  420. padding-right: 0;
  421. }
  422. .el-row--flex {
  423. flex-wrap: wrap !important;
  424. margin-top: 20px;
  425. }
  426. .el-col {
  427. margin-bottom: 20px !important;
  428. }
  429. /deep/.el-checkbox__input.is-disabled.is-checked + span.el-checkbox__label{
  430. color: #1890ff;
  431. }
  432. /deep/ .el-checkbox__label{
  433. white-space: normal;
  434. text-align: left;
  435. }
  436. </style>