Browse Source

优化页面编辑,以及添加权限控制

xiaochan 2 năm trước cách đây
mục cha
commit
713c2af70f

+ 27 - 0
src/api/reports/report-query-center.ts

@@ -1,4 +1,5 @@
 import request from '../../utils/request'
+import {AxiosPromise} from "axios";
 
 export interface ReportForms {
     id: string
@@ -43,3 +44,29 @@ export function getReportTree(): Promise<ReportForms[]> {
         method: 'get'
     })
 }
+
+export function updateParentById(id: string, parentId: string) {
+    return request({
+        url: '/reportQueryCenter/updateParentById',
+        method: 'get',
+        params: {id, parentId}
+    })
+}
+
+
+export function getRulesByCode(userCode: string): Promise<string[]> {
+    //@ts-ignore
+    return request({
+        url: '/reportQueryCenter/getRulesByCode',
+        method: 'get',
+        params: {userCode}
+    })
+}
+
+export function saveThePersonRoleCode(data: any) {
+    return request({
+        url: '/reportQueryCenter/saveThePersonRoleCode',
+        method: 'post',
+        data
+    })
+}

+ 17 - 4
src/components/query-components/XcQuery.vue

@@ -51,16 +51,20 @@ import moment from 'moment';
 import {executeSQL, extractQueryData, pageHelpMitt} from "./page-help";
 import XEUtils from "xe-utils";
 import {ExcelName} from '@/utils/ExportExcel'
+import sleep from "@/utils/sleep";
 
 const props = defineProps<{
   pageJson: componentType,
-  currentIndex?: number
+  currentIndex?: number,
+  executeSql?: string
 }>()
 
 const emits = defineEmits([
   'submit',
   'itemClick',
   'update:currentIndex',
+  'update:executeSql',
+  'clickQuery'
 ])
 
 const formRef = ref<FormInstance | null>(null)
