Переглянути джерело

Merge branch 'master' of http://git.wdklian.com/allen/ncs_ui

* 'master' of http://git.wdklian.com/allen/ncs_ui:
  1、病人管理、换床及出院开发; 2、标签管理、任务管理开发; 3、其他优化
wuyunfeng 4 роки тому
батько
коміт
b83fb9ad5a

+ 5 - 0
package-lock.json

@@ -10303,6 +10303,11 @@
         "set-immediate-shim": "~1.0.1"
       }
     },
+    "jwt-decode": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/jwt-decode/download/jwt-decode-3.1.2.tgz",
+      "integrity": "sha1-P7MZ82daLfDCiVyPXp+ktnsE7Vk="
+    },
     "keypress": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz",

+ 5 - 5
src/api/ncs_clerk.js

@@ -18,8 +18,8 @@ export function getList(params) {
   })
 }
 export function add(params) {
-  // params = JSON.parse(JSON.stringify(params))
-  // params.password = md5(params.password)
+  params = JSON.parse(JSON.stringify(params))
+  params.password = md5(params.password)
   return request({
     url: '/ncs/clerk',
     method: 'POST',
@@ -39,9 +39,9 @@ export function remove(params) {
 }
 
 export function update(id, params) {
-  // if (params.password) {
-  //   params.password = md5(params.password)
-  // }
+  if (params.password) {
+    params.password = md5(params.password)
+  }
   return request({
     url: `/ncs/clerk/${id}`,
     method: 'put',

+ 27 - 1
src/api/ncs_customer.js

@@ -16,7 +16,6 @@ export function getCustomerInfo(id) {
   })
 }
 
-
 export function updateAll(params) {
   return request({
     url: '/ncs/customer/updateAll',
@@ -25,3 +24,30 @@ export function updateAll(params) {
     headers: { 'Content-Type': 'application/json' }
   })
 }
+
+export function getList(params) {
+  return request({
+    url: '/ncs/customer/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+/** 修改 */
+export function update(id, params) {
+  return request({
+    url: `/ncs/customer/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+export function remove(id) {
+  return request({
+    url: `/ncs/customer/${id}`,
+    method: 'DELETE',
+    loading: true
+  })
+}

+ 8 - 0
src/api/ncs_hospitalFrame.js

@@ -51,3 +51,11 @@ export function getFrameWithPatientAndDeviceVO() {
   })
 }
 
+export function getSickbedByPartId(id) {
+  return request({
+    url: `/ncs/frame/getSickbedByPartId/${id}`,
+    method: 'GET',
+    loading: false
+  })
+}
+

+ 0 - 1
src/api/ncs_nurse_config.js

@@ -3,7 +3,6 @@ export function getList(params) {
   return request({
     url: '/ncs/nurse_config/page',
     method: 'POST',
-    loading: true,
     data: params,
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
   })

+ 40 - 0
src/api/ncs_task.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+export function getList(params) {
+  return request({
+    url: '/ncs/task/page',
+    method: 'POST',
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function remove(id) {
+  return request({
+    url: `/ncs/task/${id}`,
+    method: 'DELETE',
+    loading: true
+  })
+}
+/** 修改 */
+export function update(id, params) {
+  return request({
+    url: `/ncs/task/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+/** 新增 */
+export function add(params) {
+  return request({
+    url: '/ncs/task',
+    method: 'POST',
+    loading: true,
+    data: params
+  })
+}
+export function listByPartId(params) {
+  return request({
+    url: `/ncs/task/listByPartId`,
+    method: 'POST',
+    data: params
+  })
+}

+ 30 - 0
src/components/Tooltip/Tooltip.vue

@@ -0,0 +1,30 @@
+<template>
+  <div>
+    <el-tooltip class="item" effect="dark" :content="content" placement="top-start">
+      <span>{{ content }}</span>
+    </el-tooltip>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ButtonCellRender',
+  data() {
+    return {
+      content: 'content'
+    }
+  },
+  beforeMount() {
+  },
+  mounted() {
+    const { content } = this.params
+    if (content) {
+      this.content = this.params.node.data[content]
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 39 - 0
src/router/index.js

@@ -126,6 +126,45 @@ export const partRoutes = [
     ]
   },
   {
+    path: '/customer',
+    component: Layout,
+    redirect: '/customer/list',
+    children: [
+      {
+        path: 'customer',
+        component: () => import('@/views/customer/list'),
+        name: 'customer',
+        meta: { title: '病人管理', icon: 'el-icon-s-custom', noCache: true }
+      }
+    ]
+  },
+  {
+    path: '/remark',
+    component: Layout,
+    redirect: '/remark/index',
+    children: [
+      {
+        path: 'remark',
+        component: () => import('@/views/ncs-remark/index'),
+        name: 'customer',
+        meta: { title: '便签管理', icon: 'el-icon-s-order', noCache: true }
+      }
+    ]
+  },
+  {
+    path: '/task',
+    component: Layout,
+    redirect: '/task/index',
+    children: [
+      {
+        path: 'task',
+        component: () => import('@/views/ncs-task/index'),
+        name: 'customer',
+        meta: { title: '任务管理', icon: 'table', noCache: true }
+      }
+    ]
+  },
+  {
     path: '/ncs-calling-history',
     component: Layout,
     redirect: '/ncs-calling-history/index',

+ 1 - 1
src/vendor/Export2Excel.js

@@ -141,7 +141,7 @@ export function export_table_to_excel(id) {
 
   saveAs(new Blob([s2ab(wbout)], {
     type: "application/octet-stream"
-  }), "test.xlsx")
+  }), "Tooltip.xlsx")
 }
 
 export function export_json_to_excel({

+ 23 - 18
src/views/customer/customerEdit.vue

@@ -150,7 +150,7 @@
             <div >
               <el-card v-for="(item, index) in tableData" :key="index">
                 <div>
-                  <span style="margin-left: 20px;font-weight:bold">标签内容:</span><span style="line-height:1.5">{{item.content}}</span>
+                  <span style="margin-left: 20px;font-weight:bold">备注内容:</span><span style="line-height:1.5">{{item.content}}</span>
                 </div>
                 <div style="margin: 10px">
                   <div style="float: left">
@@ -183,7 +183,7 @@
         </el-card>
         <el-dialog title="添加用户备注" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
           <el-form :model="formmodel" :rules="rules" ref="editForm" label-width="140px">
-            <el-form-item label="内容">
+            <el-form-item label="内容" prop="content">
               <el-input
                       type="textarea"
                       :autosize="{ minRows: 2, maxRows: 6}"
@@ -195,16 +195,16 @@
               </el-input>
             </el-form-item>
             <el-form-item label="复件">
-              <el-upload v-if="!fileName"
+              <el-upload v-if="!filePath"
                          class="avatar-uploader"
-                         :action="`${uploadServer}/ncs/remark/upload`"
+                         :action="`${uploadServer}?scene=avatar`"
                          :show-file-list="false"
                          :on-success="uploaded"
                          :before-upload="handleShopLogoBefore"
               >
                 <i class="el-icon-plus avatar-uploader-icon" />
               </el-upload>
-              <span v-if="fileName">{{fileName}}</span>
+              <span v-if="filePath">{{fileName}}</span>
             </el-form-item>
             <el-form-item>
               <el-button type="primary" @click="addRemark">立即添加</el-button>
@@ -271,12 +271,9 @@
               }
             }
           ],
-          age: [{
-            required: true, message: '请输入年龄', trigger: 'blur'
-          }],
-          content: [{
-            required: true, message: '请输入备注内容', trigger: 'blur'
-          }],
+          age: [{required: true, message: '请输入年龄', trigger: 'blur'}],
+          content: [{required: true, message: '请输入备注内容', trigger: 'blur'}],
+          in_date: [{required: true, message: '请选择入院日期', trigger: 'blur'}],
         },
         isDisabled: false,
         doctors: [],
@@ -296,8 +293,8 @@
         dialogAddVisible: false,
         fileName: null,
         filePath: null,
-        uploadServer: serverUrl,
-        userInfo: JSON.parse(this.$store.getters.userInfo),
+        uploadServer: serverUrl + '/ncs/upload/uploadFile',
+        userInfo: this.$store.getters.userInfo,
         content: null,
         activeName: 'customerEdit',
         memberId: null
@@ -451,7 +448,7 @@
           named: null,
           card_no: null,
           id_no: null,
-          in_date: null,
+          in_date: new Date(new Date().toLocaleDateString()).getTime(),
           out_date: null,
           doctor_id: null,
           nurse_id: null,
@@ -498,29 +495,37 @@
       },
       /** 上传成功后的钩子 更换图片 置空存储数组*/
       uploaded(res) {
-        this.filePath = serverUrl + '/' + res.file_path
-        this.fileName = res.file_name
+        this.filePath = serverUrl + '/' + res
       },
       /** 图片上传之前的校验 */
       handleShopLogoBefore(file) {
+        let _this = this
         return new Promise((resolve, reject) => {
           let hz = file.name
+          _this.fileName = hz
           let index = hz .lastIndexOf(".");
           hz  = hz .substring(index + 1, hz .length);
           const isImg = hz === 'jpeg' || hz === 'png' || hz === 'jpg' || hz === 'txt'  || hz === 'doc' || hz === 'docx' || hz === 'xls' || hz === 'xlsx'
           const isLt5M = file.size / 1024 / 1024 < 5
           if (!isImg) {
-            this.$message.error('上传复件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!')
+            _this.$message.error('上传复件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!')
             reject()
           }
           if (!isLt5M) {
-            this.$message.error('上传复件大小不能超过 5MB!')
+            _this.$message.error('上传复件大小不能超过 5MB!')
             reject()
           }
           resolve()
         })
       },
       addRemark() {
+        if (!this.content) {
+          this.$message.info('请输入内容!')
+          return
+        }
+        if (!this.filePath) {
+          this.fileName = null
+        }
         const data = {
           partId: this.$store.getters.partId,
           type: 1,

+ 2 - 1
src/views/customer/customer_relative.vue

@@ -107,7 +107,8 @@
           page_size: 10,
           page_no: 1,
           sort: 'create_time',
-          dir: 'desc'
+          dir: 'desc',
+          fixedCondition: ''
         },
         currentRow: {},
         /** 列表数据 */

+ 288 - 0
src/views/customer/list.vue

@@ -0,0 +1,288 @@
+<template>
+  <div>
+    <en-table-layout
+      toolbar
+      @selection-change="selectFun"
+      pagination
+      :tableData="tableData"
+      :height="600"
+      :loading="loading"
+      :default-sort="{prop: 'id', order: 'ascending'}"
+    >
+      <!--工具栏-->
+      <div slot="toolbar" class="inner-toolbar">
+        <div style="float: left">
+          <el-select v-model="callingType" placeholder="请选择病人状态" clearable @change="changeStatus">
+            <el-option label="在院" :value="0" />
+            <el-option label="已出院" :value="1" />
+          </el-select>
+        </div>
+        <div class="toolbar-search">
+          <en-table-search @search="handlerSearch" placeholder="请输入病人姓名或编号"/>
+        </div>
+        <div class="toolbar-btns">
+           <el-button type="danger" :disabled="multipleSelection.length === 0" @click="batchDelete">批量删除</el-button>
+        </div>
+      </div>
+      <!--表头-->
+      <template slot="table-columns">
+        <el-table-column type="selection" width="55" align="center"></el-table-column>
+        <el-table-column prop="named" label="姓名" align="center" min-width="160"></el-table-column>
+        <el-table-column prop="card_no" label="病人编号" align="center" min-width="160"></el-table-column>
+        <el-table-column prop="relative_name" label="年龄" align="center" :formatter="formatterAge" width="100"></el-table-column>
+        <el-table-column prop="in_date" label="住院时间" align="center" :formatter="formatterDate" min-width="190"></el-table-column>
+        <el-table-column prop="status" label="状态" align="center" :formatter="formatterStatus" width="100"></el-table-column>
+        <el-table-column label="操作" width="220">
+          <template slot-scope="scope">
+            <el-button type="primary" size="mini" @click="handleAdd(scope.row.id,scope.row.frame_id)">编辑</el-button>
+            <el-button v-if="!scope.row.status" type="warning" size="mini" @click="handlerEdit(scope.row.id, 1)">换床</el-button>
+            <el-button v-if="!scope.row.status" size="mini" @click="handlerEdit(scope.row.id, 2)">出院</el-button>
+          </template>
+        </el-table-column>
+      </template>
+
+      <!--翻页-->
+      <el-pagination
+        slot="pagination"
+        v-if="pageData"
+        :current-page="pageData.page_no"
+        :page-sizes="[20, 30, 50, 100]"
+        :page-size="pageData.page_size"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="pageData.data_total">
+      </el-pagination>
+    </en-table-layout>
+
+    <el-dialog title="编辑病人信息" :visible.sync="dialogAddVisible" :append-to-body="true" width="85%">
+      <customer-edit :customer-id="customerId" :frame-id="frameId" @saved="handlePatientFinished"></customer-edit>
+    </el-dialog>
+
+    <el-dialog title="换床" :visible.sync="formshow" :append-to-body="true" width="80%">
+      <el-form ref="editForm" label-width="140px">
+        <el-form-item label="病床">
+          <el-select v-model="changeFrameId" placeholder="请选择病床" clearable>
+            <el-option v-for="(item, index) in frameList" :label="item.name+'床'" :value="item.id" :key="index" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="updateFrameId">确定换床</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import * as API_customer from '@/api/ncs_customer'
+  import {unix2Date} from "@/utils/Foundation"
+  import customerEdit from '@/views/customer/customerEdit'
+  import * as RegExp from "@/utils/RegExp"
+  import * as API_hospitalFrame from "@/api/ncs_hospitalFrame"
+
+  export default {
+    name: 'customer_list',
+    components: { customerEdit },
+    data: function() {
+      return {
+        /** 列表loading状态 */
+        loading: false,
+        /** 列表参数 */
+        params: {
+          page_size: 10,
+          page_no: 1,
+          sort: 'status,create_time',
+          dir: 'desc',
+          fixedCondition: ' 1 = 1'
+        },
+        currentRow: {},
+        /** 列表数据 */
+        tableData: [],
+        pageData: [],
+        dialogAddVisible: false,
+        /** 选中行数据 */
+        multipleSelection: [],
+        lookForm: {},
+        formshow: false,
+        changeFrameId: null,
+        customerId: null,
+        frameId: null,
+        callingType: null,
+        frameList: []
+      }
+    },
+    mounted() {
+      this.GET_List()
+    },
+    methods: {
+      /** 选择行变化时,记录选中的行数据 */
+      selectFun(val) {
+        this.multipleSelection = val
+      },
+      /** 加载设备信息列表 */
+      GET_List() {
+        this.loading = true
+        this.params.fixedCondition += ' and part_id = ' + this.$store.getters.partId
+        API_customer.getList(this.params).then(res => {
+          this.loading = false
+          this.tableData = res.data
+          this.pageData = {
+            page_no: res.page_no,
+            page_size: res.page_size,
+            data_total: res.data_total
+          }
+        }).catch(() => {
+          this.loading = false
+        })
+      },
+      /** 处理搜索 **/
+      handlerSearch(keywords) {
+        this.params.query = keywords
+        this.GET_List()
+      },
+      changeStatus(value) {
+        delete this.params.fixedCondition
+        if (value) {
+          this.params.fixedCondition = ' status=' + value
+        } else {
+          this.params.fixedCondition = ' 1 = 1'
+        }
+        this.GET_List()
+      },
+      /** 单条数据删除处理 */
+      handlerDelete(ids) {
+        let test = '你确定要删除此病人信息?'
+        let _this = this
+        this.$confirm(test, '警告', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          API_customer.remove(ids).then(
+            response => {
+              _this.GET_List()
+            }
+          ).catch(response => {
+            _this.$message({
+              type: 'info',
+              message: response.message
+            })
+          })
+        })
+      },
+      /** 批量数据删除处理(删除选中的行) */
+      batchDelete: function() {
+        const ids = []
+        this.multipleSelection.forEach(function(item) {
+          ids.push(item.id)
+        })
+        this.handlerDelete(ids.join(','), 'del')
+      },
+      /** 添加设备信息 */
+      handleAdd(id, frame_id) {
+        this.dialogAddVisible = true
+        this.customerId = id
+        this.frameId = frame_id
+      },
+      handlerEdit(id, type) {
+        this.customerId = id
+        if (type === 1) {
+          API_hospitalFrame.getSickbedByPartId(this.$store.getters.partId).then(res=> {
+            this.frameList = res
+          })
+          this.formshow = true
+        } else {
+          let _this = this
+          this.$confirm('你确定要进行出院操作吗', '警告', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            const data = {
+              out_date: new Date(new Date().toLocaleDateString()).getTime(),
+              status: 1
+            }
+            _this.updateSave(data)
+          })
+        }
+      },
+      /** 分页大小发生改变 */
+      handlePageSizeChange(size) {
+        this.params.page_size = size
+        this.GET_List()
+      },
+      /** 分页页数发生改变 */
+      handlePageCurrentChange(page) {
+        this.params.page_no = page
+        this.GET_List()
+      },
+      formatterAge(row, column, cellValue) {
+        return row.age + row.age_unit
+      },
+      formatterStatus(row, column, cellValue) {
+        if (row.status) {
+          return '已出院'
+        } else {
+          return '在院'
+        }
+      },
+      formatterDate(row, column, cellValue) {
+        let date = unix2Date(row.in_date, 'yyyy-MM-dd')
+        if (row.out_date) {
+          date += '至' + unix2Date(row.out_date, 'yyyy-MM-dd')
+        } else {
+          if (row.in_date) {
+            date += '至今'
+          }
+        }
+        return date
+      },
+      handlePatientFinished() {
+        this.dialogAddVisible = false
+        this.GET_List()
+      },
+      updateFrameId() {
+        if (!this.changeFrameId) {
+          this.$message({
+            type: 'info',
+            message: '请选择病床'
+          })
+          return
+        }
+        const data = {
+          frame_id: this.changeFrameId
+        }
+        this.updateSave(data)
+      },
+      updateSave(data) {
+        API_customer.update(this.customerId, data).then(res=> {
+          this.$message({
+            type: 'success',
+            message: '修改成功'
+          })
+          this.formshow = false
+          this.GET_List()
+        })
+      }
+    }
+  }
+</script>
+
+<style type="text/scss" scoped>
+
+  /deep/ div.toolbar {
+    height: 70px;
+    padding: 20px 0;
+  }
+
+  /deep/ .el-table {
+    width: 100%;
+    overflow-x: scroll;
+
+    & td:not(.is-left) {
+      text-align: center;
+    }
+  }
+
+</style>

+ 1 - 1
src/views/ncs-clerk/clerkList.vue

@@ -482,7 +482,7 @@
 
       /** 上传成功后的钩子 更换图片 置空存储数组*/
       uploaded(res) {
-        this.imageUrl = serverUrl + '/' + res.file_path
+        this.imageUrl = serverUrl + '/' + res
         this.addMemberForm.face = this.imageUrl
       }
 

+ 3 - 5
src/views/ncs-orginazition/index.vue

@@ -184,13 +184,11 @@ export default {
       // resizeable 单元个大小是否可以调整
       { headerName: '组织全称', field: 'full_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
         debounceMs: 200,
-        newRowsAction: 'keep',
-        flex: 1
+        newRowsAction: 'keep'
       }},
-      { headerName: '组织类型', field: 'shop_type', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+      { headerName: '组织类型', field: 'shop_type', sortable: true, filter: 'agTextColumnFilter', flex: 1, filterParams: {
         debounceMs: 200,
-        newRowsAction: 'keep',
-        flex: 1
+        newRowsAction: 'keep'
       },
       cellRenderer: this.shopTypeFormatter
       },

+ 281 - 0
src/views/ncs-remark/index.vue

@@ -0,0 +1,281 @@
+<template>
+    <div class="app-container">
+        <!--工具栏-->
+        <div slot="toolbar" class="inner-toolbar">
+            <div class="toolbar-search">
+                <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch"/>
+            </div>
+        </div>
+        <div class="toolbar-btns">
+            <el-button type="success" @click="dialogAddVisible = true">新建便签</el-button>
+        </div>
+        <div v-if="tableData.length > 0" style="margin-top: 20px;">
+            <el-card v-for="(item, index) in tableData" :key="index">
+                <div><span style="margin-left: 20px;font-weight:bold">便签内容:</span><span style="line-height:1.5">{{item.content}}</span>
+                </div>
+                <div style="margin: 10px">
+                    <div style="float: left">
+                <span v-if="item.file_name">
+                  <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank"
+                           :download="item.file_name">{{item.file_name}}</el-link>
+                </span>
+                    </div>
+                    <div style="float: right">
+                        <p>
+                            <span style="font-weight:bold">创建时间:</span>{{formatterCreateTime(item.create_time)}}
+                            <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{item.create_name}}
+                        </p>
+                    </div>
+                </div>
+            </el-card>
+        </div>
+        <div v-else class="zwsj">
+            <span>暂无数据</span>
+        </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"
+        />
+
+        <el-dialog title="添加用户备注" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
+            <el-form :rules="rules" ref="editForm" label-width="140px">
+                <el-form-item label="内容" prop="content">
+                    <el-input
+                            type="textarea"
+                            :autosize="{ minRows: 2, maxRows: 6}"
+                            :minlength="2"
+                            :maxlength="300"
+                            show-word-limit
+                            :placeholder="'请输入文本内容,长度300'"
+                            v-model="content">
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="复件">
+                    <el-upload v-if="!filePath"
+                               class="avatar-uploader"
+                               :action="`${uploadServer}?scene=avatar`"
+                               :show-file-list="false"
+                               :on-success="uploaded"
+                               :before-upload="handleShopLogoBefore"
+                    >
+                        <i class="el-icon-plus avatar-uploader-icon"/>
+                    </el-upload>
+                    <span v-if="filePath">{{fileName}}</span>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="addRemark">立即添加</el-button>
+                    <el-button @click="quxiao">取消</el-button>
+                </el-form-item>
+            </el-form>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+    import * as API_Remark from '@/api/ncs_remark'
+    import {unixToDate} from '@/utils/Foundation'
+    import {serverUrl} from "@/utils/domain";
+    import * as RegExp from "@/utils/RegExp";
+    import * as remark_API from "@/api/ncs_remark";
+
+    export default {
+        name: 'Index',
+        data() {
+            return {
+                tableData: [],
+                /** 列表参数 */
+                params: {
+                    page_size: 20,
+                    page_no: 1,
+                    fixedCondition: ' type = 2 and part_id=' + this.$store.getters.partId,
+                    sort: 'create_time',
+                    dir: 'desc'
+                },
+                pageData: [],
+                loading: false,
+                dialogAddVisible: false,
+                fileName: null,
+                filePath: null,
+                uploadServer: serverUrl + '/ncs/upload/uploadFile',
+                userInfo: this.$store.getters.userInfo,
+                content: null,
+                rules: {
+                    content: [{required: true, message: '请输入备注内容', trigger: 'blur'}],
+                },
+            }
+        },
+        computed: {
+            tableHeight() {
+                return this.mainAreaHeight - 130
+            }
+        },
+        mounted() {
+            this.getList()
+        },
+        methods: {
+
+            /** 表格行选择变化记录选中行数据*/
+            selectFun: function (val) {
+                this.multipleSelection = val
+            },
+            /** 删除单条数据 */
+            handlerDelete(ids) {
+                this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(() => {
+                    API_Remark.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: '已取消删除'
+                    })
+                })
+            },
+            /** 分页大小发生改变 */
+            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_Remark.getRemarks(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
+                })
+            },
+            /** 处理搜索 */
+            handlerSearch(value) {
+                this.params.query = value
+                this.getList()
+            },
+            formatterCreateTime(date) {
+                return unixToDate(date)
+            },
+            quxiao(){
+                this.dialogAddVisible = false
+                this.content = null
+                this.fileName = null
+                this.filePath = null
+            },
+            /** 上传成功后的钩子 更换图片 置空存储数组*/
+            uploaded(res) {
+                this.filePath = serverUrl + '/' + res
+            },
+            /** 图片上传之前的校验 */
+            handleShopLogoBefore(file) {
+                let _this = this
+                return new Promise((resolve, reject) => {
+                    let hz = file.name
+                    _this.fileName = hz
+                    let index = hz .lastIndexOf(".");
+                    hz  = hz .substring(index + 1, hz .length);
+                    const isImg = hz === 'jpeg' || hz === 'png' || hz === 'jpg' || hz === 'txt'  || hz === 'doc' || hz === 'docx' || hz === 'xls' || hz === 'xlsx'
+                    const isLt5M = file.size / 1024 / 1024 < 5
+                    if (!isImg) {
+                        _this.$message.error('上传复件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!')
+                        reject()
+                    }
+                    if (!isLt5M) {
+                        _this.$message.error('上传复件大小不能超过 5MB!')
+                        reject()
+                    }
+                    resolve()
+                })
+            },
+            addRemark() {
+                if (!this.content) {
+                    this.$message.info('请输入内容!')
+                    return
+                }
+                if (!this.filePath) {
+                    this.fileName = null
+                }
+                const data = {
+                    partId: this.$store.getters.partId,
+                    type: 2,
+                    createName: this.userInfo.username,
+                    content: this.content,
+                    filePath: this.filePath,
+                    fileName: this.fileName
+                }
+                let _this = this
+                API_Remark.save(data).then(res=> {
+                    _this.$message.success('添加成功!')
+                    _this.getList()
+                    _this.quxiao()
+                })
+            },
+        }
+    }
+</script>
+
+<style scoped>
+    .zwsj {
+        text-align: center;
+        margin: 40px;
+        font-size: 20px;
+    }
+    /deep/ .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        overflow: hidden;
+    }
+
+    /deep/ .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+
+    /deep/ .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 100px;
+        height: 100px;
+        line-height: 100px;
+        text-align: center;
+    }
+
+    /deep/ .avatar {
+        width: 100px;
+        height: 100px;
+        display: block;
+    }
+</style>

