浏览代码

科室管理

wuyunfeng 4 年之前
父节点
当前提交
544d9123a0

+ 212 - 0
node_modules/zrender/src/svg/helper/ShadowManager.js

@@ -0,0 +1,212 @@
+/**
+ * @file Manages SVG shadow elements.
+ * @author Zhang Wenli
+ */
+
+import Definable from './Definable';
+import * as zrUtil from '../../core/util';
+
+/**
+ * Manages SVG shadow elements.
+ *
+ * @class
+ * @extends Definable
+ * @param   {number}     zrId    zrender instance id
+ * @param   {SVGElement} svgRoot root of SVG document
+ */
+function ShadowManager(zrId, svgRoot) {
+    Definable.call(
+        this,
+        zrId,
+        svgRoot,
+        ['filter'],
+        '__filter_in_use__',
+        '_shadowDom'
+    );
+}
+
+
+zrUtil.inherits(ShadowManager, Definable);
+
+
+/**
+ * Create new shadow DOM for fill or stroke if not exist,
+ * but will not update shadow if exists.
+ *
+ * @param {SvgElement}  svgElement   SVG element to paint
+ * @param {Displayable} displayable  zrender displayable element
+ */
+ShadowManager.prototype.addWithoutUpdate = function (
+    svgElement,
+    displayable
+) {
+    if (displayable && hasShadow(displayable.style)) {
+        var style = displayable.style;
+
+        // Create dom in <defs> if not exists
+        var dom;
+        if (style._shadowDom) {
+            // Gradient exists
+            dom = style._shadowDom;
+
+            var defs = this.getDefs(true);
+            if (!defs.contains(style._shadowDom)) {
+                // _shadowDom is no longer in defs, recreate
+                this.addDom(dom);
+            }
+        }
+        else {
+            // New dom
+            dom = this.add(displayable);
+        }
+
+        this.markUsed(displayable);
+
+        var id = dom.getAttribute('id');
+        svgElement.style.filter = 'url(#' + id + ')';
+    }
+};
+
+
+/**
+ * Add a new shadow tag in <defs>
+ *
+ * @param {Displayable} displayable  zrender displayable element
+ * @return {SVGFilterElement} created DOM
+ */
+ShadowManager.prototype.add = function (displayable) {
+    var dom = this.createElement('filter');
+    var style = displayable.style;
+
+    // Set dom id with shadow id, since each shadow instance
+    // will have no more than one dom element.
+    // id may exists before for those dirty elements, in which case
+    // id should remain the same, and other attributes should be
+    // updated.
+    style._shadowDomId = style._shadowDomId || this.nextId++;
+    dom.setAttribute('id', 'zr' + this._zrId
+        + '-shadow-' + style._shadowDomId);
+
+    this.updateDom(displayable, dom);
+    this.addDom(dom);
+
+    return dom;
+};
+
+
+/**
+ * Update shadow.
+ *
+ * @param {Displayable} displayable  zrender displayable element
+ */
+ShadowManager.prototype.update = function (svgElement, displayable) {
+    var style = displayable.style;
+    if (hasShadow(style)) {
+        var that = this;
+        Definable.prototype.update.call(this, displayable, function (style) {
+            that.updateDom(displayable, style._shadowDom);
+        });
+    }
+    else {
+        // Remove shadow
+        this.remove(svgElement, style);
+    }
+};
+
+
+/**
+ * Remove DOM and clear parent filter
+ */
+ShadowManager.prototype.remove = function (svgElement, style) {
+    if (style._shadowDomId != null) {
+        this.removeDom(style);
+        svgElement.style.filter = '';
+    }
+};
+
+
+/**
+ * Update shadow dom
+ *
+ * @param {Displayable} displayable  zrender displayable element
+ * @param {SVGFilterElement} dom DOM to update
+ */
+ShadowManager.prototype.updateDom = function (displayable, dom) {
+    var domChild = dom.getElementsByTagName('feDropShadow');
+    if (domChild.length === 0) {
+        domChild = this.createElement('feDropShadow');
+    }
+    else {
+        domChild = domChild[0];
+    }
+
+    var style = displayable.style;
+    var scaleX = displayable.scale ? (displayable.scale[0] || 1) : 1;
+    var scaleY = displayable.scale ? (displayable.scale[1] || 1) : 1;
+
+    // TODO: textBoxShadowBlur is not supported yet
+    var offsetX, offsetY, blur, color;
+    if (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY) {
+        offsetX = style.shadowOffsetX || 0;
+        offsetY = style.shadowOffsetY || 0;
+        blur = style.shadowBlur;
+        color = style.shadowColor;
+    }
+    else if (style.textShadowBlur) {
+        offsetX = style.textShadowOffsetX || 0;
+        offsetY = style.textShadowOffsetY || 0;
+        blur = style.textShadowBlur;
+        color = style.textShadowColor;
+    }
+    else {
+        // Remove shadow
+        this.removeDom(dom, style);
+        return;
+    }
+
+    domChild.setAttribute('dx', offsetX / scaleX);
+    domChild.setAttribute('dy', offsetY / scaleY);
+    domChild.setAttribute('flood-color', color);
+
+    // Divide by two here so that it looks the same as in canvas
+    // See: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur
+    var stdDx = blur / 2 / scaleX;
+    var stdDy = blur / 2 / scaleY;
+    var stdDeviation = stdDx + ' ' + stdDy;
+    domChild.setAttribute('stdDeviation', stdDeviation);
+
+    // Fix filter clipping problem
+    dom.setAttribute('x', '-100%');
+    dom.setAttribute('y', '-100%');
+    dom.setAttribute('width', Math.ceil(blur / 2 * 200) + '%');
+    dom.setAttribute('height', Math.ceil(blur / 2 * 200) + '%');
+
+    dom.appendChild(domChild);
+
+    // Store dom element in shadow, to avoid creating multiple
+    // dom instances for the same shadow element
+    style._shadowDom = dom;
+};
+
+/**
+ * Mark a single shadow to be used
+ *
+ * @param {Displayable} displayable displayable element
+ */
+ShadowManager.prototype.markUsed = function (displayable) {
+    var style = displayable.style;
+    if (style && style._shadowDom) {
+        Definable.prototype.markUsed.call(this, style._shadowDom);
+    }
+};
+
+function hasShadow(style) {
+    // TODO: textBoxShadowBlur is not supported yet
+    return style
+        && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY
+            || style.textShadowBlur || style.textShadowOffsetX
+            || style.textShadowOffsetY);
+}
+
+
+export default ShadowManager;