@@ -75,6 +79,7 @@ const propsCurrentIndex = useVModel(props, 'currentIndex', emits)
 const divRefSize = useElementSize(divRef)
 
 const submit = async (reset = false) => {
+  emits('clickQuery')
   await formRef.value.validate()
 
   if (reset) {
@@ -86,14 +91,22 @@ const submit = async (reset = false) => {
   let queryData = extractQueryData(pageJson.value);
 
   pageJson.value.tableConfig.loading = true
+
+  function sql(val) {
+    emits('update:executeSql', val)
+  }
+
   try {
-    let res = await executeSQL(pageJson.value.submitQuerySql, queryData) as any[]
+    let res = await executeSQL(pageJson.value.submitQuerySql, queryData, (sql)) as any[]
     pageJson.value.tableConfig.data = res
     pageJson.value.pageConfig.total = res.length
-  } catch {
-    pageJson.value.tableConfig.loading = false
+  } finally {
+    sleep(500).then(() => {
+      pageJson.value.tableConfig.loading = false
+    })
   }
 
+
   // 动态执行函数,暂时先废弃
   // let func = new Function('queryData', 'config', 'axios', 'return ' + deleteFunction(pageJson.value.submitEvent))
   // func()(queryData, pageJson.value, axios)

+ 3 - 9
src/components/query-components/page-help.ts

@@ -254,17 +254,11 @@ export function generateRandomString(length: number): string {
 
 export const pageHelpMitt = new Mitt()
 
-export const interFaced = {
-    创智中台: 'data.rows',
-    工作集成平台: 'data.data',
-    其他: ''
-}
-
-export const executeSQL = (sqlStr: string, data: any) => {
+export const executeSQL = (sqlStr: string, data: any, cb?: (sql: string) => void) => {
     let sql: string = convertSql(sqlStr, data)
     let res: AxiosPromise<any>
-    if (isDev) {
-        console.log('运行的sql\n', sql)
+    if (cb) {
+        cb(sql)
     }
     try {
         res = service({

+ 0 - 1
src/components/xiao-chan/combo-grid/XcComboGridV2.vue

@@ -226,7 +226,6 @@ const handleBlur = () => {
       inputData.value = <string>props.modelValue;
     }
   }
-
 }
 
 const keyUp = () => {

+ 1 - 1
src/components/zhu-yuan-yi-sheng/public/PatientList.vue

@@ -63,7 +63,7 @@
                            :name="['consultPhysician', 'consultPhysicianName']"
         />
       </el-form-item>
-      <el-form-item label="主任医生:">
+      <el-form-item label="主任/副主任:">
         <select-staff-code v-model="thirdLevelDoctorSetting.data"
                            :name="['deptDirector', 'deptDirectorName']"/>
       </el-form-item>

+ 1 - 1
src/views/hospitalization/zhu-yuan-yi-sheng/level3-doctor-setup/Level3DoctorSetup.vue

@@ -107,7 +107,7 @@ onMounted(() => {
                           code="consultPhysician"/>
           </template>
         </el-table-column>
-        <el-table-column prop="deptDirectorName" label="主任医生" width="120">
+        <el-table-column prop="deptDirectorName" label="主任/副主任" width="120">
           <template #default="scope">
             <xc-personnel v-model="scope.row"
                           @change="changeData(scope.row)"

+ 7 - 0
src/views/utilities/page-editor-help/PageEditorHelp.vue

@@ -15,12 +15,15 @@ import {VXETable} from 'vxe-table'
 import PageTree from "@/views/utilities/page-editor-help/components/PageTree.vue";
 import {ReportForms, updateReportQueryCenter} from "@/api/reports/report-query-center";
 import {ElMessageBox} from "element-plus";
+import RulsUser from "@/views/utilities/page-editor-help/components/RulsUser.vue";
+import {executeSql} from "@/views/utilities/page-editor-help/public-data";
 
 const activeNames = ref(['1', '2', '3'])
 const infoRef = ref()
 const tabs = ref('table')
 const asideTabs = ref('tree')
 
+
 const addEl = (val: headerType) => {
   let key = generateRandomString(5)
   let data = val
@@ -38,6 +41,7 @@ const theCurrentComponent = ref(-1)
 const itemClick = (data: headerType, index) => {
   infoRef.value.editComp(data)
   theCurrentComponent.value = index
+  tabs.value = 'subassembly'
 }
 
 /**
@@ -180,6 +184,7 @@ onMounted(() => {
             <el-button type="primary" @click="saveConfiguration" v-if="currentData.id">保存</el-button>
             <el-button icon="RefreshLeft" @click="formReset" text>重置</el-button>
             <el-button text @click="exportConfiguration">导出配置</el-button>
+            <RulsUser/>
           </div>
           <div style="display: flex; overflow-y: auto" :style="{height: height -50  - 30 +'px'}"
                v-if="currentData.id">
@@ -187,6 +192,8 @@ onMounted(() => {
                  v-if="pageJson.isShow"
                  :style="{width: width - 320 + 'px'}">
               <xc-query v-model:page-json="pageJson"
+                        v-model:execute-sql="executeSql"
+                        @click-query="tabs = 'form' "
                         v-model:current-index="theCurrentComponent"
                         @item-click="itemClick"/>
               <xc-table :page-json="pageJson"/>

+ 2 - 2
src/views/utilities/page-editor-help/components/PageEditorInfo.vue

@@ -1,8 +1,8 @@
 <script setup lang="ts">
 import {defineExpose, ref, h, nextTick, onMounted} from 'vue'
-import {elComponent, interFaced, pageHelpMitt} from "../../../../components/query-components/page-help";
+import {elComponent, pageHelpMitt} from "@/components/query-components/page-help";
 import {useVModel} from "@vueuse/core";
-import {bindType, componentType, CompType, headerType} from "../../../../components/query-components/page-help-type";
+import {bindType, componentType, CompType, headerType} from "@/components/query-components/page-help-type";
 import XEUtils from "xe-utils";
 import {ElInput, ElOption, ElSelect, ElSwitch} from 'element-plus'
 import * as el from 'element-plus'

+ 9 - 1
src/views/utilities/page-editor-help/components/PageForm.vue

@@ -9,6 +9,7 @@ import TsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
 import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
 import SqlEdit from "@/views/utilities/page-editor-help/components/SqlEdit.vue";
 import {ElTag} from "element-plus";
+import {executeSql} from "@/views/utilities/page-editor-help/public-data";
 
 const {pageJson} = defineProps<{
   pageJson: componentType
@@ -65,12 +66,19 @@ const submit = () => {
     </el-collapse>
   </el-form>
 
-  <div v-if="pageJson.tableConfig.data.length > 0">
+  <div v-if="pageJson.tableConfig.data.length > 0" style="max-height: 200px ; overflow:auto;">
     <el-tag type="warning" effect="dark">默认展示第一条数据</el-tag>
     <JsonViewer :value="pageJson.tableConfig.data[0]"
                 style="height: 100%" copyable :expandDepth="3"/>
   </div>
 
+  <div>
+    <el-divider/>
+    <el-tag type="warning" effect="dark">执行sql语句</el-tag>
+    <el-input type="textarea" :rows="8" v-model="executeSql"/>
+  </div>
+
+
   <js-edit-dialog v-if="dialogConfig.dialog"
                   :page-json="pageJson"
                   v-model:submit-event="pageJson.submitEvent"

+ 26 - 3
src/views/utilities/page-editor-help/components/PageTree.vue

@@ -1,19 +1,26 @@
 <script setup lang="ts">
 import {onMounted, ref} from 'vue'
-import {ElMessageBox} from "element-plus";
+import {ElMessageBox, ElTree} from "element-plus";
 import {
   addReportQueryCenter,
   delReportQueryCenterById,
   getReportTree,
-  ReportForms
+  ReportForms, updateParentById
 } from "@/api/reports/report-query-center";
 import {componentType} from "@/components/query-components/page-help-type";
+import {dataTree} from '../public-data'
+import type Node from 'element-plus/es/components/tree/src/model/node'
+import type {DragEvents} from 'element-plus/es/components/tree/src/model/useDragNode'
+import type {
+  NodeDropType,
+} from 'element-plus/es/components/tree/src/tree.type'
+import {useCompRef} from "@/utils/useCompRef";
 
 const props = defineProps<{
   currentPage: (data: ReportForms) => void
 }>()
 
-const dataTree = ref<ReportForms[]>([])
+const treeRef = useCompRef(ElTree)
 
 const contextmenu = (event: Event, data: ReportForms) => {
   console.log(event, data)
@@ -130,6 +137,18 @@ const delReportQueryCenterClick = async (data: ReportForms) => {
   })
 }
 
+const allowDrop = (moveNode, inNode, type) => {
+  return !(inNode.data.type === 0 && type === 'inner');
+}
+
+const handleDragEnd = (draggingNode: Node, dropNode: Node, dropType: NodeDropType, ev: DragEvents) => {
+  if (dropType === 'inner') {
+    updateParentById(draggingNode.data.id, dropNode.data.id)
+  } else {
+    updateParentById(draggingNode.data.id, dropNode.data.parentId || '')
+  }
+}
+
 onMounted(() => {
   getReportTreeFunc()
 })
@@ -140,9 +159,13 @@ onMounted(() => {
   <el-button @click="addPageClick">新增文件夹</el-button>
   <el-button @click="addFile">新增文件</el-button>
   <el-tree :data="dataTree"
+           ref="treeRef"
            @node-click="nodeClick"
            @node-contextmenu="contextmenu"
            highlight-current
+           draggable
+           :allow-drop="allowDrop"
+           @node-drag-end="handleDragEnd"
            default-expand-all>
     <template #default="{node,data}">
       <el-icon>

+ 79 - 0
src/views/utilities/page-editor-help/components/RulsUser.vue

@@ -0,0 +1,79 @@
+<script setup lang="ts">
+import {onMounted, ref} from "vue";
+import {dataTree} from "@/views/utilities/page-editor-help/public-data";
+import XcComboGridV2 from "@/components/xiao-chan/combo-grid/XcComboGridV2.vue";
+import {getRenYuan} from "@/api/public-api";
+import {useCompRef} from "@/utils/useCompRef";
+import {ElTree} from "element-plus";
+import {getRulesByCode, saveThePersonRoleCode} from "@/api/reports/report-query-center";
+
+const dialog = ref(false)
+const personnelList = ref([])
+const treeRef = useCompRef(ElTree)
+const userCode = ref<string>('')
+
+const personnel = [
+  {label: '编码', prop: 'code', width: 46},
+  {label: '名称', prop: 'name', width: 56},
+  {label: '科室', prop: 'deptName', width: 92},
+  {label: '级别', prop: 'empTitName', width: 105},
+]
+
+const rowClick = (row) => {
+  getRulesByCode(row.code).then((res) => {
+    treeRef.value.setCheckedKeys(res)
+  })
+}
+
+const preserve = () => {
+  const halfCheckKeys = treeRef.value.getHalfCheckedKeys()
+  const checkedKeys = treeRef.value.getCheckedKeys()
+  let temp = [...checkedKeys, ...halfCheckKeys]
+  saveThePersonRoleCode({userCode: userCode.value, list: temp})
+}
+
+onMounted(() => {
+  getRenYuan('').then(res => {
+    personnelList.value = res
+  })
+})
+
+</script>
+
+<template>
+  <el-button @click="dialog = true">权限设置</el-button>
+  <el-dialog v-model="dialog" title="权限配置">
+    <div style="max-height: 400px ; overflow: auto">
+      人员:
+      <xc-combo-grid-v2 v-model="userCode"
+                        filterable
+                        select
+                        @rowClick="rowClick"
+                        clearable
+                        :table-header="personnel"
+                        :data="personnelList"/>
+      <el-divider direction="vertical"/>
+      <el-button @click="preserve">保存</el-button>
+      <el-divider/>
+      <el-tree :data="dataTree"
+               ref="treeRef"
+               show-checkbox
+               node-key="id"
+               highlight-current
+               default-expand-all>
+        <template #default="{node,data}">
+          <el-icon>
+            <Document v-if="data.type === 0"/>
+            <Folder v-else/>
+          </el-icon>
+          {{ data.name }}
+        </template>
+      </el-tree>
+    </div>
+
+  </el-dialog>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 5 - 0
src/views/utilities/page-editor-help/public-data.ts

@@ -0,0 +1,5 @@
+import {ref} from "vue";
+import {ReportForms} from "../../../api/reports/report-query-center";
+
+export const dataTree = ref<ReportForms[]>([])
+export const executeSql = ref<string>('')