+ 506 - 0
src/views/ncs-task/index.vue

@@ -0,0 +1,506 @@
+<template>
+    <div>
+<!--        <en-table-layout-->
+<!--                toolbar-->
+<!--                @selection-change="selectFun"-->
+<!--                @sort-change="tableSort"-->
+<!--                pagination-->
+<!--                :tableData="tableData"-->
+<!--                :height="600"-->
+<!--                :loading="loading"-->
+<!--                fit-->
+<!--                tooltip-effect="light"-->
+<!--                :default-sort="{prop: 'publish_time', order: 'descending'}"-->
+<!--        >-->
+<!--            &lt;!&ndash;工具栏&ndash;&gt;-->
+<!--            <div slot="toolbar" class="inner-toolbar">-->
+<!--                <div class="toolbar-search">-->
+<!--                    <en-table-search @search="handlerSearch" placeholder="请输入搜索关键字"/>-->
+<!--                </div>-->
+<!--                <div class="toolbar-btns">-->
+<!--                    <el-button type="primary" @click="handlerAdd">新增</el-button>-->
+<!--                    <el-button type="danger" @click="batchDelete">删除</el-button>-->
+<!--                </div>-->
+<!--            </div>-->
+<!--            &lt;!&ndash;表头&ndash;&gt;-->
+<!--            <template slot="table-columns">-->
+<!--                <el-table-column type="selection" width="55" align="center"></el-table-column>-->
+<!--                <el-table-column prop="task_content" label="内容" :formatter="contentformatter" align="left" min-width="300" :show-overflow-tooltip="true" />-->
+<!--                <el-table-column prop="task_plan_time" sortable="custom" label="计划任务时间" :formatter="formatterDate" align="center" width="170" />-->
+<!--                <el-table-column prop="task_do_time" sortable="custom" label="实际任务时间" :formatter="formatterDate2" align="center" width="170" />-->
+<!--                <el-table-column prop="task_success" label="任务状态" align="center">-->
+<!--                    <template slot-scope="scope">-->
+<!--                        <el-tag type="success" v-if="scope.row.task_result">成功</el-tag>-->
+<!--                        <el-tag type="error" v-if="scope.row.task_result == false">失败</el-tag>-->
+<!--                        <el-tag type="warning" v-if="scope.row.task_result == null">暂未操作</el-tag>-->
+<!--                    </template>-->
+<!--                </el-table-column>-->
+<!--                <el-table-column prop="result" label="任务结果" width="220" :show-overflow-tooltip="true"/>-->
+<!--                <el-table-column prop="task_do_name" label="最新操作人" width="100" align="center" />-->
+<!--                <el-table-column prop="create_id" label="创建人" width="100">-->
+<!--                    <template slot-scope="scope">-->
+<!--                        <span v-if="scope.row.create_id==0">系统</span>-->
+<!--                        <span v-else>{{scope.row.create_name}}</span>-->
+<!--                    </template>-->
+<!--                </el-table-column>-->
+<!--                <el-table-column style="text-align: left;" label="操作" width="160" fixed="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>-->
+<!--            &lt;!&ndash;翻页&ndash;&gt;-->
+<!--            <el-pagination-->
+<!--                    slot="pagination"-->
+<!--                    v-if="pageData"-->
+<!--                    :current-page="pageData.page_no"-->
+<!--                    :page-sizes="[10, 20, 50, 100]"-->
+<!--                    :page-size="pageData.page_size"-->
+<!--                    @size-change="handlePageSizeChange"-->
+<!--                    @current-change="handlePageCurrentChange"-->
+<!--                    layout="total, sizes, prev, pager, next, jumper"-->
+<!--                    :total="pageData.data_total">-->
+<!--            </el-pagination>-->
+<!--        </en-table-layout>-->
+
+        <ag-grid-layout
+                toolbar
+                :table-height="tableHeight"
+                theme="ag-theme-alpine"
+                :column-defs="columnDefs"
+                :row-data="tableData"
+                :locale-text="localeText"
+                :grid-options="gridOptions"
+                :default-col-def="defaultColDef"
+                :animate-rows="true"
+                :row-selection="rowSelection"
+                @filterChanged="filterModifed"
+                @sortChanged="gridSortChange"
+        >
+            <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>
+            <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="通知/任务" :visible.sync="formshow" width="50%">
+            <div>
+                <el-form ref="editform" :rules="rules" label-width="110px" :model="formmodel">
+                    <el-form-item label="发布/计划时间" prop="publish_time">
+                        <el-date-picker
+                                v-model="formmodel.publish_time"
+                                type="datetime"
+                                value-format="timestamp"
+                                placeholder="选择日期时间"
+                                align="right"
+                        >
+                        </el-date-picker>
+                    </el-form-item>
+
+                    <el-form-item label="概要" prop="subject">
+                        <el-input clearable v-model="formmodel.subject" :maxlength="30" placeholder="请输入概要"></el-input>
+                    </el-form-item>
+
+                    <el-form-item label="内容" prop="content">
+                        <el-input v-model="formmodel.content" type="textarea" rows="10" placeholder="请选输入内容"></el-input>
+                    </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_task from '@/api/ncs_task'
+    import {unix2Date, unixToDate} from "@/utils/Foundation"
+    import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
+    import Tooltip from '../../components/Tooltip/Tooltip'
+    import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
+    export default {
+        name: 'index',
+        components: { Tooltip, ButtonCellRender },
+        data: function () {
+            return {
+                /** 表格数据 */
+                tableData: [],
+                /** 表单数据 */
+                formmodel: {},
+                formshow: false, // 编辑表单显示开关
+                /** 表单校验 */
+                rules: {
+                    subject: [
+                        {required: true, message: '请输入概要', trigger: 'blur'}
+                    ],
+                    content: [
+                        {required: true, message: '请输入内容', trigger: 'blur'}
+                    ]
+                },
+                pageData: [],
+                loading: false,
+                multipleSelection: [],
+                params: {
+                    page_no: 1,
+                    page_size: 10,
+                    sort: 'create_time',
+                    dir: 'desc',
+                },
+                doctors: [],
+                memberusers: [],
+                editflag: 0,
+                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: 50,
+                    resizable: false,
+                    valueGetter: this.hashValueGetter
+                },
+                { headerName: '内容', field: 'task_content', sortable: true, filter: 'agTextColumnFilter', width: 400,
+                    cellRendererFramework: 'Tooltip',
+                    cellRendererParams: {
+                        content: 'task_content'
+                    },
+                },
+                { headerName: '计划任务时间', field: 'task_plan_time', valueFormatter: this.formatterDate, sortable: true, filter: false, width: 170 },
+                { headerName: '实际任务时间', field: 'task_do_time', valueFormatter: this.formatterDate, sortable: true, filter: false, width: 170 },
+                { headerName: '任务状态', field: 'task_success', filter: false, cellRenderer: this.formatterStasus, width: 100 },
+                { headerName: '任务结果', field: 'task_result', sortable: true, filter: false, width: 220,
+                    cellRendererFramework: 'Tooltip',
+                    cellRendererParams: {
+                        content: 'task_result'
+                    },
+                },
+                { headerName: '任务操作人', field: 'task_do_name', sortable: true, filter: true, width: 120 },
+                { headerName: '创建人', field: 'create_name', sortable: true, filter: true, width: 120},
+                { headerName: '操作任务', field: 'id',
+                    cellRendererFramework: 'ButtonCellRender',
+                    cellRendererParams: {
+                        onClick: this.handlerEdit,
+                        label: '操作任务',
+                        buttonType: 'primary',
+                        buttonSize: 'mini'
+                    },
+                    filter: false,
+                    pinned: 'right',
+                    lockPinned: true,
+                    width: 100,
+                    resizable: false,
+                    sortable: false },
+                { headerName: '删除', field: '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.testComparator,
+                filterParams: {
+                    debounceMs: 200,
+                    newRowsAction: 'keep',
+                    textCustomComparator: this.textCustomComparator,
+                    comparator: this.testComparator
+                }
+            },
+                this.rowSelection = 'multiple'
+        },
+        mounted() {
+            this.gridApi = this.gridOptions.api
+            this.getList()
+        },
+        methods: {
+            handlerAdd: function () {
+                this.formmodel = {}
+
+                if (this.$refs.editform) {
+                    this.$refs.editform.resetFields()
+                }
+                this.editflag = 0
+                this.formshow = true
+            },
+            handlerEdit: function (index, row) {
+                if (this.$refs.editform) {
+                    this.$refs.editform.resetFields()
+                }
+                this.formmodel = {
+                    ...row
+                }
+                this.formmodel.publish_time *= 1000
+                this.formmodel.create_time *= 1000
+                this.editflag = 1
+                this.formshow = true
+            },
+            /** 选择行变化时,记录选中的行数据 */
+            selectFun(val) {
+                this.multipleSelection = val
+            },
+            /** 单条数据删除处理 */
+            handlerDelete(ids) {
+                this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(() => {
+                    API_task.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
+                this.gridApi.showLoadingOverlay()
+                API_task.getList(this.params).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.create_time = Date.parse(new Date()) / 1000
+                            this.formmodel.publish_time = this.formmodel.publish_time / 1000
+                            API_task.add(this.formmodel).then(() => {
+                                this.formshow = false
+                                this.$message.success('保存成功!')
+                                this.getList()
+                            })
+                        } else {
+                            /** 修改通知 */
+                            this.formmodel.create_time /= 1000
+                            this.formmodel.publish_time /= 1000
+                            API_task.update(this.formmodel.id, this.formmodel).then(() => {
+                                this.formshow = false
+                                this.$message.success('修改成功!')
+                                this.getList()
+                            }).catch(response => {
+                                this.formshow = false
+                                this.$message.warning(response.message)
+                                this.getList()
+                            })
+                        }
+                    }
+                })
+            },
+            /** 选择医生时把医生名字写入formodel */
+            doctorchange(val) {
+                if (val !== '') {
+                    this.formmodel.doctor_name = this.doctors.find((item) => {
+                        return item.member_id === val
+                    }).uname
+                }
+            },
+            memberchange(val) {
+                if (val !== '') {
+                    this.formmodel.member_nickname = this.memberusers.find((item) => {
+                        return item.member_id === val
+                    }).uname
+                }
+            },
+            /** 处理搜索 */
+            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()
+            },
+            formatterStasus(param) {
+                if(param.value) {
+                    return '<span style="color:green">成功</span>'
+                } else if(param.value == false) {
+                    return '<span style="color:red">失败</span>'
+                } else if(param.value == null) {
+                    return '<span style="color:orange">暂未操作</span>'
+                }
+            },
+            filterModifed(param) {
+                console.log('filterModifed===',param)
+                let model = param.api.getFilterModel()
+                console.log('model', JSON.stringify(model))
+                this.params.filter = JSON.stringify(model)
+                this.getList()
+            },
+            gridSortChange(param) {
+                console.log('gridSortChange===', 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)
+            },
+            formatterDate(params) {
+                return unixToDate(params.value)
+            }
+        }
+    }
+</script>
+
+<style type="text/scss" scoped>
+    /deep/ div.toolbar {
+        height: 70px;
+        padding: 20px 0;
+    }
+
+    .el-input-number, .el-select {
+        width: 100%
+    }
+
+    .inner-toolbar {
+        display: flex;
+        flex-direction: row;
+        flex-wrap: nowrap;
+        width: 100%;
+        justify-content: space-between;
+        align-items: center;
+    }
+</style>