+ 2 - 2
src/api/ncs_device.js

@@ -90,7 +90,7 @@ export function getNextIP() {
 /** 获取APP版本更新信息 */
 export function getAPPVersion(params) {
   return request({
-    url: '/ncs/getappversion',
+    url: '/ncs/app_version/getappversion',
     method: 'get',
     loading: false,
     params
@@ -99,7 +99,7 @@ export function getAPPVersion(params) {
 /** 设置APP版本更新信息 **/
 export function setAPPVersion(params) {
   return request({
-    url: '/ncs/setappversion',
+    url: '/ncs/app_version/setappversion',
     method: 'post',
     loading: false,
     data: params

+ 70 - 0
src/api/ncs_partInfo.js

@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+import md5 from 'js-md5'
+export function getList(params) {
+  return request({
+    url: '/mgr/partinfo/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function remove(id) {
+  return request({
+    url: `/mgr/partinfo/${id}`,
+    method: 'DELETE',
+    loading: true
+  })
+}
+/** 修改 */
+export function update(id, params) {
+  return request({
+    url: `/mgr/partinfo/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+/** 新增 */
+export function add(params) {
+  params.member_password = md5(params.member_password)
+  return request({
+    url: '/mgr/partinfo',
+    method: 'POST',
+    loading: true,
+    data: params
+  })
+}
+
+/** 新增 */
+export function listByType(partype) {
+  return request({
+    url: `/mgr/partinfo/list/${partype}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 获取科室设置
+ * @param partid
+ * @returns {*|Promise|Promise<unknown>}
+ */
+export function getPartSetting(partid) {
+  return request({
+    url: `/mgr/partinfo/setting/${partid}`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 更新科室设置
+ * @param params
+ * @param partid
+ * @returns {*|Promise|Promise<unknown>}
+ */
+export function editPartSetting(params, partid) {
+  return request({
+    url: `/mgr/partinfo/setting/${partid}`,
+    method: 'PUT',
+    data: params
+  })
+}

+ 47 - 0
src/components/AgGridCellRender/ButtonCellRender.vue

@@ -0,0 +1,47 @@
+<template>
+  <div>
+    <el-button :type="buttonType" :size="buttonSize" @click="buttonClick">{{ label }}</el-button>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ButtonCellRender',
+  data() {
+    return {
+      buttonType: 'primary',
+      buttonSize: 'mini',
+      label: 'button'
+    }
+  },
+  beforeMount() {
+  },
+  mounted() {
+    const { buttonType, buttonSize, label } = this.params
+    if (buttonType) {
+      this.buttonType = buttonType
+    }
+    if (buttonSize) {
+      this.buttonSize = buttonSize
+    }
+    if (label) {
+      this.label = label
+    }
+  },
+  methods: {
+    buttonClick() {
+      console.log('click', typeof this.params.onClick === 'function')
+
+      if (typeof this.params.onClick === 'function') {
+          console.log(this.params.node.data)
+        this.params.onClick(this.params.node.data)
+        // this.params.context.componentParent.showDetail(this.params.node.data)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 36 - 1
src/layout/mixin/ResizeHandler.js

@@ -1,5 +1,5 @@
 import store from '@/store'
-
+import { unix2Date } from '@/utils/Foundation'
 const { body } = document
 const WIDTH = 992 // refer to Bootstrap's responsive design
 
@@ -40,6 +40,41 @@ export default {
           store.dispatch('app/closeSideBar', { withoutAnimation: true })
         }
       }
+    },
+    // 以下方法提供给ag-grid使用
+    numberParser(text) {
+      console.log(text)
+      return true
+    },
+    textCustomComparator(filter, value, text) {
+      return true
+    },
+    hashValueGetter(params) {
+      return params.node.rowIndex + 1
+    },
+    dateValueFormatter(params) {
+      return unix2Date(params.value)
+    },
+    dateCustomComparator(valueA, valueB, nodeA, nodeB, isInverted) {
+      console.log('a', new Date(valueA))
+
+      if (valueB === null) {
+        return 0
+      }
+      const cellDate = new Date(valueB)
+
+      const day = cellDate.getDate()
+      const month = cellDate.getMonth()
+      const year = cellDate.getFullYear()
+      const cellDateMidNight = new Date(year, month, day)
+      console.log('b', cellDateMidNight)
+      if (new Date(valueA) < cellDateMidNight) {
+        return 1
+      } else if (new Date(valueA) > cellDateMidNight) {
+        return -1
+      } else {
+        return 0
+      }
     }
   }
 }

+ 14 - 1
src/router/index.js

@@ -263,7 +263,7 @@ export const adminRoutes = [
     children: [
       {
         path: 'index/:id?',
-        component: () => import('@/views/dashboard/calling-admin/partInfoSetting'),
+        component: () => import('@/views/ncs-orginazition/partInfoSetting'),
         name: 'partInfoSetting',
         meta: { title: '科室设置', icon: 'nested', noCache: true },
         hidden: true
@@ -282,6 +282,19 @@ export const adminRoutes = [
       }
     ]
   },
+  {
+    path: '/ncs-orginazition',
+    component: Layout,
+    children: [
+      {
+        path: 'index',
+        component: () => import('@/views/ncs-orginazition/index'),
+        name: 'orginazition',
+        meta: { title: '组织机构', icon: 'tree', noCache: true }
+      }
+    ]
+  },
+
   { path: '*', redirect: '/404', hidden: true }
 ]
 

+ 8 - 0
src/styles/index.scss

@@ -189,3 +189,11 @@ aside {
 .multiselect--active {
   z-index: 1000 !important;
 }
+
+
+ .el-select .el-input__inner[type="text"][readonly]{
+  background: #fff;
+}
+ .el-input__inner[type="text"][readonly]{
+  background: #F5F7FA;
+}

+ 2 - 1
src/utils/request.js

@@ -20,7 +20,8 @@ const service = axios.create({
 service.interceptors.request.use(
   config => {
     /** 配置全屏加载 */
-    if (config.loading !== false) {
+
+    if (config.loading) {
       const { loading } = config
       const is_num = typeof (config.loading) === 'number'
       if (is_num) config.loading_num = true

+ 120 - 0
src/views/ncs-orginazition/components/AppVersionManager.vue

@@ -0,0 +1,120 @@
+<template>
+  <el-card style="margin: 15px">
+    <el-form ref="editform" :rules="rules" label-width="130px" :model="formmodel">
+
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="APK文件上传">
+
+            <el-upload
+              class="upload-demo"
+              drag
+              :action="`${uploadServer}/ncs/app_version/upload`"
+              :show-file-list="false"
+              :on-success="uploaded"
+              :before-upload="handleShopLogoBefore"
+            >
+              <i class="el-icon-upload" />
+              <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+              <div slot="tip" class="el-upload__tip">只能上传APK文件</div>
+            </el-upload>
+          </el-form-item>
+          <el-form-item label="版本信息" prop="ver_info">
+            <el-input v-model="formmodel.ver_info" clearable :maxlength="100" placeholder="请输入版本信息" />
+          </el-form-item>
+          <el-form-item label="文件路径" prop="ver_filepath">
+            <el-input v-model="formmodel.ver_filepath" clearable readonly placeholder="文件路径" />
+          </el-form-item>
+          <el-form-item label="修改时间" prop="ver_datetime">
+            <el-input v-model="formmodel.ver_datetime" clearable readonly placeholder="修改时间" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item align="center" class="margin-top-sm">
+        <el-button type="success" @click="handlerFormSubmit">保存设置</el-button>
+      </el-form-item>
+    </el-form>
+  </el-card>
+</template>
+
+<script>
+import { serverUrl } from '@/utils/domain'
+import * as API_Device from '@/api/ncs_device'
+export default {
+  name: 'AppVersionManager',
+  props: {
+    deviceType: {
+      type: Number,
+      default: null
+    },
+    partId: {
+      type: Number,
+      default: null
+    }
+  },
+  data() {
+    return {
+      formmodel: {
+        ver_filefullpath: ''
+      },
+      rules: {
+        ver_info: [
+          { required: true, message: '版本信息不能为空', trigger: 'blur' }
+        ],
+        ver_filepath: [
+          { required: true, message: '请上传APK文件', trigger: 'blur' }
+        ]
+      },
+      uploadServer: serverUrl
+    }
+  },
+  mounted() {
+    this.getAppVersion()
+  },
+  methods: {
+    /** 上传成功后的钩子 更换图片 置空存储数组*/
+    uploaded(response) {
+      this.formmodel.ver_filepath = response
+    },
+    /** 文件上传之前的校验 */
+    handleShopLogoBefore(file) {
+      const isImg = file.type === 'application/vnd.android.package-archive'
+      const ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase() === 'apk'
+      const isapk = isImg || ext
+      if (!isapk) {
+        this.$message.error('只能上传APK文件!')
+      }
+      return isapk
+    },
+    getAppVersion() {
+      const params = {
+        partid: this.partId,
+        devicetype: this.deviceType
+      }
+      API_Device.getAPPVersion(params).then(res => {
+        this.formmodel = { ...res }
+      })
+    },
+    /** 新增 提交表单 */
+    handlerFormSubmit() {
+      this.$refs['editform'].validate((valid) => {
+        if (valid) {
+          /** 设置app版本信息 */
+          this.formmodel.partid = this.partId
+          this.formmodel.ver_devicetype = this.deviceType
+          API_Device.setAPPVersion(this.formmodel).then(res => {
+            this.formmodel = { ...res }
+            this.$message.success('保存成功!')
+          }).catch(response => {
+            this.$message.error(response.message)
+          })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 360 - 0
src/views/ncs-orginazition/components/partInfoEdit.vue

@@ -0,0 +1,360 @@
+<template>
+  <div>
+    <el-card style="margin: 15px">
+      <el-form ref="editform" :rules="rules" label-width="130px" :model="formmodel">
+        <fieldset>
+          <legend>基本信息</legend>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="组织简称" prop="shop_name">
+                <el-input v-model="formmodel.shop_name" clearable :maxlength="100" placeholder="请输入组织简称" />
+              </el-form-item>
+
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="组织全称" prop="full_name">
+                <el-input v-model="formmodel.full_name" clearable :maxlength="100" placeholder="请输入组织全称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="HIS系统标识" prop="his_code">
+                <el-input v-model="formmodel.his_code" clearable :maxlength="100"  placeholder="请输入HIS系统标识" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="组织类型" prop="shop_type">
+                <el-select v-model="formmodel.shop_type" placeholder="请选择组织类型" clearable>
+                  <el-option label="医院" value="6" />
+                  <el-option label="科室" value="5" />
+                  <el-option label="机构" value="0" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="管理员账号" prop="member_name">
+                <el-input v-model="formmodel.member_name" clearable :maxlength="100" readonly placeholder="请输入管理员账号" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="所属组织" prop="parent_id">
+                <el-select v-model="formmodel.parent_id" placeholder="请选择上级组织" clearable>
+                  <el-option v-for="(item,index) in parents" :key="index" :label="item.shop_name" :value="item.shop_id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+
+          </el-row>
+        </fieldset>
+        <fieldset class="margin-top-sm">
+          <legend>白天参数设置</legend>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="白天开始时间" prop="dayStart">
+                <el-time-picker
+                  v-model="dayStart"
+                  placeholder="白天开始时间"
+                />
+              </el-form-item>
+              <el-form-item label="主机叫号参数" prop="day_vol">
+                <el-input-number v-model="formmodel.day_vol" :min="0" :max="2" label="主机叫号参数" />
+              </el-form-item>
+              <el-form-item label="门口机通话音量" prop="day_door_vol">
+                <el-input-number v-model="formmodel.day_door_vol" :min="0" :max="100" label="门口机通话音量" />
+              </el-form-item>
+              <el-form-item label="转换盒通话音量" prop="day_transfer_box_vol">
+                <el-input-number v-model="formmodel.day_transfer_box_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="分机液晶屏亮度" prop="day_light">
+                <el-input-number v-model="formmodel.day_light" :min="0" :max="100" label="分机液晶屏亮度" />
+              </el-form-item>
+              <el-form-item label="呼叫响铃次数" prop="day_ring_times">
+                <el-input-number v-model="formmodel.day_ring_times" :min="0" :max="10" label="主机叫号次数" />
+              </el-form-item>
+              <el-form-item label="分机通话音量" prop="day_bed_vol">
+                <el-input-number v-model="formmodel.day_bed_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="分机系统音量" prop="day_ring_vol">
+                <el-input-number v-model="formmodel.day_ring_vol" :min="0" :max="100" label="分机系统音量" />
+              </el-form-item>
+              <el-form-item label="分机护理灯亮度" prop="day_nurse_led">
+                <el-input-number v-model="formmodel.day_nurse_led" :min="0" :max="100" label="分机护理灯亮度" />
+              </el-form-item>
+              <el-form-item label="转换盒系统音量" prop="day_transfer_box_system_vol">
+                <el-input-number v-model="formmodel.day_transfer_box_system_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+        </fieldset>
+
+        <fieldset class="margin-top-sm">
+          <legend>夜晚参数设置</legend>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="夜晚开始时间" prop="nightStart">
+                <el-time-picker
+                  v-model="nightStart"
+                  placeholder="夜晚开始时间"
+                />
+              </el-form-item>
+              <el-form-item label="主机叫号参数" prop="night_vol">
+                <el-input-number v-model="formmodel.night_vol" :min="0" :max="2" label="主机叫号参数" />
+                <span class="red-text">0-床号 1-房号 2-房床号</span>
+              </el-form-item>
+              <el-form-item label="门口机通话音量" prop="night_door_vol">
+                <el-input-number v-model="formmodel.night_door_vol" :min="0" :max="100" label="门口机通话音量" />
+              </el-form-item>
+              <el-form-item label="转换盒通话音量" prop="night_transfer_box_vol">
+                <el-input-number v-model="formmodel.night_transfer_box_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="分机液晶屏亮度" prop="night_light">
+                <el-input-number v-model="formmodel.night_light" :min="0" :max="100" label="分机液晶屏亮度" />
+              </el-form-item>
+              <el-form-item label="呼叫响铃次数" prop="night_ring_times">
+                <el-input-number v-model="formmodel.night_ring_times" :min="0" :max="10" label="主机叫号次数" />
+              </el-form-item>
+              <el-form-item label="分机通话音量" prop="night_bed_vol">
+                <el-input-number v-model="formmodel.night_bed_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="分机系统音量" prop="night_ring_vol">
+                <el-input-number v-model="formmodel.night_ring_vol" :min="0" :max="100" label="分机系统音量" />
+              </el-form-item>
+              <el-form-item label="分机护理灯亮度" prop="night_nurse_led">
+                <el-input-number v-model="formmodel.night_nurse_led" :min="0" :max="100" label="分机护理灯亮度" />
+              </el-form-item>
+              <el-form-item label="转换盒系统音量" prop="night_transfer_box_system_vol">
+                <el-input-number v-model="formmodel.night_transfer_box_system_vol" :min="0" :max="100" label="病床分机通话音量" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+        </fieldset>
+
+        <!--        <fieldset class="margin-top-sm">-->
+        <!--          <legend>护理名称</legend>-->
+        <!--          <el-row>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="护理名称一" prop="part_nurse_level0">-->
+        <!--                <el-input v-model="formmodel.part_nurse_level0" clearable :maxlength="100" placeholder="请输入护理名称一" />-->
+        <!--              </el-form-item>-->
+        <!--              <el-form-item label="护理名称四" prop="part_nurse_level3">-->
+        <!--                <el-input v-model="formmodel.part_nurse_level3" clearable :maxlength="100" placeholder="请输入护理名称四" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="护理名称二" prop="part_nurse_level1">-->
+        <!--                <el-input v-model="formmodel.part_nurse_level1" clearable :maxlength="100" placeholder="请输入护理名称二" />-->
+        <!--              </el-form-item>-->
+        <!--              <el-form-item label="护理名称五" prop="part_nurse_level4">-->
+        <!--                <el-input v-model="formmodel.part_nurse_level4" clearable :maxlength="100" placeholder="请输入护理名称五" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="护理名称三" prop="part_nurse_level2">-->
+        <!--                <el-input v-model="formmodel.part_nurse_level2" clearable :maxlength="100" placeholder="请输入护理名称三" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--          </el-row>-->
+        <!--          <el-row>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="特级护理配置项" prop="part_special_care">-->
+        <!--                <el-select ref="part_special_care" v-model="formmodel.part_special_care" placeholder="特级护理配置项" clearable @change="(val)=>selectChagne(val,'part_special_care')">-->
+        <!--                  <el-option v-for="(item,index) in nurseLevel0Config" :key="index" :value="item.id" :style="{'color':'#'+item.nursecfg_color}" :label="item.nursecfg_name" />-->
+        <!--                </el-select>-->
+        <!--                &lt;!&ndash;                              <el-input clearable v-model="formmodel.staff_type" :maxlength="20" placeholder="请输入MEID"></el-input>&ndash;&gt;-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="一级护理配置项" prop="part_primary_care">-->
+        <!--                <el-select ref="part_primary_care" v-model="formmodel.part_primary_care" placeholder="一级护理配置项" clearable @change="(val)=>selectChagne(val,'part_primary_care')">-->
+        <!--                  <el-option v-for="(item,index) in nurseLevel0Config" :key="index" :value="item.id" :style="{'color':'#'+item.nursecfg_color}" :label="item.nursecfg_name" />-->
+        <!--                </el-select>-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--          </el-row>-->
+
+        <!--        </fieldset>-->
+
+        <!--        <fieldset class="margin-top-sm">-->
+        <!--          <legend>SIP服务器参数</legend>-->
+        <!--          <el-row>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="SIP服务器IP" prop="sipsev_ip">-->
+        <!--                <el-input v-model="formmodel.sipsev_ip" clearable :maxlength="100" placeholder="请输入SIP服务器IP" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="MYSQL用户名" prop="sipsev_mysqlusername">-->
+        <!--                <el-input v-model="formmodel.sipsev_mysqlusername" clearable :maxlength="100" placeholder="请输入SIP服务器IP" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--            <el-col :span="8">-->
+        <!--              <el-form-item label="MYSQL密码" prop="sipsev_mysqlpassword">-->
+        <!--                <el-input v-model="formmodel.sipsev_mysqlpassword" clearable :maxlength="100" placeholder="请输入SIP服务器IP" />-->
+        <!--              </el-form-item>-->
+        <!--            </el-col>-->
+        <!--          </el-row>-->
+        <!--        </fieldset>-->
+
+        <fieldset class="margin-top-sm">
+          <legend>其它参数</legend>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="分机息屏时间" prop="sleep_seconds_bed">
+                <el-input-number v-model="formmodel.sleep_seconds_bed" :min="1" :max="100" label="分机液晶屏息屏时间" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="门口机息屏时间" prop="sleep_seconds_door">
+                <el-input-number v-model="formmodel.sleep_seconds_door" :min="1" :max="100" label="门口机液晶屏息屏时间" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="护士主机息屏时间" prop="sleep_seconds_nurse">
+                <el-input-number v-model="formmodel.sleep_seconds_nurse" :min="1" :max="100" label="护士主机液晶屏息屏时间" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="语音呼叫超时" prop="sip_overtime">
+                <el-input-number v-model="formmodel.sip_overtime" :min="1" :max="100" label="分机液晶屏息屏时间" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </fieldset>
+
+        <el-form-item align="center" class="margin-top-sm">
+          <el-button type="success" @click="onSubmit">保存设置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script>
+// 系统设置
+import * as API_Part from '@/api/ncs_partInfo'
+import * as API_Nurse from '@/api/calling-nurse'
+export default {
+  name: 'PartInfoEdit',
+  props: {
+    partId: {
+      type: Number,
+      default: null
+    }
+  },
+  data() {
+    return {
+      formmodel: {},
+      rules: {},
+      dayStart: new Date(2020, 11, 11, 7, 0),
+      nightStart: new Date(2020, 11, 11, 18, 0),
+      nurseLevel0Config: []
+    }
+  },
+  async mounted() {
+    // this.nurseLevel0Config = await API_Nurse.getNurseConfigs(this.partId, 0)
+    this.getPartInfo()
+  },
+  methods: {
+    getPartInfo() {
+      console.log(this.partId)
+      if (this.partId) {
+        API_Part.getPartSetting(this.partId).then(res => {
+          this.formmodel = { ...res }
+          if (!this.formmodel.id) {
+            this.formmodel = { ...this.formmodel, ...{
+              day_bed_vol: 100,
+              day_light: 100,
+              day_door_vol: 73,
+              day_nurse_led: 30,
+              day_ring_times: 10,
+              day_vol: 0,
+              day_sipvol: 100,
+              day_start: '07:00:00',
+              day_transfer_box_vol: 100,
+              day_transfer_box_system_vol: 100,
+              his_code: '',
+              hospitalcode: '',
+              night_bed_vol: 100,
+              night_light: 100,
+              night_door_vol: 73,
+              night_nurse_led: 30,
+              night_ring_times: 10,
+              night_vol: 0,
+              night_sipvol: 100,
+              night_start: '07:00:00',
+              night_transfer_box_vol: 100,
+              night_transfer_box_system_vol: 100,
+              sip_overtime: 30,
+              sleep_seconds_bed: 30,
+              sleep_seconds_nurse: 30,
+              sleep_seconds_door: 30
+            }}
+          } else {
+            if (this.formmodel.day_start && this.formmodel.day_start !== '') {
+              this.dayStart = new Date('2020-11-11 ' + this.formmodel.day_start)
+            }
+            if (this.formmodel.night_start && this.formmodel.night_start !== '') {
+              this.nightStart = new Date('2020-11-11 ' + this.formmodel.night_start)
+            }
+          }
+
+          // // 处理护理等级颜色
+          // this.$nextTick(() => {
+          //   const specialNurseCfg = this.nurseLevel0Config.find(p => p.id === this.formmodel.part_special_care)
+          //   if (specialNurseCfg) { this.$refs['part_special_care'].$el.getElementsByClassName('el-input__inner')[0].style = 'color:#' + specialNurseCfg.nursecfg_color + ' !important' }
+          //   const primaryNurseCfg = this.nurseLevel0Config.find(p => p.id === this.formmodel.part_primary_care)
+          //   if (primaryNurseCfg) { this.$refs['part_primary_care'].$el.getElementsByClassName('el-input__inner')[0].style = 'color:#' + primaryNurseCfg.nursecfg_color + ' !important' }
+          // })
+        })
+      }
+    },
+    selectChagne(val, ref) {
+      if (val && val !== '') {
+        const currentCfg = this.nurseLevel0Config.find(p => p.id === val)
+        if (currentCfg) {
+          this.$refs[ref].$el.getElementsByClassName('el-input__inner')[0].style = 'color:#' + currentCfg.nursecfg_color + ' !important'
+        }
+      }
+    },
+    onSubmit() {
+      this.$refs['editform'].validate((valid) => {
+        if (valid) {
+          if (this.dayStart && this.dayStart !== null) {
+            this.formmodel.day_start = this.dayStart.toLocaleTimeString('chinese', { hour12: false })
+          }
+          if (this.nightStart && this.nightStart !== null) {
+            this.formmodel.night_start = this.nightStart.toLocaleTimeString('chinese', { hour12: false })
+          }
+          API_Part.editPartSetting(this.formmodel, this.partId).then(res => {
+            this.$message.success('保存成功!')
+          }).catch(err => {
+            this.$message.error(err.message)
+          })
+        } else {
+          this.$message.error('表单填写错误,请检查!')
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+    fieldset{
+        border-style: solid;
+        border-color: #DCDFE6;
+        border-width: 1px;
+    }
+    .margin-top-sm{margin-top: 20px}
+</style>

+ 303 - 0
src/views/ncs-orginazition/components/partUserManager.vue

@@ -0,0 +1,303 @@
+<template>
+  <div class="app-container">
+
+    <en-table-layout
+      toolbar
+      pagination
+      :table-data="tableData"
+      :height="tableHeight"
+      :loading="loading"
+      @selection-change="selectFun"
+      @sort-change="tableSort"
+    >
+      <!--工具栏-->
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch" />
+        </div>
+        <div class="toolbar-btns">
+          <el-button type="primary" @click="handlerAdd">新增账号</el-button>
+          <el-button type="danger" @click="batchDelete">批量删除</el-button>
+        </div>
+      </div>
+      <!--表头-->
+      <template slot="table-columns">
+        <el-table-column
+          type="selection"
+          width="55"
+          align="center"
+        />
+
+        <el-table-column prop="id" sortable="custom" label="ID" width="200" align="center" />
+        <el-table-column prop="user_name" sortable="custom" label="登陆账号" width="300" align="center" />
+        <el-table-column prop="user_password" sortable="custom" label="密码" width="300" align="center" />
+
+        <el-table-column
+          label="操作"
+          align="right"
+        >
+          <template slot-scope="scope">
+            <el-button type="success" size="mini" @click="handlerEdit(scope.$index,scope.row)">
+              编辑
+            </el-button>
+
+            <el-button type="danger" size="mini" @click="handlerDelete(scope.row.id)">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+
+      </template>
+
+      <!--翻页-->
+      <el-pagination
+        v-if="pageData"
+        slot="pagination"
+        :current-page="pageData.page_no"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageData.page_size"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="pageData.data_total"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+      />
+    </en-table-layout>
+
+    <el-dialog :title.sync="formtitle" :visible.sync="formshow" width="30%">
+      <div>
+        <el-form ref="editform" :rules="rules" label-width="120px" :model="formmodel">
+
+          <el-form-item label="登陆账号" prop="user_name">
+            <el-input v-model="formmodel.user_name" clearable :maxlength="20" placeholder="请输入登陆账号" />
+          </el-form-item>
+
+          <el-form-item label="登陆密码" prop="user_password">
+            <el-input v-model="formmodel.user_password" clearable :maxlength="20" placeholder="请输入密码" />
+          </el-form-item>
+
+        </el-form>
+
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="formshow = false">取 消</el-button>
+        <el-button type="primary" @click="handlerFormSubmit('editform')">确 定</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import * as API_UserInfo from '@/api/calling-userInfo'
+export default {
+  name: 'PartUserManager',
+  props: {
+    partId: {
+      type: Number,
+      default: null
+    }
+  },
+  data: function() {
+    return {
+      /** 表格数据 */
+      tableData: [],
+      imageUrl: null,
+      createform: {},
+      /** 表单数据 */
+      formmodel: {
+        user_name: null,
+        user_password: null
+      },
+      /** 弹出窗口标题信息 */
+      formtitle: '新增账号',
+      formshow: false, // 编辑表单显示开关
+      /** 表单校验 */
+      rules: {
+        user_name: [
+          { required: true, message: '请输入登陆账号', trigger: 'blur' }
+        ],
+        user_password: [
+          { required: true, message: '请输入登陆密码', trigger: 'blur' }
+        ]
+      },
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1,
+        fixedCondition: 'PARTID=' + this.partId
+      },
+      /** 翻页数据*/
+      pageData: [],
+      loading: false,
+      /** 表格选中记录 */
+      multipleSelection: [],
+      /** 表单提交指示 0 代表新增 1代表修改 */
+      editflag: 0
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 240
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    /** 新增按钮 */
+    handlerAdd: function() {
+      this.formmodel = {
+
+      }
+      if (this.$refs.editform) {
+        this.$refs.editform.resetFields()
+      }
+      this.imageUrl = null
+      if (this.$refs.editform) {
+        this.$refs.editform.resetFields()
+      }
+      this.editflag = 0
+      this.formtitle = '新增职员'
+      this.formshow = true
+    },
+    /** 编辑按钮 */
+    handlerEdit: function(index, row) {
+      if (this.$refs.editform) {
+        this.$refs.editform.resetFields()
+      }
+      this.formmodel = { ...row }
+      this.editflag = 1
+      this.formtitle = '修改账号'
+      this.formshow = true
+    },
+    /** 表格行选择变化记录选中行数据*/
+    selectFun: function(val) {
+      this.multipleSelection = val
+    },
+    /** 删除单条数据 */
+
+    handlerDelete(ids) {
+      this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        API_UserInfo.remove(ids).then(
+          response => {
+            this.getList()
+            this.$message({
+              type: 'success',
+              message: '删除成功!'
+            })
+          }
+        ).catch(response => {
+          this.$message({
+            type: 'info',
+            message: response.message
+          })
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        })
+      })
+    },
+    /** 批量数据删除处理(删除选中的行) */
+    batchDelete: function() {
+      if (this.multipleSelection.length === 0) {
+        this.$alert('没有选择任何记录!', '系统提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+          }
+        })
+      } else {
+        const ids = []
+        this.multipleSelection.forEach(function(item) {
+          ids.push(item.id)
+        })
+        this.handlerDelete(ids.join(','))
+      }
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      const param = this.MixinClone(this.params)
+      API_UserInfo.getList(param).then(response => {
+        this.loading = false
+        this.tableData = [...response.data]
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+
+    /** 新增 提交表单 */
+    handlerFormSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          /** 新增 */
+          if (this.editflag === 0) {
+            this.formmodel.partid = this.partId
+            API_UserInfo.add(this.formmodel).then(() => {
+              this.formshow = false
+              this.$message.success('保存成功!')
+              this.getList()
+            }).catch(response => {
+              this.formshow = false
+              this.$message.error(response.message)
+              this.getList()
+            })
+          } else {
+            /** 修改 */
+            API_UserInfo.update(this.formmodel.id, this.formmodel).then(() => {
+              this.formshow = false
+              this.$message.success('修改成功!')
+              this.getList()
+            }).catch(response => {
+              this.formshow = false
+              this.$message.error(response.message)
+              this.getList()
+            })
+          }
+        }
+      })
+    },
+    /** 处理搜索 */
+    handlerSearch(keywords) {
+      this.params.query = keywords
+      this.getList()
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.getList()
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 449 - 0
src/views/ncs-orginazition/index.vue

@@ -0,0 +1,449 @@
+<template>
+  <div>
+    <ag-grid-layout
+      toolbar
+      :table-height="tableHeight"
+      theme="ag-theme-alpine"
+      :column-defs="columnDefs"
+      :row-data="rowData"
+      :locale-text="localeText"
+      :grid-options="gridOptions"
+      :default-col-def="defaultColDef"
+      :animate-rows="true"
+      :row-selection="rowSelection"
+      @filterChanged="filterModifed"
+      @sortChanged="gridSortChange"
+    >
+      <!--        @rowDoubleClicked="getList"-->
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch" />
+        </div>
+        <div class="toolbar-btns">
+          <el-button type="primary" size="mini" @click="createOrginazition">新建组织</el-button>
+        </div>
+      </div>
+      <el-pagination
+        v-if="pageData"
+        slot="pagination"
+        :current-page="pageData.page_no"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageData.page_size"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="pageData.data_total"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+      />
+    </ag-grid-layout>
+    <!-- 新建组织弹窗 -->
+    <el-dialog :title.sync="formtitle" :visible.sync="formshow" width="50%">
+      <div>
+        <el-form ref="editform" :rules="rules" label-width="120px" :model="formmodel">
+
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="组织简称" prop="shop_name">
+                <el-input v-model="formmodel.shop_name" clearable :maxlength="100" placeholder="请输入组织简称" />
+              </el-form-item>
+
+            </el-col>
+            <el-col :span="16">
+              <el-form-item label="组织全称" prop="full_name">
+                <el-input v-model="formmodel.full_name" clearable :maxlength="100" placeholder="请输入组织全称" />
+              </el-form-item>
+
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="组织类型" prop="shop_type">
+                <el-select v-model="formmodel.shop_type" placeholder="请选择组织类型" clearable>
+                  <el-option label="医院" value="6" />
+                  <el-option label="科室" value="5" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+
+              <el-form-item label="管理员账号" prop="member_name">
+                <el-input v-model="formmodel.member_name" clearable :maxlength="100" placeholder="请输入管理员账号" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+
+              <el-form-item label="管理员密码" prop="member_password">
+                <el-input v-model="formmodel.member_password" type="password" clearable :maxlength="100" placeholder="请输入管理员密码" />
+              </el-form-item>
+            </el-col>
+
+          </el-row>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="所属组织" prop="parent_id">
+                <el-select v-model="formmodel.parent_id" placeholder="请选择上级组织" clearable>
+                  <el-option v-for="(item,index) in parents" :key="index" :label="item.shop_name" :value="item.shop_id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="formshow = false">取 消</el-button>
+        <el-button type="primary" @click="handlerFormSubmit('editform')">确 定</el-button>
+      </div>
+    </el-dialog>
+    <!-- 新建组织弹窗结束 -->
+  </div>
+</template>
+
+<script>
+import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
+import * as API_PartInfo from '@/api/ncs_partInfo'
+import { unix2Date } from '@/utils/Foundation'
+import ButtonCellRender from '../../components/AgGridCellRender/ButtonCellRender'
+export default {
+  name: 'Index',
+  components: { ButtonCellRender },
+  data() {
+    return {
+      tableData: [],
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1
+      },
+      /** 新建组织弹出参数 **/
+      formtitle: '新建组织',
+      formshow: false,
+      formmodel: {},
+      rules: {
+        shop_name: [
+          { required: true, message: '组织名称必须选择', trigger: 'blur' }
+        ],
+        full_name: [
+          { required: true, message: '组织全称必须填写', trigger: 'blur' }
+        ],
+        shop_type: [
+          { required: true, message: '组织类型必须选择', trigger: 'blur' }
+        ],
+        member_name: [
+          { required: true, message: '管理员账号必须填写', trigger: 'blur' }
+        ],
+        member_password: [
+          { required: true, message: '管理员密码必须填写', trigger: 'blur' }
+        ]
+      },
+      /** 上级机构数组 **/
+      parents: [],
+      /** ag-grid参数 **/
+      pageData: [],
+      loading: false,
+      errorId: null,
+      shopVisible: false,
+      columnDefs: null,
+      rowData: null,
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      filterState: null,
+      rowSelection: null
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 130
+    }
+  },
+  beforeMount() {
+    this.gridOptions = {
+    }
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 100,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: 'ID', field: 'shop_id', sortable: true, filter: 'agNumberColumnFilter' },
+      { headerName: '组织简称', field: 'shop_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep'
+      }
+      },
+      // lockPosition 锁定位置,会在第一列
+      // lockPinned = true 不能拖动然后固定
+      // resizeable 单元个大小是否可以调整
+      { headerName: '组织全称', field: 'full_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        flex: 1
+      }},
+      { headerName: '组织类型', field: 'shop_type', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        flex: 1
+      },
+      cellRenderer: this.shopTypeFormatter
+      },
+
+      { headerName: '管理账号', field: 'member_name', sortable: true, filter: 'agTextColumnFilter', flex: 1 },
+      { headerName: '上级组织简称', field: 'parent_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep'
+      }
+      },
+      { headerName: '上级组织全称', field: 'parent_full_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        flex: 1
+      }},
+      { headerName: '编辑', field: 'shop_id',
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: {
+          onClick: this.handEdit,
+          label: '编辑',
+          buttonType: 'primary',
+          buttonSize: 'mini'
+        },
+        filter: false,
+        pinned: 'right',
+        lockPinned: true,
+        width: 100,
+        resizable: false,
+        sortable: false },
+      { headerName: '删除', field: 'shop_id',
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: {
+          onClick: this.deleteSingle,
+          label: '删除',
+          buttonType: 'danger',
+          buttonSize: 'mini'
+        },
+        pinned: 'right',
+        lockPinned: true,
+        width: 100,
+        resizable: false,
+        filter: false,
+        sortable: false }
+    ]
+    this.defaultColDef = {
+      filter: 'agTextColumnFilter',
+      sortable: true,
+      resizable: true,
+      comparator: this.dateCustomComparator,
+      filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        textCustomComparator: this.textCustomComparator,
+        comparator: this.dateCustomComparator
+      }
+    }
+    this.rowSelection = 'multiple'
+  },
+  mounted() {
+    this.gridApi = this.gridOptions.api
+    this.gridColumnApi = this.gridOptions.columnApi
+    // var column = this.gridColumnApi.getColumn('id')
+    // const _this = this
+    // column.addEventListener('sortChanged', function(event) {
+    //   console.log(event)
+    //   // _this.rowData = []
+    //   if (event.column.sort !== null && event.column.sort !== '') {
+    //     _this.params.sort = event.column.colId
+    //     _this.params.dir = event.column.sort
+    //   } else {
+    //     delete _this.params.sort
+    //     delete _this.params.dir
+    //   }
+    //   _this.getList()
+    //   // event.columnApi.applyColumnState({ defaultState: { sort: null }})
+    //   // console.log('Column visibility changed', event)
+    // })
+    this.getList()
+  },
+  methods: {
+    handlerDelete(ids) {
+      this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        API_PartInfo.remove(ids).then(
+          response => {
+            this.getList()
+            this.$message({
+              type: 'success',
+              message: '删除成功!'
+            })
+          }
+        ).catch(response => {
+          this.$message({
+            type: 'info',
+            message: response.message
+          })
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消删除'
+        })
+      })
+    },
+    deleteSingle(row) {
+      this.handlerDelete(row.shop_id)
+    },
+    /**
+       * 创建组织
+       */
+    createOrginazition() {
+      this.formshow = true
+      this.formmodel = {
+        shop_name: '',
+        full_name: '',
+        member_name: '',
+        member_password: ''
+      }
+      this.getPartents()
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      const param = this.MixinClone(this.params)
+      this.gridApi.showLoadingOverlay()
+      API_PartInfo.getList(param).then(response => {
+        this.loading = false
+        // this.tableData = [...response.data]
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+        this.rowData = [...response.data]
+        console.log('rowData', this.rowData)
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+    /** 处理搜索 */
+    handlerSearch(keywords) {
+      this.params.query = keywords
+      this.getList()
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.getList()
+    },
+    gridSortChange(param) {
+      console.log('sortparam', param)
+      const columnState = param.columnApi.getColumnState()
+      // 排序状态
+      const sortState = columnState.filter(function(s) {
+        return s.sort != null
+      }).map(function(s) {
+        return {
+          colId: s.colId,
+          sort: s.sort,
+          sortIndex: s.sortIndex
+        }
+      }).sort(function(a, b) {
+        return a.sortIndex - b.sortIndex
+      })
+      if (sortState.length > 0) {
+        if (sortState.length === 1) {
+          this.params.sort = sortState[0].colId
+          this.params.dir = sortState[0].sort
+        } else {
+          let sortstring = ''
+          sortState.forEach(function(item) {
+            sortstring += item.colId + ' ' + item.sort + ','
+          })
+          this.params.sort = sortstring.substring(0, sortstring.length - 1)
+          this.params.dir = ' '
+        }
+      } else {
+        delete this.params.sort
+        delete this.params.dir
+      }
+
+      this.getList()
+      console.log(sortState)
+    },
+    filterModifed(param) {
+      console.log(param)
+      var model = param.api.getFilterModel()
+      console.log('model', JSON.stringify(model))
+      this.params.filter = JSON.stringify(model)
+      this.getList()
+    },
+
+    shopTypeFormatter(param) {
+      if (param.value === '0') {
+        return '<span style="color:green">机构</span>'
+      } else if (param.value === '5') {
+        return '<span style="color:red">科室</span>'
+      } else if (param.value === '6') {
+        return '<span style="color:orange">医院</span>'
+      }
+    },
+    handEdit(row) {
+      this.$router.push({ name: 'partInfoSetting', params: { id: row.shop_id, callback: this.getList() }})
+    },
+    /** 获取上级机构数组 特制医院 **/
+    getPartents() {
+      API_PartInfo.listByType(6).then(res => {
+        this.parents = [...res]
+      })
+    },
+    /**
+       * 提交新增表单
+       * @param formname
+       */
+    handlerFormSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          /** 新增 */
+          delete this.formmodel.id
+          this.formmodel.partid = this.$store.getters.partId
+          API_PartInfo.add(this.formmodel).then(() => {
+            this.formshow = false
+            this.$message.success('保存成功!')
+            this.getList()
+          }).catch(err => {
+            this.$message.error(err)
+          })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 74 - 0
src/views/ncs-orginazition/partInfoSetting.vue

@@ -0,0 +1,74 @@
+<template>
+  <div>
+    <el-tabs v-model="activeName" style="margin:15px;" type="border-card">
+      <el-tab-pane label="科室信息设置" name="partInfo">
+        <keep-alive>
+          <part-info-edit :part-id="part_id" />
+        </keep-alive>
+      </el-tab-pane>
+      <el-tab-pane label="科室管理账号" name="partInfoAccount">
+        <keep-alive>
+          <part-user-manager :part-id="part_id" />
+        </keep-alive>
+      </el-tab-pane>
+      <el-tab-pane label="护士主机APP更新" name="nurse">
+        <keep-alive>
+         <app-version-manager :part-id="part_id" :device-type="1"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+      <el-tab-pane label="护士主机可视版" name="vnurse">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="101"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+      <el-tab-pane label="门口机APP更新" name="door">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="3"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+
+      <el-tab-pane label="门口机可视版" name="vdoor">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="103"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+
+      <el-tab-pane label="5寸病床分机APP" name="sickbed">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="4"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+
+      <el-tab-pane label="7寸病床分机APP" name="sevensickbed">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="204"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+      <el-tab-pane label="病床分机可视版" name="vsickbed">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="104"></app-version-manager>
+        </keep-alive>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import PartInfoEdit from './components/partInfoEdit'
+import PartUserManager from './components/partUserManager'
+import AppVersionManager from './components/AppVersionManager'
+export default {
+  name: 'PartInfoSetting',
+  components: { AppVersionManager, PartUserManager, PartInfoEdit },
+  data() {
+    return {
+      part_id: Number(this.$route.params.id),
+      activeName: 'partInfo'
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>